正如标题所说,如果我将我的pytorch神经网络中的隐藏层数更改为与输入 node 数不同的任何值,它将返回以下错误.

运行时错误:mat1和mat2形状不能相乘(380x10和2x10)

我认为体系 struct 编码错误,但我对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体系 struct 定义为pinn = FCN(2, 2, 2, 8),则不会返回错误,但神经网络的性能不佳.

其他信息:

  • 输入是批量大小为380的矩阵张量

如果您需要更多的信息,请让我知道,谢谢!

推荐答案

您得到的错误是因为第一个层(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之间,你也可以try 100或1000),层数(从1或2开始,而不是8)和优化器的学习率.

Python相关问答推荐

韦尔福德方差与Numpy方差不同

Matlab中是否有Python的f-字符串等效物

使用miniconda创建环境的问题

numpy卷积与有效

PyQt5,如何使每个对象的 colored颜色 不同?'

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

使用groupby方法移除公共子字符串

名为__main__. py的Python模块在导入时不运行'

以逻辑方式获取自己的pyproject.toml依赖项

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

如何在海上配对图中使某些标记周围的黑色边框

使用__json__的 pyramid 在客户端返回意外格式

以异步方式填充Pandas 数据帧

在Python中控制列表中的数据步长

如何在GEKKO中使用复共轭物

ModuleNotFoundError:Python中没有名为google的模块''

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

Pythonquests.get(Url)返回Colab中的空内容

利用广播使减法更有效率

如何将django url参数传递给模板&S url方法?