我有以下代码,定义了一个简单的多层感知机神经网络:
class MlpNN(nn.Module): def __init__(self, in_dim=301, hidden_dims=[500,500,500,500,500,30]): super(MlpNN, self).__init__() self.net = nn.Sequential() self.net.add_module("lin_0", nn.Linear(in_dim, hidden_dims[0])) self.net.add_module("relu_0", nn.ReLU()) layer_id = 1 for hidden_dim in hidden_dims[1:]: self.net.add_module("lin_"+str(layer_id), nn.Linear(hidden_dim, hidden_dim)) self.net.add_module("relu_"+str(layer_id), nn.ReLU()) layer_id += 1 def forward(self, x): return self.net(x)
形成的网络结构如下:
MlpNN( (net): Sequential( (lin_0): Linear(in_features=301, out_features=500, bias=True) (relu_0): ReLU() (lin_1): Linear(in_features=500, out_features=500, bias=True) (relu_1): ReLU() (lin_2): Linear(in_features=500, out_features=500, bias=True) (relu_2): ReLU() (lin_3): Linear(in_features=500, out_features=500, bias=True) (relu_3): ReLU() (lin_4): Linear(in_features=500, out_features=500, bias=True) (relu_4): ReLU() (lin_5): Linear(in_features=30, out_features=30, bias=True) (relu_5): ReLU() ))
在执行forward()
函数时,出现了以下错误:
mat1 and mat2 shapes cannot be multiplied (1x500 and 30x30)
我在这儿做错了什么?我知道这可能是个很基本的问题,因为我刚开始学习机器学习。
回答:
在你的网络中,lin_4
层的输出特征数为500,而lin_5
层的输入特征数为30。这导致了形状不匹配。要解决这个问题,你需要确保一层的输出特征数与下一层的输入特征数相同。在你的代码中,可以这样修改:
class MlpNN(nn.Module): def __init__(self, in_dim=301, hidden_dims=[500,500,500,500,500,30]): super(MlpNN, self).__init__() self.net = nn.Sequential() self.net.add_module("lin_0", nn.Linear(in_dim, hidden_dims[0])) self.net.add_module("relu_0", nn.ReLU()) for layer_id in range(1, len(hidden_dims)): self.net.add_module("lin_"+str(layer_id), nn.Linear(hidden_dims[layer_id-1], hidden_dims[layer_id])) self.net.add_module("relu_"+str(layer_id), nn.ReLU()) def forward(self, x): return self.net(x)