"顺序"对象没有属性"in_features"和"fc"



我正在使用微调方法制作模型,模型是VGG-16。但我得到了以下错误"Sequential"对象没有属性"in_features"我使用了分类器,所以我将分类器更改为fc,但得到此错误"Sequential"对象没有属性"fc"。可以有人指导我做错了什么?我已附上错误的屏幕截图。

**ERROR:'Sequential' object has no attribute 'in_features'**
[![enter image description here][1]][1]
Traceback (most recent call last):
File "ct_pretrained.py", line 186, in <module>
model = build_model().cuda()
File "ct_pretrained.py", line 42, in build_model
return models.VGG(is_emr=is_emr)
File "/data/torch/models/vgg.py", line 19, in __init__
num_ftrs = self.axial_model.classifier.in_features
File "/root/miniconda/lib/python3.8/site-packages/torch/nn/modules/module.py",line 778, in __getattr__                       
raise ModuleAttributeError("'{}' object has no attribute '{}'".format(
torch.nn.modules.module.ModuleAttributeError: 'Sequential' object has no attribute 'in_features'                  
**ERROR:'VGG' object has no attribute 'fc'**
[![enter image description here][2]][2] 
Traceback (most recent call last):
File "ct_pretrained.py", line 186, in <module>
model = build_model().cuda()
File "ct_pretrained.py", line 42, in build_model
return models.VGG(is_emr=is_emr)
File "/data/torch/models/vgg.py", line 19, in __init__
num_ftrs = self.axial_model.fc.in_features
File "/root/miniconda/lib/python3.8/site-packages/torch/nn/modules/module.py", line 778, in __getattr__
raise ModuleAttributeError("'{}' object has no attribute '{}'".format(
torch.nn.modules.module.ModuleAttributeError: 'VGG' object has no attribute 'fc'


import torch
import torch.nn as nn
from torchvision import models

__all__ = ['VGG']

class VGG(nn.Module):

def __init__(self, is_emr=False, mode='sum'):
super().__init__()
self.is_emr = is_emr
self.mode = mode
in_dim = 45

self.axial_model = models.vgg16(pretrained=True)
out_channels = self.axial_model.features[0].out_channels
self.axial_model.features[0] = nn.Conv2d(1, out_channels, kernel_size=7, stride=1, padding=0, bias=False)
self.axial_model.features[3] = nn.MaxPool2d(1)
num_ftrs = self.axial_model.classifier.in_features #error in this line of code
self.axial_model.classifier = nn.Linear(num_ftrs, 15)



self.sa_co_model = models.vgg16(pretrained=True)
self.sa_co_model.features[0] = nn.Conv2d(1, out_channels, kernel_size=7, stride=1, padding=(3,0), bias=False)
self.sa_co_model.features[3] = nn.MaxPool2d(1)
self.sa_co_model.classifier = nn.Linear(num_ftrs, 15)

if self.is_emr:
self.emr_model = EMRModel()
if self.mode == 'concat': in_dim = 90

self.classifier = Classifier(in_dim)

def forward(self, axial, sagittal, coronal, emr):
axial = axial[:,:,:-3,:-3]
sagittal = sagittal[:,:,:,:-3]
coronal = coronal[:,:,:,:-3]

axial_feature = self.axial_model(axial)
sagittal_feature = self.sa_co_model(sagittal)
coronal_feature = self.sa_co_model(coronal)
out = torch.cat([axial_feature, sagittal_feature, coronal_feature], dim=1)

if self.is_emr:
emr_feature = self.emr_model(emr)
if self.mode == 'concat':
out = torch.cat([out, emr_feature], dim=1)
elif self.mode == 'sum':
out += emr_feature

out = self.classifier(out)

return out 

分类器序列对象没有名为in_features的变量。如果要动态地执行,则需要访问分类器中的层,而不是整个分类器:num_ftrs = self.axial.model.classifier[0].in_features。这访问顺序对象的第一层,即确定整个顺序对象中有多少特征的层。

但是,通过手动确定必要的特征数量,可以很容易地将分类器层替换为另一层。查看VGG16的pytorch源代码,可以看到分类器将512 * 7 * 7特性作为输入。

最新更新