AttributeError: ‘NoneType’ object has no attribute ‘data’
17771 단어 Pytorch
참고 자료
문제 설명
다른 사람의 모형을 자신의 모형으로 바꾸어 훈련 과정에서 오류가 발생했다
param.grad.data.clamp_(-grad_clip, grad_clip) AttributeError: 'NoneType' object has no attribute 'data'
해결 방법
인터넷에 접속하여 이 문제를 조회하면 대부분 모델에서 정의된 어느 층이 전방향 전파에 참여하지 않았기 때문에 역방향 전파를 계산할 때
grad is None
.주로 계산에 참여하지 않은 층을 찾아서 주석을 달아야 한다.이 문제는 시종 쓸데없는 층이 없다고 느꼈기 때문에 나를 매우 오랫동안 괴롭혔다.
다음 코드는 AttentionResNet 모델을 정의합니다.나중에야 원흉이
self.encoder
인 것을 발견했기 때문에 앞에서 이를 눈치채지 못한 것은 뒤에 있는 층의 정의가 self.encoder
중의 어느 층이나 몇 개의 층을 조합하기 때문이다.class AttentionResNet(nn.Module):
def __init__(self, in_channels=3, out_channels=1, num_filters=32, encoder_depth=34, pretrained=True):
super(AttentionResNet, self).__init__()
self.in_channels = in_channels
self.out_channels = out_channels
self.num_filters = num_filters
if encoder_depth == 34:
self.encoder = torchvision.models.resnet34(pretrained=pretrained)
bottom_channel_nr = 512
elif encoder_depth == 101:
self.encoder = torchvision.models.resnet101(pretrained=pretrained)
bottom_channel_nr = 2048
elif encoder_depth == 152:
self.encoder = torchvision.models.resnet152(pretrained=pretrained)
bottom_channel_nr = 2048
else:
raise NotImplementedError('only 34, 101, 152 version of Resnet are implemented')
#attention module
self.pool = nn.MaxPool2d(2, 2)
self.relu = nn.ReLU(inplace=True)
self.conv1 = nn.Sequential(self.encoder.conv1, self.encoder.bn1, self.encoder.relu, self.pool)
self.conv2 = self.encoder.layer1
self.conv3 = self.encoder.layer2
self.conv4 = self.encoder.layer3
self.conv5 = self.encoder.layer4
self.center = DecoderBlockV2(bottom_channel_nr, num_filters * 8 * 2, num_filters * 8)
self.dec5 = DecoderBlockV2(bottom_channel_nr + num_filters * 8, num_filters * 8 * 2, num_filters * 8)
self.dec4 = DecoderBlockV2(bottom_channel_nr // 2 + num_filters * 8, num_filters * 8 * 2, num_filters * 8)
self.dec3 = DecoderBlockV2(bottom_channel_nr // 4 + num_filters * 8, num_filters * 4 * 2, num_filters * 2)
self.dec2 = DecoderBlockV2(bottom_channel_nr // 8 + num_filters * 2, num_filters * 2 * 2, num_filters * 2 * 2)
self.dec1 = DecoderBlockV2(num_filters * 2 * 2, num_filters * 2 * 2, num_filters)
self.attention_map = nn.Sequential(
ConvRelu(num_filters, num_filters),
nn.Conv2d(num_filters, 1, kernel_size=1)
)
def forward(self, x):
#attention module
conv1 = self.conv1(x)
conv2 = self.conv2(conv1)
conv3 = self.conv3(conv2)
conv4 = self.conv4(conv3)
conv5 = self.conv5(conv4)
pool = self.pool(conv5)
center = self.center( pool )
dec5 = self.dec5(torch.cat([center, conv5], 1))
dec4 = self.dec4(torch.cat([dec5, conv4], 1))
dec3 = self.dec3(torch.cat([dec4, conv3], 1))
dec2 = self.dec2(torch.cat([dec3, conv2], 1))
dec1 = self.dec1(dec2)
#attention map
x = self.attention_map( dec1 )
return x
잘못된 위치를 찾았는데 어떻게 수정합니까?자료 3 참조, 우선self.코드의 매개 변수
requires_grad
는false로 설정하고 최적화기에 필터를 넣고 requires_grad = True
의 매개 변수만 업데이트합니다.for param in net.encoder.parameters():
param.requires_grad = False
optimizer = optim.SGD(filter(lambda p: p.requires_grad, net.parameters()), lr=opt.lr, momentum=0.9, weight_decay=5e-4)
이틀 동안 찾다가 마침내 잘못된 위치를 찾았으니 너무 어렵다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Pytorch에서 shuffle을 사용하여 데이터를 흐트러뜨리는 작업우선 내가 너에게 한 가지 알려줘야 할 것은 바로pytorch의tensor이다. 만약에random을 직접 사용한다면.shuffle는 데이터를 흐트러뜨리거나 아래의 방식을 사용하여 직접 쓰기를 정의합니다. 그러면 혼란...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.