如何合并不同维度的音频、文本特征数组得到指定形状后输入LSTM
解决方案
首先你需要先对齐两个特征数组的维度,再按需求拼接,以下是可直接运行的实现代码:
import numpy as np # 模拟你的输入特征 audio_features = np.random.rand(396, 63, 64) text_features = np.random.rand(52, 1, 64) # 1. 对齐音频特征的第二维到64,补0填充 audio_aligned = np.pad(audio_features, ((0,0), (0,1), (0,0)), mode='constant') # 输出形状:(396, 64, 64) # 2. 对齐文本特征的第二维到64,将1步长的特征复制到所有64个步长位置 text_aligned = np.tile(text_features, (1, 64, 1)) # 输出形状:(52, 64, 64) # 3. 补齐最后一维到128,音频特征占前64位,文本特征占后64位 audio_full = np.concatenate([audio_aligned, np.zeros_like(audio_aligned)], axis=-1) text_full = np.concatenate([np.zeros_like(text_aligned), text_aligned], axis=-1) # 4. 拼接第一维得到目标形状的数组 final_input = np.concatenate([audio_full, text_full], axis=0) print(final_input.shape) # 输出 (448, 64, 128)
之前的方法不符合要求的原因
np.column_stack默认按第二维拼接,会自动调整低维数组的形状,无法匹配你的维度要求- 直接使用
np.concatenate((audio_features,text_features), axis=2)时,两个数组的前两维形状不一致,numpy会直接抛出维度不匹配的错误 np.append会先把所有数组拉平成一维再拼接,完全丢失原有的维度结构- 使用
np.tile和np.repeat的组合会把样本数放大到396*52,远大于你需要的448,自然无法得到目标形状
如果你需要的是每个样本同时包含对应音频和文本的融合特征,可以用如下方案,前提是你的396条音频和52条文本是一一对应总448条样本的两部分:
# 对齐第一维到448,同时对齐第二维到64 audio_pad = np.pad(audio_features, ((0,52), (0,1), (0,0)), mode='constant') text_pad = np.pad(text_features, ((396,0), (0,63), (0,0)), mode='constant') # 最后一维直接拼接得到融合特征 final_input = np.concatenate([audio_pad, text_pad], axis=-1) print(final_input.shape) # 输出 (448, 64, 128)
内容的提问来源于stack exchange,提问作者M Umer
相关产品推荐
相关产品推荐

