简介:
神经网络的灵活性由自定义层实现。通过组合不同的层设计适用于各种任务的框架。或者自己创建一个尚不存在的层时,需要构建自定义层。
1、不带参数的层
- 构造一个没有任何参数的自定义层。
# 构造一个没有任何参数的自定义层 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() # 输入减均值,把生成的张量均值变成0 # 向该层提供一些数据,验证它是否能按预期工作。 layer = CenteredLayer() print(layer(torch.FloatTensor([1, 2, 3, 4, 5])))
输出:
tensor([-2., -1., 0., 1., 2.])
- 将自定义层作为一个模块,组合到一个大模型中。
2、带参数的层
3、总结
layer = CenteredLayer()
print(layer(torch.FloatTensor([1, 2, 3, 4, 5])))
#将层作为组件合并到构建更复杂的模型中
net = nn.Sequential(nn.Linear(8, 128), CenteredLayer())#由一个线性层(输入八组拥有128个特征的输入)和一个centeredlayer组成
Y = net(torch.rand(4, 8))#生成4组形状和输入一样的矩阵。它是【0,1)之间的均匀分布。
#randn是返回一个包含从标准正态分布中抽取的随机数张量。
#print(Y)
print(Y.mean())#计算会有些误差
#带参数的层
class MyLinear(nn.Module):
def __init__(self, in_units, units):
super().__init__()
#torch.randn(in_units, units)表示输出一个“输入乘输出大小”的0-1之间随机分布的矩阵,
# 然后把它放入nn.parameter中后
#会把梯度和名字加上
self.weight = nn.Parameter(torch.randn(in_units, units))#调用parameter类就能弄参数。
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)#输入是5组,输出是每组3个,也得输出5组
print(linear.weight)
#使用自定义层直接执行正向传播计算
print(linear(torch.rand(2, 5)))
#使用自定义层构建模型
net = nn.Sequential(MyLinear(64, 8), MyLinear(8, 1))
print(net(torch.rand(2, 64)))#rand的第二个参数要和第一层的输入一样,也就是和“MyLinear(64, 8)”的64一样