总结一下今日使用pytorch遇到的几个小问题

几个小问题

  • 1.torch.nn与torch.nn.functional
  • 2.AttributeError: 'function' object has no attribute 'parameters'/ ‘zero_grad’
  • 3.RuntimeError: size mismatch, m1: [32768 x 32], m2: [32768 x 512] at /opt/conda/conda-bld/pytorch_1532576128691/work/aten/src/THC/generic/THCTensorMathBlas.cu:249

这是我第一次写CSDN博客,自己还是个正在摸索的小白,还有一些小紧张,若是有不对的地方还请大家及时指出,多多指教啦~转载请附上本文链接: https://blog.csdn.net/S20144144/article/details/99323222

1.torch.nn与torch.nn.functional

可以说这二者是一种包含关系,一般情况下也不会混淆,但在我们下载使用github上的代码时,不同的代码在import … as … 可能会混淆,稍不注意代码就会报错,但这种错误也很容易发现并修改。关于torch.nn与torch.nn.functional二者的联系与区别我在网上找到三篇介绍比较好的文章,附上链接如下:
(1) pytorch:nn与nn.functional的区别
https://www.jianshu.com/p/7bb495573cb9
(2)『PyTorch』第十二弹_nn.Module和nn.functional
https://www.cnblogs.com/hellcat/p/8496850.html
(3)PyTorch(1) torch.nn与torch.nn.functional之间的区别和联系
https://blog.csdn.net/xg123321123/article/details/78034859
最容易混淆的是在搭建神经网络时,torch.nn与torch.nn.functional都有卷积,注意在torch.nn中是torch.nn.Conv2d,常用来对Variable进行操作;而在torch.nn.functional中是torch.nn.functional.conv2d,常作函数用,此外,torch.nn.functional还包括sigmoid、relu等函数。
类似容易犯但容易发现的错误还有未经import就使用、传参错误、模型未实例化、函数未返回等等。

2.AttributeError: ‘function’ object has no attribute ‘parameters’/ ‘zero_grad’

出错的地方为下面两个语句:
(1)Q_solver = optim.Adam(avb.Q.parameters(), lr=lr)
(2)avb.Q.zero_grad()
其中的avb是实例化后的模型,Q是模型中我自己写的函数过程,原本目的是想单独优化模型中Q函数中的参数并在适当的时候对梯度清零,但函数不具备.parameters或者.zero_grad的属性。
我的改进方法是,对于第一种情况,可用如下代码查看所有可用于训练的、梯度可以反向传播的参数名称:

for name, param in avb.named_parameters():
    if param.requires_grad:
        print(name)

结果显示:

fc1.weight
fc1.bias
conv1_1.weight
conv1_1.bias
deconv2_1.weight
deconv2_1.bias

因此我改写成如下所示的格式:

Q_solver = optim.Adam([avb.fc1.weight, avb.fc1.bias, avb.conv1_1.weight, avb.conv1_1.bias], lr=lr) 

即将参数名称作为optim.Adam([…], lr=lr)方括号里面的内容。Optimizer支持为每个参数单独设置选项。此时不要直接传入Variable的iterable,而是传入dict的iterable,每一个dict都分别定义了一组参数,并且包含一个param键,这个键对应参数的列表,其他的键应该与optimizer所接受的其他参数的关键字相匹配,并且会被用于对这组参数的优化。这是参考了以下文章:
PyTorch官方中文文档:torch.optim 优化器参数
https://www.cnblogs.com/jfdwd/p/11133986.html
对于第二种情况,改进可谓简单粗暴了,直接将

avb.Q.zero_grad()

改成

avb.zero_grad()

也就是将整个模型中的参数全部清零,虽然我的代码可以这样做,但若有一些复杂的计算流程还须谨慎。
虽然代码不报错了,但此方法的确是费事费力还有一定的风险,若是大家知道更好的方法,请不吝赐教。

3.RuntimeError: size mismatch, m1: [32768 x 32], m2: [32768 x 512] at /opt/conda/conda-bld/pytorch_1532576128691/work/aten/src/THC/generic/THCTensorMathBlas.cu:249

size mismatch也是常犯的错误之一了,错误原因是尺寸不匹配,通常是因为前后数量不一致或者格式未对应造成的。如在卷积层之后添加一个全连接层,要加入如下所示的语句:

h4 = h4.view(h4.size(0), -1)

h4.size(0)通常为batch_size,-1则可以将剩余所有维度整合成一个维度。

嗯~这篇博客就写到这里吧,不过之前还遇到过很多问题,从现在开始要善于总结,每天进步一点点,欢迎大家赐教啦~

你可能感兴趣的:(Pytorch)