赞
踩
可以说这二者是一种包含关系,一般情况下也不会混淆,但在我们下载使用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就使用、传参错误、模型未实例化、函数未返回等等。
出错的地方为下面两个语句:
(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()
也就是将整个模型中的参数全部清零,虽然我的代码可以这样做,但若有一些复杂的计算流程还须谨慎。
虽然代码不报错了,但此方法的确是费事费力还有一定的风险,若是大家知道更好的方法,请不吝赐教。
size mismatch也是常犯的错误之一了,错误原因是尺寸不匹配,通常是因为前后数量不一致或者格式未对应造成的。如在卷积层之后添加一个全连接层,要加入如下所示的语句:
h4 = h4.view(h4.size(0), -1)
h4.size(0)通常为batch_size,-1则可以将剩余所有维度整合成一个维度。
嗯~这篇博客就写到这里吧,不过之前还遇到过很多问题,从现在开始要善于总结,每天进步一点点,欢迎大家赐教啦~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。