Keras分批加载声音实例

时间:2018-03-18 15:15:28

标签: python keras

我需要帮助,试图找出如何使用Keras实现批量加载。

到目前为止,我正试图与Keras CNN合作制作歌曲分类器。我已经为下面的10种类型分类建立了这个模型。

model = Sequential()

model.add(Conv1D(16, 5, padding="same", input_shape=(1, 661500)))
model.add(Activation("relu"))
model.add(MaxPool1D(pool_size=2, padding="same"))

model.add(Conv1D(16, 5, padding="same"))
model.add(Activation("relu"))
model.add(MaxPool1D(pool_size=2, padding="same"))

model.add(Conv1D(16, 5, padding="same"))
model.add(Activation("relu"))
model.add(MaxPool1D(pool_size=2, padding="same"))

model.add(Flatten())
model.add(Dense(128))
model.add(Activation("relu"))
model.add(Dense(10))
model.add(Activation("softmax"))

model.compile(optimizer="adam",
              loss="categorical_crossentropy",
              metrics=["accuracy"])

当我自己加载实例和标签但我的电脑无法同时处理1000首歌曲时,它正在工作。我尝试使用ImageDataGenerator以flow_from_directory批量加载它们。代码如下:

generator = ImageDataGenerator()
train_generator = generator.flow_from_directory("train",
                                                target_size=(1, 661500),
                                                batch_size=64,
                                                class_mode="categorical")
test_generator = generator.flow_from_directory("test",
                                               target_size=(1, 661500),
                                               batch_size=64,
                                               class_mode="categorical")

model.fit_generator(train_generator,
                    steps_per_epoch=5584,
                    epochs=10,
                    validation_data=test_generator,
                    validation_steps=1861)

我遇到了音频文件不是图像的问题所以我将.wav添加到白名单文件格式

\keras\Lib\site-packages\keras\preprocessing\image.py

这让Keras找到了音频图像,但它无法真正打开它们。我改变了使用Pillow到Librosa打开它们的地方,但它会产生更多错误。我不认为我可以改变所有这些,所以我想知道是否有办法实现批量加载?

编辑:我来到this question,它指向Keras sequences我实施了一个,如下所示。

class MySequence(Sequence):

    def __init__(self, x_files, y_files, batch_size):
        self.x, self.y = x_files, y_files
        self.batch_size = batch_size

    def __len__(self):
        from numpy import ceil
        return int(ceil(len(self.x) / float(self.batch_size)))

    def __getitem__(self, idx):
        from librosa import load
        from numpy import array, expand_dims
        batch_x = self.x[idx * self.batch_size:(idx + 1) * self.batch_size]
        batch_y = self.y[idx * self.batch_size:(idx + 1) * self.batch_size]

        return expand_dims(array([load(file_name)[0] for file_name in batch_x]), axis=1), array(batch_y)

这次火车时间变得非常漫长。以前,10个时期在3个小时内完成,但现在一个时期需要14个小时。我有什么办法可以减少火车时间吗?

编辑2:更改了fit_generator函数中的steps_per_epoch参数,并且它已降至可接受的水平。

1 个答案:

答案 0 :(得分:0)

似乎IO就是问题所在。也许将你的数据序列化为像pickle这样的东西,看看培训是否变得更快。

Step_per_epoch只是简化了你纪元的步骤。因此,您的培训速度不会提高,因为您不能在每个时代使用所有数据。