日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

面向对象方法使用gluon

發(fā)布時(shí)間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象方法使用gluon 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、面向過程與面向?qū)ο蟮膬?yōu)缺點(diǎn)

面向過程使用mxnet,就是使用gluon封裝好的對(duì)象,不加改動(dòng)的表達(dá)機(jī)器學(xué)習(xí)的邏輯過程,其特點(diǎn)是方便、快捷,缺點(diǎn)是不夠靈活(雖然可以應(yīng)對(duì)90%以上的問題了),面向?qū)ο蠡诶^承、多態(tài)的性質(zhì),對(duì)原有的gluon類進(jìn)行了繼承重寫,并在不改變應(yīng)用接口的情況下(基于多態(tài)),靈活的改寫原有類,使之更加符合用戶特殊需求。本文從自定義模型、自定義層、自定義初始化三個(gè)方面說明gluon的繼承重寫,這三個(gè)基本操作足夠用戶隨心所欲的創(chuàng)造模型了。

二、自定義模型

1、定義靜態(tài)模型

靜態(tài)模型就是實(shí)例化后模型的結(jié)構(gòu)就不能隨便改變了,其代碼如下:

from mxnet import nd from mxnet.gluon import nnclass MLP(nn.Block):# 聲明帶有模型參數(shù)的層,這里聲明了兩個(gè)全連接層def __init__(self, **kwargs):# 調(diào)用MLP父類Block的構(gòu)造函數(shù)來(lái)進(jìn)行必要的初始化。這樣在構(gòu)造實(shí)例時(shí)還可以指定其他函數(shù)# 參數(shù),如“模型參數(shù)的訪問、初始化和共享”一節(jié)將介紹的模型參數(shù)paramssuper(MLP, self).__init__(**kwargs)self.hidden = nn.Dense(256, activation='relu') # 隱藏層self.output = nn.Dense(10) # 輸出層# 定義模型的前向計(jì)算,即如何根據(jù)輸入x計(jì)算返回所需要的模型輸出def forward(self, x):return self.output(self.hidden(x))X = nd.random.uniform(shape=(2, 20)) net = MLP() net.initialize() net(X)

2、定義動(dòng)態(tài)模型

動(dòng)態(tài)模型就是在實(shí)例化以后,后續(xù)可以根據(jù)需要隨時(shí)修改模型結(jié)構(gòu),下面只定義一個(gè)增加網(wǎng)絡(luò)層的功能。

class MySequential(nn.Block):def __init__(self, **kwargs):super(MySequential, self).__init__(**kwargs)def add(self, block):# block是一個(gè)Block子類實(shí)例,假設(shè)它有一個(gè)獨(dú)一無(wú)二的名字。我們將它保存在Block類的# 成員變量_children里,其類型是OrderedDict。當(dāng)MySequential實(shí)例調(diào)用# initialize函數(shù)時(shí),系統(tǒng)會(huì)自動(dòng)對(duì)_children里所有成員初始化self._children[block.name] = blockdef forward(self, x):# OrderedDict保證會(huì)按照成員添加時(shí)的順序遍歷成員for block in self._children.values():x = block(x)return xnet = MySequential() net.add(nn.Dense(256, activation='relu')) net.add(nn.Dense(10)) net.initialize() net(X)

三、定義tensor流

tensor流就是tensor之間是怎樣運(yùn)算的,gluon默認(rèn)的tensor流是簡(jiǎn)單的tensor乘法運(yùn)算,自定義就對(duì)tengsor流使用if判斷、for循環(huán)手段,構(gòu)造出更加復(fù)雜的tensor流,這一點(diǎn)在后面的卷積網(wǎng)絡(luò)、循環(huán)網(wǎng)絡(luò)中頻繁使用。

class FancyMLP(nn.Block):def __init__(self, **kwargs):super(FancyMLP, self).__init__(**kwargs)# 使用get_constant創(chuàng)建的隨機(jī)權(quán)重參數(shù)不會(huì)在訓(xùn)練中被迭代(即常數(shù)參數(shù))self.rand_weight = self.params.get_constant('rand_weight', nd.random.uniform(shape=(20, 20)))self.dense = nn.Dense(20, activation='relu')def forward(self, x):x = self.dense(x)# 使用創(chuàng)建的常數(shù)參數(shù),以及NDArray的relu函數(shù)和dot函數(shù)x = nd.relu(nd.dot(x, self.rand_weight.data()) + 1)# 復(fù)用全連接層。等價(jià)于兩個(gè)全連接層共享參數(shù)x = self.dense(x)# 控制流,這里我們需要調(diào)用asscalar函數(shù)來(lái)返回標(biāo)量進(jìn)行比較while x.norm().asscalar() > 1:x /= 2if x.norm().asscalar() < 0.8:x *= 10return x.sum()net = FancyMLP() net.initialize() net(X)

