所以我正在编写我的第一个自动编码器,这是代码(它可能有点愚蠢,但我相信我写的都是对的):
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
self.flatten = nn.Flatten()
self.enc_conv0 = nn.Sequential(
nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=(1, 1)),
nn.ReLU(),
nn.BatchNorm2d(64),
nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=(1, 1)),
nn.ReLU(),
nn.BatchNorm2d(128)
)
self.enc_conv1 = nn.Sequential(
nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, padding=(1, 1)),
nn.ReLU(),
nn.BatchNorm2d(256),
nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, padding=(1, 1)),
nn.ReLU(),
nn.BatchNorm2d(512)
)
self.enc_fc = nn.Sequential(
nn.Linear(in_features=512*64*64, out_features=4096),
nn.ReLU(),
nn.BatchNorm1d(4096),
nn.Linear(in_features=4096, out_features=2048),
nn.ReLU(),
nn.BatchNorm1d(2048),
nn.Linear(in_features=2048, out_features=dim_code)
)
self.dec_fc = nn.Sequential(
nn.Linear(in_features=dim_code, out_features=2048),
nn.ReLU(),
nn.BatchNorm1d(2048),
nn.Linear(in_features=2048, out_features=4096),
nn.ReLU(),
nn.BatchNorm1d(4096),
nn.Linear(in_features=4096, out_features=512*64*64),
nn.ReLU(),
nn.BatchNorm1d(512*64*64)
)
self.dec_conv0 = nn.Sequential(
nn.ConvTranspose2d(in_channels=512, out_channels=256, kernel_size=(3,3), padding=1),
nn.ReLU(),
nn.BatchNorm2d(256),
nn.ConvTranspose2d(in_channels=256, out_channels=128, kernel_size=(3,3), padding=1),
nn.ReLU(),
nn.BatchNorm2d(128),
)
self.dec_conv1 = nn.Sequential(
nn.ConvTranspose2d(in_channels=128, out_channels=64, kernel_size=(3,3), padding=1),
nn.ReLU(),
nn.BatchNorm2d(64),
nn.ConvTranspose2d(in_channels=64, out_channels=3, kernel_size=(3,3), padding=1)
)
def forward(self, x):
e0 = self.enc_conv0(x)
e1 = self.enc_conv1(e0)
latent_code = self.enc_fc(self.flatten(e1))
d0 = self.dec_fc(latent_code)
d1 = self.dec_conv0(d0.view(-1, 512, 64, 64))
reconstruction = self.dec_conv1(d1)
return reconstruction, latent_code
然后我准备用下一个代码单元来训练它:
`device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)
criterion = nn.BCELoss()
print('crit')
autoencoder = Autoencoder().to(device)
print('deviced')`
细胞打印: 库达 ‘暴击’
然后就无限地跟踪,将 RAM 和 CPU 填满(我在 Kaggle 笔记本上做所有事情)。我不明白为什么。 :(
尝试在 Google colab 中而不是 Kaggle 中启动相同的笔记本,但它只是因尝试分配不可访问的资源而出错而崩溃。
我还认为问题可能与课程开始后的第一行有关,所以我更换了
def __init__(self):
super().__init__()
与
def __init__(self):
super(Autoencoder, self).__init__()
就像我在一些教程中看到的那样(老实说,我不知道这行代码是做什么的,它只是写在所有其他类似的情况下) 但也没有成功
这是包含建议的训练代码的更新版本:
import torch
import torch.nn as nn
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)
criterion = nn.MSELoss() # Use Mean Squared Error for image reconstruction
print('crit')
autoencoder = Autoencoder().to(device)
print('deviced')
如果问题仍然存在,请尝试解决上述问题,如果您遇到任何特定错误或者您有有关该问题的其他详细信息,请告诉我。