如标题所述,如果我将 pytorch 神经网络中的隐藏层数量更改为与输入节点数量不同的任何值,则会返回以下错误。
运行时错误:mat1 和 mat2 形状无法相乘(380x10 和 2x10)
我认为该架构的编码不正确,但我对 pytorch 和神经网络相对较新,所以我无法发现错误。非常感谢任何帮助,我已经包含了下面的代码
class FCN(nn.Module):
def __init__(self, N_INPUT, N_OUTPUT, N_HIDDEN, N_LAYERS):
super().__init__()
activation = nn.Tanh
self.fcs = nn.Sequential(*[
nn.Linear(N_INPUT, N_HIDDEN),
activation()])
self.fch = nn.Sequential(*[
nn.Sequential(*[
nn.Linear(N_INPUT, N_HIDDEN),
activation()]) for _ in range(N_LAYERS-1)])
self.fce = nn.Linear(N_INPUT, N_HIDDEN)
def forward(self, x):
x = self.fcs(x)
x = self.fch(x)
x = self.fce(x)
return x
torch.manual_seed(123)
pinn = FCN(2, 2, 10, 8)
如果 pinn 架构定义为
pinn = FCN(2, 2, 2, 8)
,则不会返回任何错误,但神经网络性能不佳。
其他信息:
如果您需要更多信息,请告诉我,谢谢!
您得到的错误是因为第一层 (
fcs
) 的输出具有维度 N_HIDDEN
(即 10),而 fch
中的隐藏层具有输入维度 N_INPUT
(即 2) .
要解决此问题,您必须确保所有层的输入大小与前一层的输出大小匹配。在你的代码中:
class FCN(nn.Module):
def __init__(self, N_INPUT, N_OUTPUT, N_HIDDEN, N_LAYERS):
super().__init__()
activation = nn.Tanh
self.fcs = nn.Sequential(
nn.Linear(N_INPUT, N_HIDDEN),
activation()
)
self.fch = nn.Sequential(*[
nn.Sequential(
nn.Linear(N_HIDDEN, N_HIDDEN), # Adjust input size to N_HIDDEN
activation()
) for _ in range(N_LAYERS - 1)
])
self.fce = nn.Linear(N_HIDDEN, N_OUTPUT) # Output layer
def forward(self, x):
x = self.fcs(x)
x = self.fch(x)
x = self.fce(x)
return x
最后,为了获得良好的性能,您应该调整隐藏大小(不仅仅是 2 到 10 之间,您还可以尝试 100 或 1000)和优化器的学习率。