如何提取LSTM生成的每个隐藏向量的第一个分量?
提取LSTM每个时间步隐藏向量的第一个分量
嘿,你的理解完全没错!outputs确实是一个包含timesteps个2D张量的列表,每个张量的形状是[batch_size, num_units],对应每个时间步的隐藏状态h。要提取每个隐藏向量的第一个分量,其实很容易实现,这里给你两种常用的方法:
方法一:先转成3D张量再索引(最贴近你想要的写法)
既然你习惯类似outputs[:, :, 0]的索引方式,我们可以先把outputs列表堆叠成一个3D张量,再进行索引操作:
# 将outputs列表堆叠为3D张量,形状变为 [batch_size, timesteps, num_units] outputs_3d = tf.stack(outputs, axis=1) # 提取每个时间步隐藏向量的第一个分量,结果形状为 [batch_size, timesteps] first_components = outputs_3d[:, :, 0]
这里tf.stack(outputs, axis=1)会把列表中每个时间步的2D张量沿着时间步维度(axis=1)拼接,正好得到和输入X结构对应的3D张量,之后就可以用你熟悉的多维索引语法提取目标分量了。
方法二:遍历列表提取后再堆叠
如果你不想转换为3D张量,也可以直接遍历outputs列表,逐个提取每个时间步隐藏向量的第一个分量,最后再把结果堆叠起来:
# 遍历每个时间步的输出张量,提取第一个分量,得到一个[batch_size]张量的列表 first_components_list = [out[:, 0] for out in outputs] # 将列表堆叠为2D张量,形状为 [batch_size, timesteps] first_components = tf.stack(first_components_list, axis=1)
这种方法和方法一的结果完全一致,只是实现路径不同。
补充:和输入向量X结合的小技巧
如果要把提取的分量和输入X结合,由于X的形状是[None, timesteps, num_input],而first_components是[None, timesteps],我们需要先给它扩展一个维度,再进行拼接:
# 扩展最后一个维度,形状变为 [batch_size, timesteps, 1] first_components_expanded = tf.expand_dims(first_components, axis=-1) # 和输入X在最后一维拼接,结果形状为 [batch_size, timesteps, num_input + 1] combined_tensor = tf.concat([X, first_components_expanded], axis=-1)
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

