gpt4 book ai didi

python - 重新使用分类 CNN 模型进行自动编码 - pytorch

转载 作者:行者123 更新时间:2023-12-01 15:30:49 26 4
gpt4 key购买 nike

我是 pytorch 的新手,所以我需要一些掌握。我正在尝试重新使用旧的 CNN 分类模型——重新使用已经训练好的卷积层作为自动编码器中的编码器,然后训练解码器层。下面的代码是我的。

class Autoencoder(nn.Module):
def __init__(self, model, specs):

super(Autoencoder, self).__init__()

self.encoder = nn.Sequential(
*list(model.conv_layer.children())
)

self.decoder = nn.Sequential(
nn.ConvTranspose2d(in_channels=C7, out_channels=C6, kernel_size=pooling, padding=0),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(in_channels=C6, out_channels=C5, kernel_size=pooling, padding=0),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(in_channels=C5, out_channels=C4, kernel_size=pooling, padding=0),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(in_channels=C4, out_channels=C3, kernel_size=pooling, padding=0),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(in_channels=C3, out_channels=C2, kernel_size=pooling, padding=0),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(in_channels=C2, out_channels=C1, kernel_size=pooling, padding=0),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(in_channels=C1, out_channels=C0, kernel_size=pooling, padding=0),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(in_channels=C0, out_channels=3, kernel_size=pooling, padding=0),
nn.ReLU(inplace=True),
)
for param in self.encoder.parameters():
param.requires_grad = False

for p in self.decoder.parameters():
if p.dim() > 1:
nn.init.kaiming_normal_(p)
pass

def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x


但是,我收到“NotImplementedError”。我究竟做错了什么?当我启动该类的一个实例时,我将传递预训练的 CNN 分类模型,self.encoder 应该负责从模型中获取我感兴趣的层(那些在 conv_layer 中的层)。当我:

model = pretrainedCNNmodel
autoencoder = Autoencoder(model, specs)
print(autoencoder)

打印看起来不错,它有所有层和我希望的一切,但是当我尝试在它上面训练时,我得到了“NotImplementedError:”。

编辑

这是整个错误:


---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
<ipython-input-20-9adc467b2472> in <module>()
2 optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=L2_lambda)
3
----> 4 train(x, train_loader, test_loader, optimizer, criterion)

2 frames
<ipython-input-5-b25edb14cf5f> in train(model, train_loader, test_loader, optimizer, criterion)
15 data, target = data.cuda(), target.cuda()
16 optimizer.zero_grad()
---> 17 output = model(data)
18 loss = criterion(output, target)
19 loss.backward()

/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
530 result = self._slow_forward(*input, **kwargs)
531 else:
--> 532 result = self.forward(*input, **kwargs)
533 for hook in self._forward_hooks.values():
534 hook_result = hook(self, input, result)

/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py in forward(self, *input)
94 registered hooks while the latter silently ignores them.
95 """
---> 96 raise NotImplementedError
97
98 def register_buffer(self, name, tensor):

NotImplementedError:

最佳答案

由于您对此问题有赏金,因此无法关闭。然而,完全相同的问题已经在 this thread 中提出并回答了。 .

基本上,您的代码中存在缩进问题:您的 forward 方法被缩进,因此它在 inside 您的 __init__ 方法中,而不是成为 Autoencoder 类的一部分。

请参阅my other answer了解更多详情。

关于python - 重新使用分类 CNN 模型进行自动编码 - pytorch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60365105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com