如何将Librosa提取的多特征堆叠为多通道Numpy数组供CNN使用?
解决多通道音频特征堆叠以输入Keras CNN的问题
嘿,我明白你现在的需求——把两个同形状的单通道音频特征合并成多通道输入,对吧?你之前用np.vstack()其实没找对方向,咱们来一步步搞定这个问题:
为什么np.vstack()不适用
np.vstack()是在**垂直维度(第一个轴)**堆叠数组,用它处理你的两个(1,128,323,1)数组,会得到(2,128,323,1)的结果——这相当于把两个样本叠在一起,而不是把同一样本的不同特征通道合并,这显然不是CNN需要的输入格式。
正确的堆叠方法:np.concatenate()
CNN的输入格式通常是(batch_size, height, width, channels),咱们需要把两个单通道特征在**最后一个维度(通道维度)**合并,用np.concatenate()指定axis=-1(或者axis=3,因为最后一维索引是3)就可以实现:
举个代码示例:
import numpy as np # 假设你已经提取好两个特征数组 mel_spec = np.random.rand(1, 128, 323, 1) # 对数梅尔频谱 tempogram = np.random.rand(1, 128, 323, 1) # Tempogram特征 # 在通道维度合并 combined_features = np.concatenate([mel_spec, tempogram], axis=-1) # 检查合并后的形状 print(combined_features.shape) # 输出:(1, 128, 323, 2)
验证与后续使用
合并后的数组正好符合Keras CNN的输入要求,你可以在定义模型时指定输入形状:
from keras.models import Sequential from keras.layers import Conv2D model = Sequential() model.add(Conv2D(32, (3,3), activation='relu', input_shape=(128, 323, 2))) # 后续添加其他层...
如果之后还要添加更多同形状的单通道特征,只需要把它们加入concatenate的列表里就行,比如三个特征会得到(1,128,323,3)的结果。
内容的提问来源于stack exchange,提问作者YoungChul
相关产品推荐
相关产品推荐

