动手学深度学习(pytorch)学习记录20-自定义层[学习记录]

在深度学习中,自定义层是指开发者根据特定需求编写的神经网络层,而不是使用深度学习框架(如PyTorch、TensorFlow等)提供的现成层。自定义层可以让模型更加灵活,以适应特定的任务或数据集。

没有参数的自定义层

下面的CenteredLayer类要从其输入中减去均值。 要构建它,只需继承基础层类并实现前向传播功能。

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])))
print(layer(torch.FloatTensor([6, 6, 6, 6, 6])))
tensor([-2., -1.,  0.,  1.,  2.])
tensor([0., 0., 0., 0., 0.])

自定义的层也可以作为组件合并到其他模型中

net = nn.Sequential(nn.Linear(8, 128), CenteredLayer())
print(net)
Sequential(
  (0): Linear(in_features=8, out_features=128, bias=True)
  (1): CenteredLayer()
)

喂点数据看看,一般来说一堆数据减去均值后再求均值得到的数应该接近0

Y = net(torch.rand(4, 8))
Y.mean()
tensor(3.7253e-09, grad_fn=<MeanBackward0>)

带参数的层

尝试实现自定义版本的全连接层。
该层需要两个参数,一个用于表示权重,另一个用于表示偏置项。 在此实现中,使用修正线性单元作为激活函数。 该层需要输入参数:in_units和units,分别表示输入数和输出数。

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)

实例化MyLinear类并访问其模型参数

linear = MyLinear(5, 3)
linear.weight
Parameter containing:
tensor([[ 0.0840,  0.6678,  0.5039],
        [ 0.7249,  1.0962, -0.0303],
        [-2.6082, -0.2321,  0.4427],
        [-0.6575,  0.5711, -0.9156],
        [-1.1265,  0.0371,  0.9133]], requires_grad=True)

使用自定义层直接执行前向传播计算

linear(torch.rand(2, 5))
tensor([[0.0000, 1.0875, 0.4254],
        [0.0000, 0.0000, 0.6443]])

像使用内置的全连接层一样使用自定义层去构建模型

net = nn.Sequential(MyLinear(128, 32), MyLinear(32, 4))
net(torch.rand(2, 128))
tensor([[49.7854, 35.0184,  0.0000,  0.0000],
        [49.9021,  0.3953,  9.3399,  9.0088]])

封面图片来源

欢迎点击我的主页查看更多文章。
本人学习地址https://zh-v2.d2l.ai/
恳请大佬批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

walfar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值