我正在使用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