【问题标题】:Errow Showing :'ResNet' object has no attribute 'classifier'错误显示:“ResNet”对象没有属性“分类器”
【发布时间】:2020-05-18 04:13:10
【问题描述】:

我下载了 Resnet18 模型来训练一个模型。

当我输入时

model

它显示

ResNet(
  (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (relu): ReLU(inplace=True)
  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
  (layer1): Sequential(
    (0): BasicBlock(
      (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (relu): ReLU(inplace=True)
      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    )
    (1): BasicBlock(
      (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (relu): ReLU(inplace=True)
      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    )
  )

  (layer3): Sequential(
    (0): BasicBlock(
      (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (relu): ReLU(inplace=True)
      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (downsample): Sequential(
        (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)
        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      )
    )
    (1): BasicBlock(
      (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (relu): ReLU(inplace=True)
      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
  (fc): Linear(in_features=512, out_features=1000, bias=True)
  (classifer): Sequential(
    (fc1): Linear(in_features=512, out_features=256, bias=True)
    (relu): ReLU()
    (fc5): Linear(in_features=128, out_features=2, bias=True)
    (output): LogSoftmax()
  )
)

如您所见,它清楚地显示了分类器

但是当我这样做时

optimizer = optim.Adam(model.classifier.parameters(), lr=0.001)

显示错误

AttributeError: 'ResNet' object has no attribute 'classifier'

我不知道我做错了什么,如果你能提供帮助,那就太好了。如果你愿意,我可以提供一些额外的细节。

【问题讨论】:

  • 是否可以在优化阶段之前在模型上使用dataparallel

标签: deep-learning pytorch torch resnet torchvision


【解决方案1】:

删除 classifier 并仅保留 model.parameters()

optimizer = optim.Adam(model.parameters(), lr=0.001)

要构造一个Optimizer,你必须给它一个包含要优化参数的迭代。

【讨论】:

    【解决方案2】:

    假设您只想训练分类器,您可以冻结不想更改的参数。 对于您的情况,您可以这样做

    for name, param in model.named_parameters() :
        param.requires_grad = False
        if name.startswith('classifier') : 
            param.requires_grad = True
    

    这将冻结除分类器之外的所有参数。

    然后您可以执行the other answer 建议的操作,即将所有参数传递给优化器。

    optimizer = optim.Adam(model.parameters(), lr=0.001)
    

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 2021-06-11
      • 1970-01-01
      • 2013-04-20
      • 2020-06-13
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多