Pytorch实现简单自定义网络层的方法

 更新时间:2022年05月20日 10:07:15   作者:ting_qifengl  
这篇文章主要给大家介绍了关于Pytorch实现简单自定义网络层的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

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

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

一、不带参数的层

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

import torch
import torch.nn.functional as F
from torch import nn
class CenteredLayer(nn.Module):
    def __init__(self):
        super().__init__()
 
    def forward(self, X):
        return X - 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>)

二、带参数的层

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

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

class MyLinear(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,))
    def forward(self, X):
        linear = torch.matmul(X, self.weight.data) + self.bias.data
        return F.relu(linear)

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

linear = MyLinear(5, 3)
print(linear.weight)

结果如下:

Parameter containing:
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-beta0 documentation

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

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

#创建自己的网络
import models
model = models.__dict__["resnet50"](pretrained=True)

for index ,(name, param) in enumerate(model.named_parameters()):
    print( str(index) + " " +name)

结果如下:

0 conv1.weight
1 bn1.weight
2 bn1.bias
3 layer1.0.conv1.weight
4 layer1.0.bn1.weight
5 layer1.0.bn1.bias
6 layer1.0.conv2.weight
7 layer1.0.bn2.weight
8 layer1.0.bn2.bias
9 layer1.0.conv3.weight

到此这篇关于Pytorch实现简单自定义网络层的文章就介绍到这了,更多相关Pytorch自定义网络层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 实现任务管理清单案例

    python 实现任务管理清单案例

    这篇文章主要介绍了python 实现任务管理清单案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python中使用copy模块实现列表(list)拷贝

    Python中使用copy模块实现列表(list)拷贝

    这篇文章主要介绍了Python中使用copy模块实现列表(list)拷贝,本文讲解了简单列表的复制和复杂列表复制的解决方法,需要的朋友可以参考下
    2015-04-04
  • Numpy 数组操作之元素添加、删除和修改的实现

    Numpy 数组操作之元素添加、删除和修改的实现

    本文主要介绍了Numpy 数组操作之元素添加、删除和修改的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • python图像常规操作

    python图像常规操作

    这篇文章主要介绍了python图像常规操作,比较全面,涉及读取和存储,生成缩略图,调整尺寸与旋转,绘制图像轮廓等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Python接口自动化浅析logging日志原理及模块操作流程

    Python接口自动化浅析logging日志原理及模块操作流程

    这篇文章主要为大家介绍了Python接口自动化系列文章浅析logging日志原理及模块操作流程,文中详细说明了为什么需要日志?日志是什么?以及日志用途等基本的原理
    2021-08-08
  • Python open()文件处理使用介绍

    Python open()文件处理使用介绍

    这篇文章主要介绍了Python open()文件处理使用介绍,需要的朋友可以参考下
    2014-11-11
  • Python实现生成日报的示例代码

    Python实现生成日报的示例代码

    这篇文章主要为大家详细介绍了如何利用Python实现生成日报的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • 浅谈pycharm使用及设置方法

    浅谈pycharm使用及设置方法

    这篇文章主要介绍了浅谈pycharm使用及设置方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Python3 hashlib密码散列算法原理详解

    Python3 hashlib密码散列算法原理详解

    这篇文章主要介绍了Python3 hashlib密码散列算法原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python利用yield form实现异步协程爬虫

    Python利用yield form实现异步协程爬虫

    这篇文章主要为大家详细介绍了Python如何利用yield form实现异步协程爬虫。其实这是很古老的用法了,现在大多用的aiohttp库实现,这篇记录仅仅用做个人的协程底层实现的学习,希望对大家有所帮助
    2022-11-11

最新评论