pytorch中的细节问题

1 nn.Module.cuda() 和 Tensor.cuda() 的作用效果差异:
对于nn.Module:
model = model.cuda()
model.cuda()
上述两句能够达到同样的效果,即对Model自身进行内存迁移

2 对于Tensor:
nn.Module不同,调用tensor.cuda()只是返回这个tensor对象在GPU内存上的拷贝,而不会对自身进行改变
因此必须对tensor进行重新赋值,即tensor=tensor.cuda()
model = create_a_model()
tensor = torch.zeros([2,3,10,10])
model.cuda()
tensor.cuda()
model(tensor) # 会报错
tensor = tensor.cuda()
model(tensor) # 正常运行

3 pytorch计算累积损失的不同
广泛使用的模式total_loss += loss.data[0]为例
Python0.4.0之前,loss是一个封装了(1,)张量的Variable,但Python0.4.0的loss现在是一个零维的标量。
对标量进行索引是没有意义的(似乎会报 invalid index to scalar variable 的错误)。
使用loss.item()可以从标量中获取Python数字。所以改为total_loss += loss.item()

如果在累加损失时未将其转换为Python数字,则可能出现程序内存使用量增加的情况。
这是因为上面表达式的右侧原本是一个Python浮点数,而它现在是一个零维张量。
因此,总损失累加了张量和它们的梯度历史,这可能会产生很大的autograd 图,耗费内存和计算资源

4 torch.Tensor.detach()的使用
假设有模型A和模型B,我们需要将A的输出作为B的输入,但训练时我们只训练模型B. 那么可以这样做:
input_B = output_A.detach()
它可以使两个计算图的梯度传递断开,从而实现我们所需的功能

5 pytorch中loss函数的参数设置
https://blog.csdn.net/hyk_1996/article/details/80824747 参考博文链接地址

6 pytorch的可重复性问题
https://blog.csdn.net/hyk_1996/article/details/84307108 参考博文链接地址

7多GPU处理机制
使用多GPU时,应该记住pytorch的处理逻辑是:
1.在各个GPU上初始化模型。
2.前向传播时,把batch分配到各个GPU上进行计算。
3.得到的输出在主GPU上进行汇总,计算loss并反向传播,更新主GPU上的权值。
4.把主GPU上的模型复制到其它GPU上

8 num_batches_tracked参数
KeyError: ‘unexpected key “module.bn1.num_batches_tracked” in state_dict’
经过研究发现,在pytorch 0.4.1及后面的版本里,BatchNorm层新增了num_batches_tracked参数,用来统计训练时的forward过的batch数目,源码如下(pytorch0.4.1)
参数和训练时的归一化的计算方式有关。

因此,我们可以知道该错误是由于训练和测试所用的pytorch版本(0.4.1版本前后的差异)不一致引起的。具体的解决方案是:如果是模型参数(Orderdict格式,很容易修改)里少了num_batches_tracked变量,就加上去,如果是多了就删掉。偷懒的做法是将load_state_dict的strict参数置为False,如下所示:
load_state_dict(torch.load(weight_path), strict=False)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值