我有以下卷积自动编码器设置:
class autoencoder(nn.Module):
def __init__(self):
super(autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Conv2d(1, 16, 3, stride=3, padding=1), # b, 16, 10, 10
nn.ReLU(True),
nn.MaxPool2d(2, stride=2), # b, 16, 5, 5
nn.Conv2d(16, 8, 3, stride=2, padding=1), # b, 8, 3, 3
nn.ReLU(True),
nn.MaxPool2d(2, stride=1) # b, 8, 2, 2
)
self.decoder = nn.Sequential(
nn.ConvTranspose2d(8, 16, 3, stride=2), # b, 16, 5, 5
nn.ReLU(True),
nn.ConvTranspose2d(16, 8, 5, stride=3, padding=1), # b, 8, 15, 15
nn.ReLU(True),
nn.ConvTranspose2d(8, 1, 2, stride=2, padding=1), # b, 1, 28, 28
nn.Tanh()
)
这是主循环:
for epoch in range(epochs):
running_loss = 0
for data in (train_loader):
image,_=data
inputs = image.view(image.size(0),-1)
optimizer.zero_grad()
#image = np.expand_dims(img, axis=0)
outputs = net(inputs)
loss = criterion(outputs,inputs)
loss.backward()
optimizer.step()
running_loss += loss.data[0]
print('At Iteration : %d ; Mean-Squared Error : %f'%(epoch + 1,running_loss/(train_set.train_data.size(0)/batch_size)))
这是错误:
RuntimeError: Expected 4-dimensional input for 4-dimensional weight [16, 1, 3, 3], but got input of size [1000, 784] instead
这与图像的扁平化有关,但我不确定如何放平它。
为什么要"展平"输入图像(主循环的第二行(:
inputs = image.view(image.size(0),-1)
这条线将您的 4 维image
(批次 - 通道 - 高度 - 宽度(转换为二维"平面"向量(批次 - c * h * w(。
您autoencoder
期望其输入是 4D 而不是"平面"。 只需删除此行,您应该没问题。