我有以下 CNN,但出现以下错误
RuntimeError: mat1 and mat2 shapes cannot be multiplied (32x400 and 600x120)
。我使用的是 CIFAR10 数据集,该数据集总共包含 6,000 张 32x32 图像,带有 10 个标签。如果我理解正确的话,输入到x = F.relu(self.fc1(x))
的大小应该是600x200,但输入实际上是32x400。我迷失的是我需要更改(或计算)的部分。
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
batch_size = 32
cifar10 = torchvision.datasets.CIFAR10(root='./data', download=True, transform=torchvision.transforms.ToTensor())
pivot = 40000
cifar10 = sorted(cifar10, key=lambda x: x[1])
train_set = torch.utils.data.Subset(cifar10, range(pivot))
val_set = torch.utils.data.Subset(cifar10, range(pivot, len(cifar10)))
train_loader = DataLoader(train_set, batch_size=batch_size, shuffle=True)
val_loader = DataLoader(val_set, batch_size=batch_size, shuffle=True)
class Network(nn.Module):
def __init__(self):
super(Network, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(600, 120)
self.fc2 = nn.Linear(120, 2)
self.fc3 = nn.Linear(2, 10)
self.flatten = nn.Flatten(1)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = self.flatten(x)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
model = Network()
我尝试了其他具有类似错误的帖子中的解决方案,但无法修复我的代码。我还尝试添加
torch.nn.AdaptiveMaxPool2d
但我认为我使用得不正确,并且不确定我是否真的需要使用它。
如果通过池化进行下采样,最好使用“相同”的填充卷积 2d。
class Network(nn.Module):
def __init__(self):
super(Network, self).__init__()
self.conv1 = nn.Conv2d(3, 6, kernel_size=5, padding=2)
self.pool = nn.MaxPool2d(2, 2) # downsample / 2
self.conv2 = nn.Conv2d(6, 16, kernel_size=5, padding=2)
self.fc1 = nn.Linear(8*8*16, 120)
self.fc2 = nn.Linear(120, 2)
self.fc3 = nn.Linear(2, 10)
self.flatten = nn.Flatten(1)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = self.flatten(x)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x