建模:
深度学习框架
搭建食物音频识别用的Keras 是一个用 Python 编写的高级神经网络 API, 现在Keras已经和TensorFlow合并,可以通过TensorFlow来调用。
1 网络结构搭建:
Keras 的核心数据结构是 model,一种组织网络层的方式。最简单的模型是 Sequential 顺序模型,它由多个网络层线性堆叠。对于更复杂的结构,可以查看Keras 函数式 API,它允许构建任意的神经网络图。
Sequential模型可以直接通过如下两行代码搭建:
from keras.models import Sequential
model = Sequential()
2 搭建CNN网络:
卷积神经网络CNN的结构一般包含这几个层:
1)输入层:用于数据的输入;
2)卷积层:使用卷积核进行特征提取和特征映射------>可以多次重复使用;
3)激励层:由于卷积也是一种线性运算,因此需要增加非线性映射(也就是激活函数);
4)池化层:进行下采样,对特征图稀疏处理,减少数据运算量----->可以多次重复使用;
5)Flatten操作:将二维的向量,拉直为一维的向量,从而可以放入下一层的神经网络中;
6)全连接层:通常在CNN的尾部进行重新拟合,减少特征信息的损失----->DNN网络。
对于Keras操作中,可以简单地使用 .add() ,将需要搭建的神经网络的layer堆砌起来,像搭积木一样:
如果需要,你还可以进一步地配置你的优化器.complies())。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)。
# 编译模型,设置损失函数,优化方法以及评价标准
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
CNN模型训练与测试
模型训练
1 批量的在之前搭建的模型上训练:
# 训练模型
model.fit(X_train, Y_train, epochs = 90, batch_size = 50, validation_data = (X_test, Y_test))
2 查看网络的统计信息
model.summary()
预测测试集
1 新的数据生成预测
def extract_features(test_dir, file_ext="*.wav"):
feature = []
for fn in tqdm(glob.glob(os.path.join(test_dir, file_ext))[:]): # 遍历数据集的所有文件
X, sample_rate = librosa.load(fn,res_type='kaiser_fast')
mels = np.mean(librosa.feature.melspectrogram(y=X,sr=sample_rate).T,axis=0) # 计算梅尔频谱(mel spectrogram),并把它作为特征
feature.extend([mels])
return feature
2 保存预测的结果
X_test = extract_features('./test_a/')
X_test = np.vstack(X_test)
predictions = model.predict(X_test.reshape(-1, 16, 8, 1))
preds = np.argmax(predictions, axis = 1)
preds = [label_dict_inv[x] for x in preds]
path = glob.glob('./test_a/*.wav')
result = pd.DataFrame({'name':path, 'label': preds})
result['name'] = result['name'].apply(lambda x: x.split('/')[-1])
result.to_csv('submit.csv',index=None)
!ls ./test_a/*.wav | wc -l
!wc -l submit.csv