《Dive-into-DL-Pytorch》使用Pytorch实现线性回归报错:AttributeError: ‘Sequential’ object has no attribute ‘subnet1’
0.问题描述
在运行图中的代码时会出现图中所示的报错
1.解决方法
将下面这一段出现报错的代码注释掉,下面的代码只是书中对指定参数学习率方法的介绍,不是实现线性回归的代码
optimizer = optim.SGD([
# 如果对某个参数不指定学习率,就是用最外层的默认学习率
{'params': net.subnet1.parameters()}, # lr=0.03
{'params': net.subnet2.parameters(), 'lr': 0.01}
], lr=0.03)
2.具体分析
optimizer = optim.SGD([
# 如果对某个参数不指定学习率,就是用最外层的默认学习率
{'params': net.subnet1.parameters()}, # lr=0.03
{'params': net.subnet2.parameters(), 'lr': 0.01}
], lr=0.03)
在notebook中运行上面的代码会报错,错误原因为:AttributeError: ‘Sequential’ object has no attribute ‘subnet1’(属性错误:Sequential
中没有subnet1
的属性),也就是net
中没有subnet1
这个属性,这里的subnet1
是网络层的名称,在前面定义模型(搭建网络)的时候没有在容器Sequential
中添加名为subnet1
的网络层
# 写法一
net = nn.Sequential(
nn.Linear(num_inputs, 1)
# 此处还可以传入其他层
)
# 写法二
net = nn.Sequential()
net.add_module('linear', nn.Linear(num_inputs, 1)) # 添加一个名为linear的网络层
# net.add_module ... 此处还可以传入其他层
# 写法三
from collections import OrderedDict
net = nn.Sequential(OrderedDict([
('linear', nn.Linear(num_inputs, 1)) # 添加一个名为linear的网络层
# ... 此处还可以传入其他层
]))
print(net)
print(net[0])
上面的三个写法都是在Sequential
容器中添加网络层,其中,后两个写法将添加的网络层命名为linear
,所以,我们将网络层的名字改为subnet1
可以解决上述错误
需要注意,线性回归是一个单层神经网络,所以,只有一个网络层,使用上述代码修改学习率的话需要将第二个网络层学习率修改的代码删除就可以了,下面给出正确的两段代码:
-
将
Sequential
容器添加的网络层的名字改为subnet
,此处我们只改写法三就可以# 写法一 net = nn.Sequential( nn.Linear(num_inputs, 1) # 此处还可以传入其他层 ) # 写法二 net = nn.Sequential() net.add_module('linear', nn.Linear(num_inputs, 1)) # net.add_module ... 此处还可以传入其他层 # 写法三 from collections import OrderedDict net = nn.Sequential(OrderedDict([ ('subnet1', nn.Linear(num_inputs, 1)) # 改动在此处,将linear改为subnet1 # ... 此处还可以传入其他层 ])) print(net) print(net[0])
-
修改网络的学习率
optimizer = optim.SGD([ # 如果对某个参数不指定学习率,就是用最外层的默认学习率 {'params': net.subnet1.parameters()}, # lr=0.03 # {'params': net.subnet2.parameters(), 'lr': 0.01} # 这一行注释掉 ], lr=0.03)
将修改
subnet2
学习率的那一行代码注释掉就可以了,然后运行就不会报错了