Pytorch笔记(三)

ModuleList 和 Sequential

每次都写复杂的forward函数会有些麻烦,在此就有两种简化方式,ModuleList和Sequential。其中Sequential是一个特殊的Module,它包含几个子module,前向传播时会将输入一层接一层地传递下
去。ModuleList也是一个特殊的Module,可以包含几个子module ,可以像用list一样使用它,但不能直接把输入传给ModuleList。下面我们举例说明。

net2 = nn.Sequential(
	nn.Conv2d(3, 3, 3),
	nn.BatchNorm(3), 
	nn.ReLU()
)

modellist = nn.Modu1eList([nn.Linear(3, 4), nn.ReLU(), nn.Linear(4, 2)])
input = V(t.randn(1, 3))
for model in modellist:
	input = model(input)
# 下面会报错,因为modellist没有实现forward方法
# output = modelist(input)

为何不直接使用Python中自带的list,而非要多此一举呢?这是因为ModuleList是Module的子类,当在Module中使用它时就能自动识别为子module。

nn.Module 和 nn.fuctional

如果模型有可学习的参数,最好用nn.Module,否则既可以使用nn.functional也可以使用nn.Module,二者在性能上没有太大差异,具体的使用方式取决于个人喜好。由于激活函数( ReLU 、sigmoid 、tanh)、池化( MaxPool) 等层没有可学习参数,可以使用对应的functional函数代替,而卷积、全连接等具有可学习参数的网络建议使用nn.Module。下面举例说明如何在模型中搭配使用nn.Module nn.functional。另外,虽然dropout 操作也没有可学习参数,但建议还是使用nn.Dropout而不是nn.fuctional。因为dropout 在训练和测试两个阶段的行为有所差别,使用nn.Module对象能够通过model.eval操作加以区分。

保存模型和加载模型

在PyTorch中保存模型十分简单,所有的Module对象都具有state_dict()函数,返回当前Module所有的状态数据。将这些状态数据保存后,下次使用模型时即可利用model.load_state_dict()函数将状态加载进来。优化器( optimizer )也有类似的机制,不过一般并不需要保存优化器的运行状态。

import torch
# 保存模型
torch.save(net.state_dict(), 'net.pth'))

#加载已保存的模型
net2 = Net()
net2.1oad_state_dict(torch.load('net.pth'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值