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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

(pytorch-深度学习系列)pytorch实现自定义网络层,并自设定前向传播路径-学习笔记

發(fā)布時(shí)間:2024/8/23 pytorch 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (pytorch-深度学习系列)pytorch实现自定义网络层,并自设定前向传播路径-学习笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

pytorch實(shí)現(xiàn)自定義網(wǎng)絡(luò)層,并自設(shè)定前向傳播路徑-學(xué)習(xí)筆記

1. 不包含模型參數(shù)的自定義網(wǎng)絡(luò)層

首先我們自定義一個(gè)網(wǎng)絡(luò)層,
定義一個(gè)網(wǎng)絡(luò)層,使其不包含模型參數(shù),并在forward()函數(shù)中進(jìn)行運(yùn)算:

import torch from torch import nnclass non_param_layer(nn.Module):def __init__(self, **kwargs):super(non_param_layer, self).__init__(**kwargs)def forward(self, x):return x - x.mean()

這個(gè)層中沒有模型參數(shù),只在forward中定義了計(jì)算:減去數(shù)據(jù)平均值

實(shí)例化該層并進(jìn)行前向計(jì)算:

layer = non_param_layer() layer(torch.tensor([1, 2, 3, 4, 5], dtype=troch.float))

輸出:

tensor([-2., -1., 0., 1., 2.])

我們將該層網(wǎng)絡(luò)加入網(wǎng)絡(luò)中:

net = nn.Sequential(nn.Linear(8, 128), non_param_layer())

進(jìn)行前向計(jì)算并輸出自定義層的輸出的均值:

y = net(torch.rand(4, 8)) y.mean().item() # 0

因?yàn)槲覀冏远x的網(wǎng)絡(luò)層所做的操作是:,每個(gè)輸入減去所有數(shù)據(jù)的均值,所以其輸出的各個(gè)數(shù)值取均值的結(jié)果為0

2. 含有模型參數(shù)的自定義層

與上面一節(jié)不同,我們要自定義一個(gè)含有模型參數(shù)的網(wǎng)絡(luò)層:
之前的blog有講過構(gòu)造深度學(xué)習(xí)模型有很多種方法,其中,使用ParameterList和ParameterDict定以模型比較特別,接下來我們使用這兩種方式自定義網(wǎng)絡(luò)層。

class my_dense(nn.Module):def __init__(self):super(my_dense, self).__init__()self.params = nn.ParameterList([nn.Parameter(torch.randn(4, 4)) for i in range(3)])self.params.append(nn.Parameter(torch.randn(4, 1)))def forward(self, x):for i in range(len(self.params)):x = torch.mm(x, self.params[i])return x net = my_dense() print(net)

輸出:

MyDense((params): ParameterList((0): Parameter containing: [torch.FloatTensor of size 4x4](1): Parameter containing: [torch.FloatTensor of size 4x4](2): Parameter containing: [torch.FloatTensor of size 4x4](3): Parameter containing: [torch.FloatTensor of size 4x1]) )

接下來使用ParameterDict網(wǎng)絡(luò)模型并且自定義網(wǎng)絡(luò)傳播路徑

class dict_dense(nn.Module):def __init__(self):super(dict_dense, self).__init()self.params = nn.ParameterDict({"liner1" : nn.Parameter(troch.randn(4, 4))"liner2" : nn.Parameter(torch.randn(4, 1))})self.params.update({"liner3 : nn.Parameter(torch.randn(4, 2))"})def forward(self, x, choice="liner1"):return torch.mm(x, self.params[choice])net = dict_dense() pritn(net)

輸出:

MyDictDense((params): ParameterDict((linear1): Parameter containing: [torch.FloatTensor of size 4x4](linear2): Parameter containing: [torch.FloatTensor of size 4x1](linear3): Parameter containing: [torch.FloatTensor of size 4x2]) )

然后可以自己指定網(wǎng)絡(luò)訓(xùn)練的傳播路徑

x = torch.ones(1, 4) print(net(x, "liner1"))

同時(shí),我們還可以使用Sequential將我們自定義的網(wǎng)絡(luò)層加入到網(wǎng)絡(luò)中:

mix_net = nn.Sequential(dict_dense(),my_dense() , )

總結(jié)

以上是生活随笔為你收集整理的(pytorch-深度学习系列)pytorch实现自定义网络层,并自设定前向传播路径-学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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