一、前言
如果我们单纯使用python+numpy的方式来定义一个神经网络模型的话,当仅仅是实现一个线性回归等小模型时,并没有什么不可,但是当要实现的模型比较复杂的时候,比如需要定义很多层不同结构的模型时,就会显得很复杂。在pytorch中提供的大量预定义的层,我们只需要关注使用哪些层来进行构造网络。定义模型的方法大概可以分为两大类。
二、继承nn.Module
实际使用中,最常用的做法是继承nn.Module,撰写自己的网络/层。使用这种方法一般需要包括一些层以及返回输出的前向传播方法。下面以实现线性回归来进行举例说明。
class LinearNet(torch.nn.Module):
def __init__(self,n_feature):
super(LinearNet,self).__init__()
self.linear=torch.nn.Linear(n_feature,1) #使用torch.nn中的线性回归函数
#定义前向传播
def forward(self,x):
y=self.linear(x)
return y
net =LinearNet(num_inputs)
print(net) #使用print可以打印出网络的结构
输出:
LinearNet(
(linear): Linear(in_features=2, out_features=1, bias=True)
)
三、使用nn.Sequential()
使用nn.Sequential()可以很方便的搭建一个神经网络,Sequential是一个有序容器,网络层将依次将按照存入的顺序依次被添加到计算图里面。使用nn.Sequential有三种方式,效果都是一致的,下面将通过代码进行介绍。
#写法一:
net=torch.nn.Sequential(
torch.nn.Linear(num_inputs,1)
#torch.nn.xxx
#此处可以传入其它层
)
#写法二:
net=torch.nn.Sequential()
net.add_module('linear',torch.nn.Linear(num_inputs,1))
#net.add_module.....
#写法三
from collections import OrderedDict
net = torch.nn.Sequential(OrderedDict([
('linear',torch.nn.Linear(num_inputs,1)),
#xxxx
]))
print(net)
输出:
Sequential(
(linear): Linear(in_features=2, out_features=1, bias=True)
)