我有一个已定义的模型和已定义的层,我将我的已定义层的n个实例添加到模型的init函数中的列表中,如下所示:
self.layers = []
for i in range(len(nhid)-1):
self.layers.append(MyLayer(nhid[i], nhid[i+1]))
但是当我通过创建优化器时
optim.Adam(model.parameters(),lr=args.lr, weight_decay=args.weight_decay)
它说:
ValueError:优化器的参数列表为空
但是当我按照如下方式将其编写为两层时,我没有出现错误:
self.layer1 = MyLayer[nhid[0],nhid[1]]
self.layer2 = MyLayer[nhid[1],nhid[2]]
答案 0 :(得分:3)
我通过使用nn.ModuleList()
如下解决了这个问题:
temp = []
for i in range(len(nhid)-1):
temp.append(MyLayer(nhid[i], nhid[i+1]))
self.layers = nn.ModuleList(temp)
我也读过nn.Sequential()
,但是我没有找到如何正确使用它的方法。
答案 1 :(得分:0)
你有
nhid[0], nhid[1], nhid[2]
所以len(nhid)
是3
。
所以
for i in range(len(nhid)-1):
self.layers.append(MyLayer(nhid[i], nhid[i+1]))
成为
for i in range(2):
self.layers.append(MyLayer(nhid[i], nhid[i+1]))
或
self.layers.append(MyLayer(nhid[0], nhid[1]))
self.layers.append(MyLayer(nhid[1], nhid[2]))
将其与您的无错误方法进行比较:
self.layer1 = MyLayer[nhid[0],nhid[1]]
self.layer2 = MyLayer[nhid[1],nhid[2]]
在第一种(错误)方法中,您没有设置对象属性layer1
和layer2
。