如何将 Olivetti 数据集图像的大小调整为 64x64 到 32x32 ??我收到错误


batch_boyut = 2
train_loader = torch.utils.data.DataLoader(
X_egitim, batch_size=batch_boyut)
val_loader = torch.utils.data.DataLoader(
X_val, batch_size=batch_boyut)
class CNNModule(nn.Module):
def __init__(self):
super(CNNModule, self).__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 40)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
model = CNNModule()
print(model)
model.forward(X_egitim)

我收到此错误。我该如何解决?如何将 olivetti 数据集图像的大小从 64x64 调整为 32x32 ? 我想我应该改变x.view,但我不知道我该怎么做

x = x.view(-1, 16 * 5 * 5)

RuntimeError: shape '[-1, 400]' is invalid for input of size 865280

我假设您的输入形状是320 x 1 x 64 x 64.

我认为您需要了解卷积和最大池操作的输出形状是什么。在您的模型中,您有 2 个 CNN 层,后跟最大池化层。

第一个 CNN 和最大池层:

x = self.pool(f.relu(self.conv1(x)))

由于conv1有一个大小为5 x 5的 2d 内核,conv1的输出形状将是(6 x 60 x 60)。通过核大小为2 x 2的最大池化层后,您将获得6 x 30 x 30形状的张量。您可以轻松计算张量的输出形状,如下所示。

64 x 64 -> 60 x 60 -> 30 x 30

哪里,60 = (64 - cnn_kernel_size + 1)30 = 60 // max_pool_kernel_size.

类似地,在第二个 CNN 和最大池层之后:

x = self.pool(f.relu(self.conv2(x)))

x的形状将是:320 x 16 x 13 x 13。在这里,13 = 26 // 2 and 26 = 30 - 5 + 1.现在,当您尝试将x重塑为x.view(-1, 16 * 5 * 5)时,它会抛出错误。

因此,要么修改以下层,这些层将接受形状-1, 16 * 13 * 13的输入,要么修改CNN层以最终获得形状-1, 16 * 5 * 5的输出张量。


请注意,如果你有一个形状32 x 32的输入张量,你不会遇到这个问题。为什么?

因为:32 -> (32 - 5 + 1) // 2 -> 14 -> (14 - 5 + 1) // 2 -> 5

因此,如果您想将大小64 x 64转换为32 x 32,您可以考虑使用一些操作进行缩减,例如,最大池化 2d(带 kernel_size2 x 2(、线性变换等。

最新更新