Audio Keras中声音数据的自动编码器

Audio Keras中声音数据的自动编码器,audio,keras,autoencoder,Audio,Keras,Autoencoder,我有5个不同类别的声音样本的二维对数标度mel光谱图阵列 对于训练,我在Keras中使用了卷积和密集神经网络。代码如下: model = Sequential() model.add(Conv1D(80, 8, activation='relu', padding='same',input_shape=(60,108))) model.add(MaxPooling1D(2,padding='same',strides=None)) model.add(Flatten()) initializer

我有5个不同类别的声音样本的二维对数标度mel光谱图阵列

对于训练,我在Keras中使用了卷积和密集神经网络。代码如下:

model = Sequential()
model.add(Conv1D(80, 8, activation='relu', padding='same',input_shape=(60,108)))
model.add(MaxPooling1D(2,padding='same',strides=None))
model.add(Flatten())
initializer=initializers.TruncatedNormal()
model.add(Dense(200, activation='relu', kernel_initializer=initializer,bias_initializer=initializer))
model.add(BatchNormalization())
model.add(Dropout(0.8))
model.add(Dense(50, activation='relu', kernel_initializer=initializer,bias_initializer=initializer))
model.add(Dropout(0.8))
model.add(Dense(5, activation='softmax', kernel_initializer=initializer,bias_initializer=initializer))
model.compile(loss='categorical_crossentropy',
          optimizer='adam',lr=0.01,
          metrics=['accuracy'])

我可以将什么样的自动编码器应用于这种类型的数据输入?什么型号?任何建议或代码示例都会有所帮助。:)

由于我没有关于数据性质的问题的答案,我将假设我们有一组形状类似(NSamples,68108)的二维数据。另外,我假设我建议使用卷积2D代替卷积1D的答案是肯定的

以下是卷积自动编码器的模型示例,model,它可以使用经过训练的自动编码器,以及如何使用自动编码器的权重作为最终模型:

from keras.layers.core import Dense, Dropout, Flatten, Reshape
from keras.layers import Conv1D, Conv2D, Deconv2D, MaxPooling1D, MaxPooling2D, UpSampling2D, Conv2DTranspose, Flatten, BatchNormalization, Dropout
from keras.callbacks import ModelCheckpoint
import keras.models as models
import keras.initializers as initializers
from sklearn.model_selection import train_test_split

ae = models.Sequential()
#model.add(Conv1D(80, 8, activation='relu', padding='same',input_shape=(60,108)))
#encoder
c = Conv2D(80, 3, activation='relu', padding='same',input_shape=(60, 108, 1))
ae.add(c)
ae.add(MaxPooling2D(pool_size=(2, 2), padding='same', strides=None))
ae.add(Flatten())
initializer=initializers.TruncatedNormal()
d1 = Dense(200, activation='relu', kernel_initializer=initializer,bias_initializer=initializer)
ae.add(d1)
ae.add(BatchNormalization())
ae.add(Dropout(0.8))
d2 = Dense(50, activation='relu', kernel_initializer=initializer,bias_initializer=initializer)
ae.add(d2)
ae.add(Dropout(0.8))
#decodser
ae.add(Dense(d2.input_shape[1], activation='sigmoid'))
ae.add(Dense(d1.input_shape[1], activation='sigmoid'))
ae.add(Reshape((30, 54, 80)))
ae.add(UpSampling2D((2,2)))
ae.add(Deconv2D(filters= c.filters, kernel_size= c.kernel_size, strides=c.strides, activation=c.activation, padding=c.padding, ))
ae.add(Deconv2D(filters= 1, kernel_size= c.kernel_size, strides=c.strides, activation=c.activation, padding=c.padding, ))
ae.compile(loss='binary_crossentropy',
optimizer='adam',lr=0.001,
metrics=['accuracy'])
ae.summary()
#now train your convolutional autoencoder to reconstruct your input data
#reshape your data to (NSamples, 60, 108, 1)
#Then train your autoencoder. it can be something like that:
#X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=43)
#pre_mcp = ModelCheckpoint("CAE.hdf5", monitor='val_accuracy', verbose=2, save_best_only=True, mode='max')
#pre_history = ae.fit(X_train, X_train, epochs=100, validation_data=(X_val, X_val), batch_size=22, verbose=2, callbacks=[pre_mcp])

#model
model = models.Sequential()
#model.add(Conv1D(80, 8, activation='relu', padding='same',input_shape=(60,108)))
model.add(Conv2D(80, 3, activation='relu', padding='same',input_shape=(60, 108, 1)))
model.add(MaxPooling2D(pool_size=(2, 2), padding='same',strides=None))
model.add(Flatten())
initializer=initializers.TruncatedNormal()
model.add(Dense(200, activation='relu', kernel_initializer=initializer,bias_initializer=initializer))
model.add(BatchNormalization())
model.add(Dropout(0.8))
model.add(Dense(50, activation='relu', kernel_initializer=initializer,bias_initializer=initializer))
model.add(Dropout(0.8))
model.add(Dense(5, activation='softmax', kernel_initializer=initializer,bias_initializer=initializer))
model.compile(loss='categorical_crossentropy',
optimizer='adam',lr=0.001,
metrics=['accuracy'])
#Set weights              
model.layers[0].set_weights(ae.layers[0].get_weights())       
model.layers[3].set_weights(ae.layers[3].get_weights())  
model.layers[4].set_weights(ae.layers[4].get_weights())  
model.layers[6].set_weights(ae.layers[6].get_weights())  
model.summary()
#Now you can train your model with pre-trained weights from autoencoder
这样的模型对我使用MNIST数据集很有用,并且与使用随机权重初始化的模型相比,使用自动编码器的初始权重提高了模型的精度

