使用 PyTorch LSTM,我可以使用与 input_size 不同的 hidden_size 吗?

With a PyTorch LSTM, can I have a different hidden_size than input_size?

我有:

    def __init__(self, feature_dim=15, hidden_size=5, num_layers=2):
        super(BaselineModel, self).__init__()
        self.num_layers = num_layers
        self.hidden_size = hidden_size

        self.lstm = nn.LSTM(input_size=feature_dim,
                            hidden_size=hidden_size, num_layers=num_layers)

然后我得到一个错误:

RuntimeError: The size of tensor a (5) must match the size of tensor b (15) at non-singleton dimension 2

如果我将两个尺寸设置为相同,那么错误就会消失。但我想知道我的 input_size 是否是一个很大的数字,比如 15,而我想将隐藏功能的数量减少到 5,为什么那行不通?

它应该可以工作,错误可能来自其他地方。 例如这项工作:

        feature_dim = 15
        hidden_size = 5
        num_layers = 2
        seq_len = 5
        batch_size = 3
        lstm = nn.LSTM(input_size=feature_dim,
                                    hidden_size=hidden_size, num_layers=num_layers)

        t1 = torch.from_numpy(np.random.uniform(0,1,size=(seq_len, batch_size, feature_dim))).float()
        output, states = lstm.forward(t1)
        hidden_state, cell_state = states
        print("output: ",output.size())
        print("hidden_state: ",hidden_state.size())
        print("cell_state: ",cell_state.size())

和return

    output:  torch.Size([5, 3, 5])
    hidden_state:  torch.Size([2, 3, 5])
    cell_state:  torch.Size([2, 3, 5])

你在 lstm 之后的某处使用输出吗?您是否注意到它的大小等于 hidden dim,即 last dim 上的 5?看起来你在使用它之后认为它的大小为 15 而不是

简短的回答是:是的,input_size 可以不同于 hidden_size

要获得详细的答案,请查看 PyTorch documentations 中的 LSTM 公式,例如:

这是计算i_t的公式,一层的第t时间步的输入激活.这里矩阵W_ii的形状为(hidden_size x input_size)。同样在其他公式中,矩阵 W_if, W_igW_io都具有相同的形状。这些矩阵将输入张量投影到与隐藏状态相同的 space 中,以便将它们相加。

回到你的具体问题,正如另一个答案所指出的,这可能是你代码另一部分的错误。如果不查看您的 forward 实施,就很难说出问题到底是什么。