自定义块
nn.Sequential 可以按照顺序执行,将前一个的输出作为后一个的输入,但为了更多功能,需要自定义Module类
# 通过继承nn.Block类来创建自定义类
class MyBlock(nn.Module):
def __init__(self):
#继承父类的构造函数
super().___init__()
self.fc1 = nn.Sequential(Linear(20,64))
self.relu = nn.ReLU()
self.fc2 = nn.Linear(64.10)
def forward(self,X):
X = self.fc1(X)
X = self.relu(X)
X = self.fc2(X)
return X
net = MyBlock()
net(x)
在这里可以对前向传播的过程进行更加精密的控制,以及块的嵌套等
自定义层
与自定义块类似
不带参数的层
class MyLayer(nn.Module):
def __init__(self):
super().___init__()
def forward(self,X):
return X-X.mean()
net = nn.Sequential(nn.Linear(8, 128),MyLayer())
带参数的层
class MyLayer(nn.Module):
def __init__(self,in_features,out_):
super().__init__()
#nn.Parameter()告诉pytorch该参数需要训练
self.weight = nn.Parameter(nn.init.xavier_normal_(torch.empty(out_features, in_features)))
self.bias = nn.Parameter(torch.randn(3, 3))
def forward(self,X):
return X-X.mean()
net = nn.Sequential(nn.Linear(8, 128),MyLayer())