然而,我建议使用几个卷积/反卷积层,可能是3个或更多,因为根据我的经验,具有3个或更多卷积层的卷积自动编码器比具有1个卷积层的效率更高。事实上,对于一个卷积层,有时我甚至看不到任何精度的提高

更新:

我用Emanuela提供的数据检查了auto encoder,也用不同的auto encoder架构检查了它,但没有成功

我的假设是,数据不包含任何重要的特征,这些特征可以通过自动编码器甚至CAE来区分

然而,我对数据的二维性质的假设似乎得到了几乎99.99%的验证准确率的证实:

然而,同时,97.31%的训练数据准确率可以表明数据集可能存在的问题,因此对其进行修改似乎是一个好主意

此外,我建议使用网络集成。例如,您可以使用不同的验证数据训练10个网络,并为投票最多的类别的项目分配一个类别

这是我的密码:

from keras.layers.core import Dense, Dropout, Flatten
from keras.layers import Conv2D, BatchNormalization
from keras.callbacks import ModelCheckpoint
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split
import keras.models as models
import keras.initializers as initializers
import msgpack
import numpy as np

with open('SoundDataX.msg', "rb") as fx,open('SoundDataY.msg', "rb") as fy: 
    dataX=msgpack.load(fx) 
    dataY=msgpack.load(fy)

num_samples = len(dataX)
x = np.empty((num_samples, 60, 108, 1), dtype = np.float32)
y = np.empty((num_samples, 4), dtype = np.float32)

for i in range(0, num_samples):
    x[i] = np.asanyarray(dataX[i]).reshape(60, 108, 1)
    y[i] = np.asanyarray(dataY[i])

X_train, X_val, y_train, y_val = train_test_split(x, y, test_size=0.2, random_state=43)

#model
model = models.Sequential()
model.add(Conv2D(128, 3, activation='relu', padding='same',input_shape=(60, 108, 1)))
model.add(Conv2D(128, 5, activation='relu', padding='same',input_shape=(60, 108, 1)))
model.add(Conv2D(128, 7, activation='relu', padding='same',input_shape=(60, 108, 1)))
model.add(Flatten())
initializer=initializers.TruncatedNormal()
model.add(Dense(200, activation='relu', kernel_initializer=initializer,bias_initializer=initializer))
model.add(BatchNormalization())
model.add(Dropout(0.8))
model.add(Dense(50, activation='relu', kernel_initializer=initializer,bias_initializer=initializer))
model.add(Dropout(0.8))
model.add(Dense(4, activation='softmax', kernel_initializer=initializer,bias_initializer=initializer))
model.compile(loss='categorical_crossentropy',
optimizer=Adam(lr=0.0001),
metrics=['accuracy'])
model.summary()
filepath="weights-{epoch:02d}-{val_acc:.7f}-{acc:.7f}.hdf5"
mcp = ModelCheckpoint(filepath, monitor='val_acc', verbose=2, save_best_only=True, mode='max')
history = model.fit(X_train, y_train, epochs=100, validation_data=(X_val, y_val), batch_size=64, verbose=2, callbacks=[mcp])

我认为您可能可以使用卷积3D Keras层,例如,您可以从一个简单的卷积网络开始,第一层16个3x3x3内核,第二层16个5x5x5内核+使用softmax输出添加简单MLP。我将提供一个精确的答案与代码样本为您的数据,如果你可以分享它。然而,在此之前,您可以在我的问题中看到图像的CAE示例-我共享了我的模型,该模型现在有点变化,因为输入数据是2d数组。我期待着收到你的一些建议。谢谢你为什么用Conv1D处理二维数据?我建议使用Conv2D,因为我们有二维数据特性。应该会有更好的结果。但是我不能检查,因为我没有数据要检查。但是,如果您不介意使用Conv2D,我可以建议您使用一些模型来检查Conv2D,但是如果我有数据要测试,我可以给您更精确的答案,因为好的模型应该考虑数据的性质我如何与您共享数据集?对不起,我对stackoverflow一无所知。你可以将它上传到google drive,并将你的文件分享给所有有链接的人,然后将此链接添加到你的问题或评论中的帖子中。然而,基于以上关于数据性质的假设,我已经准备了可能不是很精确的答案。所以,你可以先检查一下,但是,如果你不能建立你的模型或者准备成功的训练数据,请考虑通过链接分享你的数据,这样我就能帮助你。