【问题标题】:Pytorch: List of layers returns 'optimizer got an empty parameter list'Pytorch:层列表返回“优化器得到一个空参数列表”
【发布时间】:2018-09-12 14:58:15
【问题描述】:

我有一个定义的模型和定义的层,我将定义层的 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]]

【问题讨论】:

    标签: python python-3.x pytorch


    【解决方案1】:

    我通过使用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() 的信息,但我没有找到正确使用它的方法。

    【讨论】:

      【解决方案2】:

      你有

      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]]
      

      在您的第一个(错误)方法中,您没有设置对象属性 layer1layer2

      【讨论】:

      • 抱歉,我没明白应该如何设置对象属性?
      • self.layer1 = ... self.layer2 =...
      • 我的问题是,我不知道层数,无法设置名称。
      猜你喜欢
      • 2019-07-07
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多