几种构造方式
比较常用的两种方式
1、通过集成nn.Module()来定义一个神经网络
以LeNet为例
# LeNet:卷积+池化+卷积+池化+全连接+全连接+全连接(两层卷积+三层全连接,一共5层)
class Net(nn.Module):
def __init__(self):
super().__init__()
self.Cv = nn.Sequential(
nn.Conv2d(1,6,kernel_size= 5),
nn.MaxPool2d(2,2),
nn.ReLU(),
nn.Conv2d(6,16,kernel_size= 5),
nn.MaxPool2d(2,2),
nn.ReLU()
)
self.Linear = nn.Sequential(
nn.Linear(16*4*4,120),
nn.ReLU(),
nn.Linear(120,84),
nn.ReLU(),
nn.Linear(84,10)
)
def forward(self,x):
x = self.Cv(x)
x = self.Linear(x.view(x.shape[0],-1))
return x
net = Net()
2、当模型的计算就是简单的串联各个层时,可以直接使用nn.Senquential()来构造,直接叠加传播层即可,不需要定义forward函数。
#LeNet
net = nn.Sequential(nn.Conv2d(1,6,kernel_size=5),
nn.MaxPool2d(2,2),
nn.ReLU(),
nn.Conv2d(6,16,kernel_size=5),
nn.MaxPool2d(2,2),
nn.ReLU(),
nn.Flatten(),
#这一步的作用就是对输入的image进行扁平化处理,相当于x = x.view(x.shape[0],-1),然后再让我们的X进入Linear
nn.Linear(16*4*4,120),nn.ReLU(),nn.Linear(120,84),nn.ReLU(),nn.Linear(84,10))
这样构造的net和上面的net是等价的。