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
(、线性变换等。