千家信息网

Pytorch怎么实现简单自定义网络层

发表于:2024-10-19 作者:千家信息网编辑
千家信息网最后更新 2024年10月19日,本篇内容介绍了"Pytorch怎么实现简单自定义网络层"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
千家信息网最后更新 2024年10月19日Pytorch怎么实现简单自定义网络层

本篇内容介绍了"Pytorch怎么实现简单自定义网络层"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、不带参数的层

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

import torchimport torch.nn.functional as Ffrom torch import nnclass 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=)

二、带参数的层

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

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

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 modelsmodel = 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怎么实现简单自定义网络层"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0