Pytorch实现简单自定义网络层的方法_第1页
Pytorch实现简单自定义网络层的方法_第2页
Pytorch实现简单自定义网络层的方法_第3页
Pytorch实现简单自定义网络层的方法_第4页
Pytorch实现简单自定义网络层的方法_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Pytorch实现简单自定义网络层的方法目录前言一、不带参数的层二、带参数的层三、总结四、参考附:pytorch获取网络的层数和每层的名字

前言

Pytorch、Tensoflow等许多深度学习框架集成了大量常见的网络层,为我们搭建神经网络提供了诸多便利。但在实际工作中,因为项目要求、研究需要或者发论文需要等等,大家一般都会需要自己发明一个现在在深度学习框架中还不存在的层。在这些情况下,就必须构建自定义层。

博主在学习了沐神的动手学深度学习这本书之后,学到了许多东西。这里记录一下书中基于Pytorch实现简单自定义网络层的方法,仅供参考。

一、不带参数的层

首先,我们构造一个没有任何参数的自定义层,要构建它,只需继承基础层类并实现前向传播功能。

importtorch

importtorch.nn.functionalasF

fromtorchimportnn

classCenteredLayer(nn.Module):

def__init__(self):

super().__init__()

defforward(self,X):

returnX-X.mean()

输入一些数据,验证一下网络是否能正常工作:

layer=CenteredLayer()

print(layer(torch.FloatTensor([1,2,3,4,5])))

输出结果如下:

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

运行正常,表明网络没有问题。

现在将我们自建的网络层作为组件合并到更复杂的模型中,并输入数据进行验证:

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

Y=net(torch.rand(4,8))

print(Y.mean())#因为模型参数较多,输出也较多,所以这里输出Y的均值,验证模型可运行即可

结果如下:

tensor(-5.5879e-09,grad_fn=MeanBackward0)

二、带参数的层

这里使用内置函数来创建参数,这些函数可以提供一些基本的管理功能,使用更加方便。

这里实现了一个简单的自定义的全连接层,大家可根据需要自行修改即可。

classMyLinear(nn.Module):

def__init__(self,in_units,units):

super().__init__()

self.weight=nn.Parameter(torch.randn(in_units,units))

self.bias=nn.Parameter(torch.randn(units,))

defforward(self,X):

linear=torch.matmul(X,self.weight.data)+self.bias.data

returnF.relu(linear)

接下来实例化类并访问其模型参数:

linear=MyLinear(5,3)

print(linear.weight)

结果如下:

Parametercontaining:

tensor([[-0.3708,1.2196,1.3658],

[0.4914,-0.2487,-0.9602],

[1.8458,0.3016,-0.3956],

[0.0616,-0.3942,1.6172],

[0.7839,0.6693,-0.8890]],requires_grad=True)

而后输入一些数据,查看模型输出结果:

print(linear(torch.rand(2,5)))

#结果如下

tensor([[1.2394,0.0000,0.0000],

[1.3514,0.0968,0.6667]])

我们还可以使用自定义层构建模型,使用方法与使用内置的全连接层相同。

net=nn.Sequential(MyLinear(64,8),MyLinear(8,1))

print(net(torch.rand(2,64)))

#结果如下

tensor([[4.1416],

[0.2567]])

三、总结

我们可以通过基本层类设计自定义层。这允许我们定义灵活的新层,其行为与深度学习框架中的任何现有层不同。

在自定义层定义完成后,我们就可以在任意环境和网络架构中调用该自定义层。

层可以有局部参数,这些参数可以通过内置函数创建。

四、参考

《动手学深度学习》动手学深度学习2.0.0-beta0documentation

https://zh-v2.d2l.ai/

附:pytorch获取网络的层数和每层的名字

#创建自己的网络

importmodels

model=models.__dict__["resnet50"](pretrained=True)

forindex,(name,param)inenumerate(d_parameters()):

print(str(index)+""+name)

结果如下:

0conv1.weight

1bn1.weight

2bn1.bias

3layer1.0.conv1.weight

4layer1.0.bn1.we

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论