使用 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_ig和W_io都具有相同的形状。这些矩阵将输入张量投影到与隐藏状态相同的 space 中,以便将它们相加。
回到你的具体问题,正如另一个答案所指出的,这可能是你代码另一部分的错误。如果不查看您的 forward
实施,就很难说出问题到底是什么。
我有:
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_ig和W_io都具有相同的形状。这些矩阵将输入张量投影到与隐藏状态相同的 space 中,以便将它们相加。
回到你的具体问题,正如另一个答案所指出的,这可能是你代码另一部分的错误。如果不查看您的 forward
实施,就很难说出问题到底是什么。