AE-LSTM中如何拼接LSTM输出张量与特征向量得到[b,t,dl+da]形状?
解决LSTM输出与特征向量的时序拼接问题
这是时序建模里非常常见的特征拼接需求,我来给你详细拆解实现步骤,不管你用PyTorch还是TensorFlow都能搞定~
核心思路
要把形状为[b, da]的特征向量拼接到[b, t, dl]的LSTM输出每个时间步上,关键是把特征向量扩展出时间步维度,让它变成[b, t, da],这样两个张量的维度就完全匹配,最后在特征维度(最后一维)拼接即可。
PyTorch实现(推荐用expand节省内存)
PyTorch里可以用unsqueeze先给特征向量加一个时间步维度,再用expand把这个维度扩展到和LSTM输出一致的长度——expand不会复制数据,比repeat更高效,能节省显存:
import torch # 模拟输入数据:batch=32,时间步t=10,LSTM特征维度dl=64,额外特征维度da=32 lstm_out = torch.randn(32, 10, 64) # 形状[b, t, dl] feat_vec = torch.randn(32, 32) # 形状[b, da] # 1. 给特征向量添加时间步维度,变成[b, 1, da] feat_expanded = feat_vec.unsqueeze(1) # 2. 扩展时间步维度到t长度,得到[b, t, da] # 这里的-1表示保持原维度大小,不用手动写死t的值 feat_expanded = feat_expanded.expand(-1, lstm_out.size(1), -1) # 3. 在最后一维拼接两个张量 final_tensor = torch.cat([lstm_out, feat_expanded], dim=-1) # 验证形状:应该是[32, 10, 64+32=96] print(final_tensor.shape) # 输出: torch.Size([32, 10, 96])
TensorFlow实现
TensorFlow里的思路类似,用expand_dims加维度,再用tile或者repeat扩展时间步:
import tensorflow as tf # 模拟输入数据 lstm_out = tf.random.normal((32, 10, 64)) # [b, t, dl] feat_vec = tf.random.normal((32, 32)) # [b, da] # 1. 添加时间步维度,变成[b, 1, da] feat_expanded = tf.expand_dims(feat_vec, axis=1) # 2. 扩展时间步到t长度,得到[b, t, da] feat_expanded = tf.tile(feat_expanded, [1, tf.shape(lstm_out)[1], 1]) # 3. 拼接张量 final_tensor = tf.concat([lstm_out, feat_expanded], axis=-1) # 验证形状 print(final_tensor.shape) # 输出: (32, 10, 96)
内容的提问来源于stack exchange,提问作者user9689925
相关产品推荐
相关产品推荐