說明

  • 以上三個(gè)方法是可以結(jié)合起來(lái)使用的,基于這三點(diǎn)用戶可以使用gluon構(gòu)造出各種卷積、循環(huán)網(wǎng)絡(luò)。
  • 以上三種繼承方式中,forward函數(shù)必須定義重寫,否則出現(xiàn)下面的錯(cuò)誤,就是沒找到forward propagation。
  • print(net(X)) out = self.forward(*args) raise NotImplementedError NotImplementedError

    三、自定義層

    層與模型沒有本質(zhì)區(qū)別,從語(yǔ)言角度講是一樣的,二者的數(shù)據(jù)結(jié)構(gòu)都是tensor+forward,只是用途不同而已。層可以理解為整個(gè)模型的一層或一部分,是一段網(wǎng)絡(luò),層的作用用來(lái)構(gòu)造模型。

    1、gluon的層

    Dense層:forward = (X * weight + bias).relu()

    g_layer = nn.Dense(2) g_layer.initialize(init=init.One()) X = nd.array([1, 2, 3, 4]).reshape((1, 4)) y = g_layer(X) print('weight of g_layer:', g_layer.weight.data()) print('bias of g_layer:', g_layer.bias.data()) print('X:', X) print('g_layer(X):', y) print('structure of g_layer:', g_layer)""" # output weight of g_layer: [[1. 1. 1. 1.][1. 1. 1. 1.]] <NDArray 2x4 @cpu(0)> bias of g_layer: [0. 0.] <NDArray 2 @cpu(0)> X: [[1. 2. 3. 4.]] <NDArray 1x4 @cpu(0)> g_layer(X): [[10. 10.]] <NDArray 1x2 @cpu(0)> structure of g_layer: Dense(4 -> 2, linear) """

    說明:

  • 再次強(qiáng)調(diào)一遍,層和模型的要素是tensor + forward,上面的g_layer是gluon默認(rèn)的forward,即進(jìn)行簡(jiǎn)單的乘法運(yùn)算(X * tensor);
  • 因?yàn)樯厦娴膶訌哪P偷慕嵌瓤粗挥幸粋€(gè)層,所以查看參數(shù)的時(shí)候使用g_layer.weight.data(),而不是g_layer[0].weight.data();
  • 2、自定義無(wú)參數(shù)層

    from mxnet import gluon, nd from mxnet.gluon import nnclass CenteredLayer(nn.Block):def __init__(self, **kwargs):super(CenteredLayer, self).__init__(**kwargs)def forward(self, x):return x - x.mean() layer = CenteredLayer() layer(nd.array([1, 2, 3, 4, 5]))

    說明: 與上面的g_layer沒有區(qū)別,都是tensor+forward,這里layer.weight.data()就會(huì)報(bào)錯(cuò),因?yàn)槭?個(gè)層;

    3、自定義含參數(shù)層

    自定義的層的意思是tensor也要自定義,tensor就是weight + bias;

    class MyDense(nn.Block):def __init__(self, units, in_units, **kwargs):super(MyDense, self).__init__(**kwargs)self.weight1 = self.params.get('haha_weight', shape=(in_units, units))self.bias1 = self.params.get('haha_bias', shape=(units,))def forward(self, x):linear = nd.dot(x, self.weight1.data()) + self.bias1.data()return nd.relu(linear)if __name__ == '__main__':dense = MyDense(units=3, in_units=5)dense.initialize()dense(nd.random.uniform(shape=(2, 5)))print(dense.weight1.data()[0])""" [0.0068339 0.01299825 0.0301265 ] <NDArray 3 @cpu(0)> """

    說明:從這個(gè)代碼中可以看出一個(gè)層的本質(zhì)就是一段網(wǎng)絡(luò);

    4、層的應(yīng)用

    net = nn.Sequential() net.add(MyDense(8, in_units=64),MyDense(1, in_units=8)) net.initialize() y = net(nd.random.uniform(shape=(2, 64))) print('self_define tensor:', net[0].weight1.data()[0])""" self_define tensor: [0.0068339 0.01299825 0.0301265 0.04819721 0.01438687 0.050112390.00628365 0.04861524] <NDArray 8 @cpu(0)> """

    四、自定義初始化

    1、_init_weight在做什么?

    # -*- coding: utf-8 -*- from mxnet import init, nd from mxnet.gluon import nnclass MyInit(init.Initializer):def _init_weight(self, name, data):print('Init', name, data.shape)if __name__ == '__main__':net = nn.Sequential()net.add(nn.Dense(256, activation='relu'),nn.Dense(256, activation='relu'),nn.Dense(10))net.initialize(init=MyInit())X = nd.random.uniform(shape=(2, 20))print('---------1---------')Y = net(X)print('---------2---------')net.initialize(init=MyInit(), force_reinit=True)""" # output ---------1--------- Init dense0_weight (256, 20) Init dense1_weight (256, 256) Init dense2_weight (10, 256) ---------2--------- Init dense0_weight (256, 20) Init dense1_weight (256, 256) Init dense2_weight (10, 256) """

    2、怎么使用_init_weight自定義初始化?

    class MyInit(init.Initializer):def _init_weight(self, name, data):print('Init', name, data.shape)data[:] = nd.random.uniform(low=-10, high=10, shape=data.shape)data *= data.abs() >= 5net.initialize(MyInit(), force_reinit=True) net[0].weight.data()[0]

    說明:上面僅說明對(duì)weight初始化,gulon也提供了_init_bias,但是最后還是強(qiáng)制bias=0,也就是重寫的_init_bias沒有被調(diào)用,從機(jī)器學(xué)習(xí)的角度講,bias一般初始化為0;

    總結(jié)

    以上是生活随笔為你收集整理的面向对象方法使用gluon的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 依人在线视频 | 国产日韩一区二区三区在线观看 | 成人av男人的天堂 | 欧美精品video | 亚洲区国产区 | 最好看的日本字幕mv视频大全 | 精品人妻无码一区 | 婷婷在线免费 | 成人午夜激情 | 清冷学长被爆c躁到高潮失禁 | 中文字幕丰满乱子伦无码专区 | 日穴| 亚洲伦理中文字幕 | 天天视频入口 | www.xxx在线观看 | 欧美日韩国产传媒 | 国产原创91 | 精品一区二区电影 | 动漫涩涩免费网站在线看 | 亚洲国产精品久久久久久久 | 一级高清视频 | 欧美色噜噜 | 久久久久国产一区 | 高清乱码毛片入口 | 日韩精品伦理 | 亚洲午夜久久久久久久久久久 | 中文字幕一区二区三区在线播放 | 边添小泬边狠狠躁视频 | julia一区二区中文久久97 | 亚洲中文字幕无码一区 | 九九资源网 | 久久久久久综合网 | 天堂久久精品 | 亚洲看片 | 亚洲国产成人精品女人久久 | 欧美性欧美zzzzzzzzz | 天天影视插插插 | 国产麻豆免费视频 | 嫩草嫩草嫩草嫩草 | 亚洲综合欧美日韩 | 欧美一区二区三区免费 | 久久免费看片 | 亚洲aaaa级特黄毛片 | 国产免费一区二区三区 | 色偷偷五月天 | 91无限观看 | 亚洲日本欧美在线 | 不卡在线一区 | 亚洲AV无码久久精品浪潮 | 色婷婷九月 | 欧美区一区二区 | 一级片视频在线观看 | 日韩大尺度在线观看 | 亚洲性事 | 欧美日韩一 | www.久久久精品| 亚洲av无码不卡 | 中文字幕一区二区三区久久久 | 精品在线视频一区二区三区 | 久久夜夜夜 | 日韩国产精品一区二区 | 无码人妻丰满熟妇区毛片蜜桃精品 | 日韩少妇内射免费播放 | 中文写幕一区二区三区免费观成熟 | 一区二区三区国产在线观看 | 韩国主播青草55部完整 | 亚洲精品日韩综合观看成人91 | 亚洲精品二区三区 | av综合站| 欧美久久久久久久久久 | 人人干人人模 | 一级黄色播放 | 亚洲国产精品无码久久 | 国产人妻大战黑人20p | 人人爽视频 | 久久国产精品久久精品国产 | 男人免费网站 | 黄色精品视频在线观看 | 无码一区二区三区免费 | 日本高清xxx | 岛国av噜噜噜久久久狠狠av | 亚洲欧美日韩高清 | www.99re.| 亚洲欧美天堂网 | 午夜国产一级 | 国产综合久久久 | 上原亚衣在线观看 | 四季av中文字幕 | 欧美 变态 另类 人妖 | 国产精品夜夜 | 亚洲美女在线观看 | 午夜久久福利 | 成人精品三级av在线看 | 国语对白做受欧美 | 国产亚洲视频在线 | 女性生殖扒开酷刑vk | 色综合综合网 | 精品国产一二区 | 国语精品 |