训练声音定位神经网络

数据挖掘 神经网络 深度学习 喀拉斯 张量流 音频识别
2022-03-01 21:08:05

我正在尝试训练一个神经网络,以估计声音来自的位置(以 0 到 180 度为单位)。

我在 python 中使用 TensorFlow Keras 来训练模型。

输入数据是两个双耳提示,特别是 ILD(耳间电平差)和 ITD(耳间时间差),每个向量由上述两个特征组成,具有维度 [1,71276]。我总共有 2639 次测量,其中 10% 用作验证数据,另外 10% 用作测试数据。

输出应该是 [0,180] 范围内的角度。

我已经对 [-1, 1] 范围内的数据进行了标准化,我能够实现的最佳损失是 MSE = 16。

获得最高 MSE 的模型如下:

model = tf.keras.Sequential(([
    tf.keras.layers.Input(shape=(71276,), name='input'),

    tf.keras.layers.Dense(units=900,activation='relu', name='dense_1'),
    tf.keras.layers.Dense(units=360,activation='relu', name='dense_2'),
    tf.keras.layers.Dense(units=180,activation='relu', name='dense_3'),

    tf.keras.layers.Dense(units=1,activation='linear', name='output')
]))

model.compile(loss='mse',
              optimizer=tf.keras.optimizers.Adam(lr=0.001),
              metrics=['mae'])

EPOCHS = 500
BATCH_SIZE = 32

callbacks = [
    tf.keras.callbacks.EarlyStopping(monitor='val_loss', mode='min', min_delta=0.5, patience=100, verbose=1),
    tf.keras.callbacks.ModelCheckpoint('best_model.h5', monitor='val_loss', mode='min', save_best_only=True),
    tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=50, verbose=1, mode='min', min_delta=2, cooldown=0, min_lr=0.000001)
]

history = model.fit(X_train, y_train, validation_data=(X_val,y_val), shuffle=True,
                    batch_size=BATCH_SIZE, 
                    epochs=EPOCHS, verbose=1,
                    callbacks=callbacks)

由于这是我使用自己的数据训练的第一个神经网络,我想知道我是否遗漏了任何可以减少损失函数的明显内容,如果没有,欢迎提出任何建议!

我应该注意,我正在使用 google collaboratory,并且我已经尝试添加另一个隐藏层,但我遇到了内存不足错误。我也尝试过增加/减少每一层的神经元数量,但没有得到更好的结果,我也尝试使用 CNN 架构,但收效甚微,因为它在 300 个 epoch 之后甚至没有收敛。

提前致谢!

1个回答

更改激活层,使用 sigmoid 或 Tanh 作为最后一层。

我会再次尝试 CNN,但使用不同的步幅、过滤器大小和过滤器数量。CNN 的问题在于,因为每层的特征更少,所以可以拥有更多的层。

这是用于音频的卷积层的示例:

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.optimizers import SGD
from keras.layers.advanced_activations import LeakyReLU
model = Sequential()
model.add(Conv2D(16, (3,3), padding='same', input_shape=(513, 25, 1)))
model.add(LeakyReLU())
model.add(Conv2D(16, (3,3), padding='same'))
model.add(LeakyReLU())
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
model.add(Conv2D(16, (3,3), padding='same'))
model.add(LeakyReLU())
model.add(Conv2D(16, (3,3), padding='same'))
model.add(LeakyReLU())
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(64))
model.add(LeakyReLU())
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

如果您有时间,请尝试训练 LSTM 层。