自定义块

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())