【问题标题】:Keras load sound instances in batchesKeras 批量加载声音实例
【发布时间】:2018-03-19 18:41:38
【问题描述】:

我需要帮助,试图弄清楚如何使用 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 to 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 个 epoch 需要 3 个小时才能完成,但现在一个 epoch 需要 14 个小时。有什么办法可以减少火车时间吗?

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

【问题讨论】:

    标签: python keras


    【解决方案1】:

    似乎 IO 是这里的问题。也许将您的数据序列化为 pickle 之类的东西,看看训练是否变得更快。

    Step_per_epoch 只是在您的 epoch 中减少步长。因此,您的训练不会变得更快,您只是不会在每个 epoch 中使用所有数据。

    【讨论】:

    • 我假设 step_per_epoch 应该是 sample_count / batch_size。当我训练将所有数据加载到 RAM 并使用 fit 函数时,训练进度写为 batch_size/sample_count [=========>...... ....]。你能解释一下为什么在使用序列和普通训练时会有所不同吗?如何使用序列实现正常的训练过程。
    • 我从来没有使用过steps_per_epoch,但是使用Sequence,模型函数不知道batchsize。它只是从序列中接收数据,所以它无法判断第一个维度是 Bathc_size 还是不同的东西。所以它计算调用次数/Sequence.__len__(不是 100% 确定)。条形之外的数字与使用正常拟合函数不同,但这对训练没有任何影响。
    • 据我所知,step 是调用 Sequence.__getitem__ 多少次,所以 batch_size * step_per_epoch = sample_count,就好像我将其保留为默认值一样,keras 将其设置为该值。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多