AttributeError: ‘Sequential’ object has no attribute ‘subnet1’

文章讲述了在使用PyTorch实现线性回归时遇到的关于Sequential对象中subnet1属性错误的问题,提供了解决方案:确保在Sequential容器中正确添加网络层,并修改学习率设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《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可以解决上述错误

需要注意,线性回归是一个单层神经网络,所以,只有一个网络层,使用上述代码修改学习率的话需要将第二个网络层学习率修改的代码删除就可以了,下面给出正确的两段代码:

  1. 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])
    
  2. 修改网络的学习率

    optimizer = optim.SGD([
        # 如果对某个参数不指定学习率,就是用最外层的默认学习率
        {'params': net.subnet1.parameters()}, # lr=0.03
        # {'params': net.subnet2.parameters(), 'lr': 0.01}	# 这一行注释掉
    ], lr=0.03)
    

    将修改subnet2学习率的那一行代码注释掉就可以了,然后运行就不会报错了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值