运行错误:mat1 dim 1必须匹配mat2 dim 0



我正在使用GaborNet运行一个分类程序。我的部分代码是

class module(nn.Module):
def __init__(self):
super(module, self).__init__()
self.g0 = modConv2d(in_channels=3, out_channels=32, kernel_size=(11, 11), stride=1)
self.c1 = nn.Conv2d(in_channels=32,out_channels=64,kernel_size=(2, 2),stride=1)
self.c2 = nn.Conv2d(in_channels=64,out_channels=128,kernel_size=(2, 2),stride=1)

#x = x.view(x.size(0), -1)

#x = x.view(1, *x.shape)
#x=x.view(-1,512*12*12)

x = F.relu(self.fc1(x))
print(x.shape)
x = F.relu(self.fc2(x))
print(x.shape)
x = self.fc3(x)
return x 

我在这个位置得到这个错误:x = F.relu(self.fc1(x))

,错误是:RuntimeError: mat1 dim 1必须匹配mat2 dim 0

但是在后续图层中输入图像的形状仍然是fc1,为:

torch.Size([64, 3, 150, 150])
torch.Size([64, 32, 140, 140])
torch.Size([64, 32, 70, 70])

你在正确的轨道上,你确实需要在卷积层之后重塑你的数据,在继续处理完全连接的层之前。

使张量变平的最好方法是使用nn.Flatten,否则你可能会破坏批大小。最后一个空间层输出(64, 128, 3, 3)的形状,一旦被压平,这个张量就有(64, 1152)的形状,其中1152 = 128*3*3。因此,你的第一个完全连接层应该有1152神经元。

应该这样做:

class GaborNN(nn.Module):
def __init__(self):
super().__init__()
...
self.fc1 = nn.Linear(in_features=1152, out_features=128)
self.fc2 = nn.Linear(in_features=128, out_features=128)
self.fc3 = nn.Linear(in_features=128, out_features=7)
self.flatten = nn.Flatten()
def forward(self, x):
...
x = self.flatten(x)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x 

相关内容

  • 没有找到相关文章

最新更新