Keras `fit_generator` 的验证准确度低,而 `fit` 则不然

用户3638629

我有一个用于二元分类问题的数据集,其中两个类都具有相同的表示。由于数据集不适合内存(400 万个数据点),我将其存储为 HDF5 文件,通过fit_generator. 问题是我的验证准确度很低fit_generator,而如果我只是使用fit. 我确实提到过数据集不适合内存,但出于调试目的和本文的其余部分,我只使用了 100k 的 4M 数据点。

由于目标是对完整数据集进行分层 10 倍 CV,我手动将数据集索引划分为训练、验证和评估集的索引。我调用fit_generator一个生成器函数,生成一批训练(或验证)样本和标签,涵盖 HDF5 文件第一季度的指定索引,然后是第二季度,等等。

我知道引擎盖下fit_generator使用的验证部分test_on_batch,就像evaluate_generator. 我还尝试了使用train_on_batchandtest_on_batch方法的解决方案,但结果相同:验证准确度较低fit_generator,但如果将数据集一次性加载到内存中fit验证准确度很高两种情况下模型fitvs fit_generator相同

数据集和模型

我的调试数据集有 ~100k 样本和标签(~50k 类 0 和 ~50k 类 1)。对 75% 的数据进行训练和验证(我有大约 60k 样本用于训练,15k 用于验证)。这两个类在训练和验证样本中平均分布。

这是我使用的非常简单的模型:

input_layer = Input(shape=(2581,), dtype='float32')
hidden_layer = Dense(512, activation='relu', input_shape=(2581, 1))(input_layer)
output_layer = Dense(1, activation='sigmoid')(hidden_layer)

model = Model(inputs=[input_layer], outputs=[output_layer])
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])

fit 效果很好...

由于这个小数据集很容易放入内存,下面是我fit直接使用上面创建的模型的方法;train_idx是训练集valid_idx的索引,是验证集的索引:

model.fit(features[train_idx], labels[train_idx],
          batch_size=128, epochs=5,
          shuffle=True,
          validation_data=(features[valid_idx], labels[valid_idx]))

这是val_acc我得到的fit

58847/58847 [==============================] - 4s 70us/step - loss: 0.4075 - acc: 0.8334 - val_loss: 0.3259 - val_acc: 0.8828
Epoch 2/5
58847/58847 [==============================] - 4s 61us/step - loss: 0.2757 - acc: 0.8960 - val_loss: 0.2686 - val_acc: 0.9039
Epoch 3/5
58847/58847 [==============================] - 4s 61us/step - loss: 0.2219 - acc: 0.9212 - val_loss: 0.2162 - val_acc: 0.9227
Epoch 4/5
58847/58847 [==============================] - 4s 61us/step - loss: 0.1855 - acc: 0.9353 - val_loss: 0.1992 - val_acc: 0.9314
Epoch 5/5
58847/58847 [==============================] - 4s 60us/step - loss: 0.1583 - acc: 0.9456 - val_loss: 0.1763 - val_acc: 0.9390

......但fit_generator没有

我希望得到相同的结果fit_generator

model.fit_generator(generate_data(hdf5_file, train_idx, batch_size),
                    steps_per_epoch=len(train_idx) // batch_size,
                    epochs=5,
                    shuffle=False,
                    validation_data=generate_data(hdf5_file, valid_idx, batch_size),
                    validation_steps=len(valid_idx) // batch_size)

val_acc每个时代我得到的都是一样的,好像只有一个类被不断预测:

460/460 [==============================] - 8s 17ms/step - loss: 0.3230 - acc: 0.9447 - val_loss: 6.9277 - val_acc: 0.4941
Epoch 2/5
460/460 [==============================] - 6s 14ms/step - loss: 0.9536 - acc: 0.8627 - val_loss: 7.1385 - val_acc: 0.4941
Epoch 3/5
460/460 [==============================] - 6s 14ms/step - loss: 0.8764 - acc: 0.8839 - val_loss: 7.0521 - val_acc: 0.4941
Epoch 4/5
460/460 [==============================] - 6s 13ms/step - loss: 0.9005 - acc: 0.8885 - val_loss: 7.0459 - val_acc: 0.4941
Epoch 5/5
460/460 [==============================] - 6s 14ms/step - loss: 0.9259 - acc: 0.8907 - val_loss: 7.0880 - val_acc: 0.4941

注意:

  • generate_data发生器用于训练和测试。
  • fit_generator被调用是shuffle=False因为它是处理改组的生成器(在任何情况下,指定shuffle=True都不会改变val_acc)。

生成器方法

最后一块拼图:发电机。这里,n_parts是 HDF5 文件被拆分为加载的部分数。然后我只保留part那些实际上属于所选的行 - 在当前加载的 HDF5 文件中 - indexes保留的特征 ( partial_features) 和标签 ( partial_labels) 实际上partial_indexes是 HDF5 文件中索引处的行

def generate_data(hdf5_file, indexes, batch_size, n_parts=4):
    part = 0
    with h5py.File(hdf5_file, 'r') as h5:
        dset = h5.get('features')
        part_size = dset.shape[0] // n_parts

    while True:
        with h5py.File(hdf5_file, 'r') as h5:
            dset = h5.get('features')
            dset_start = part * part_size
            dset_end = (part + 1) * part_size if part < n_parts - 1 else dset.shape[0]
            partial_features = dset[dset_start:dset_end, :-1]
            partial_labels = dset[dset_start:dset_end, -1]

        partial_indexes = list()
        for index in indexes:
            if dset_start <= index < dset_end:
                partial_indexes.append(index)
        partial_indexes = np.asarray(partial_indexes)

        offset = part * part_size
        part = part + 1 if part < n_parts - 1 else 0
        if not len(partial_indexes):
            continue

        partial_features = partial_features[partial_indexes - offset]
        partial_labels = partial_labels[partial_indexes - offset]

        batch_indexes = [idx for idx in range(0, len(partial_features), batch_size)]

        random.shuffle(batch_indexes)
        for idx in batch_indexes:
            yield np.asarray(partial_features[idx:idx + batch_size, :]), \
                  np.asarray(partial_labels[idx:idx + batch_size])

我确实尝试过仅对训练集、验证集以及两者都进行改组。我确实尝试过这些与shuffle=Trueshuffle=Falsein 的组合fit_generator除了val_acc可能会有所改变的事实之外,如果我使用fit_generator它仍然基本上在 ~0.5 ,如果我使用fit.

你觉得我的方法有什么问题吗?用我的发电机?任何帮助表示赞赏!

我已经被这个问题困住了 10 天了。或者,我必须使用哪些其他选项(Keras 或其他库)在不适合内存的数据集上训练模型?

用户3638629

我终于弄清楚了这一点,我将发布我的发现以供将来参考,以防其他人偶然发现类似的问题:生成器不是问题,而是HDF5 文件中样本顺序

该模型用于二元分类问题,其中数据集中的标签为零或一。问题在于,HDF5 文件最初包含所有标记为 1 的样本,然后是所有标记为 0 的样本(其中正负样本的数量大致相同)。这意味着当生成器函数将 HDF5 文件拆分为 4 部分时,前两部分仅包含正样本,后两部分仅包含负样本。

如果样本以随机顺序写入 HDF5 文件,使得文件的任何连续部分大致包含相同数量的正样本和负样本,则可以解决此问题。这样,在训练期间的任何给定时间,模型都会以大致相等的比例呈现正负数据

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Keras model.fit_generator() 提供 0.0% 的验证准确度

来自分类Dev

Keras fit_generator运行非常缓慢

来自分类Dev

Keras fit_generator()在Colab上不显示准确性

来自分类Dev

Keras ---在fit_generator()期间冻结训练

来自分类Dev

使用.fit_generator()在keras中训练GAN

来自分类Dev

AsyncResult在tensorflow keras的fit_generator中意外挂起

来自分类Dev

Keras fit_generator(),这是正确的用法吗?

来自分类Dev

fit_generator和fit的精度不同

来自分类Dev

Keras:如何将fit_generator与不同类型的多个输出一起使用

来自分类Dev

使用keras fit_generator的Tensorboard回调,``函数''没有属性``fetch_callbacks''

来自分类Dev

在Keras fit_generator中将shuffle设置为True时,精度会降低

来自分类Dev

Python无法将fit_generator应用于具有多个输入的keras模型

来自分类Dev

Keras fit_generator 使用输入和输出图像生成器“ndim”错误

来自分类Dev

使用 fit_generator 时,Keras 模型的批量大小为 1

来自分类Dev

使用fit_generator拟合keras模型时如何修复“MemoryError”?

来自分类Dev

Keras model.fit 输出中的 acc 是什么意思?一个时期内最终迭代的准确度还是一个时期内的平均准确度?

来自分类Dev

将keras fit_generator与max_queue_size,worker和use_multiprocessing一起使用

来自分类Dev

Keras fit_generator 一次训练一个样本,而我从生成器中输出不止一个样本

来自分类Dev

将批量数据发送到fit_generator

来自分类Dev

fit_generator挂在R的第一步

来自分类Dev

使用class_weight平衡数据-.fit_generator()

来自分类Dev

调用 fit_generator 时出错:python Tensorflow

来自分类Dev

class_weight='auto' for model.fit_generator keras

来自分类Dev

改变 keras 指标=准确度

来自分类Dev

在Keras中多次调用“ fit”

来自分类Dev

使用Tensorflow将学习率添加到fit_generator的历史对象

来自分类Dev

在Tensorflow中应用数据扩充时使用fit_generator()拟合模型时出错

来自分类Dev

使用fit_generator()时如何获取y_true,y_pred?

来自分类Dev

是否有适用于 use_multiprocessing=True 的 fit_generator 的工作示例?

Related 相关文章

  1. 1

    Keras model.fit_generator() 提供 0.0% 的验证准确度

  2. 2

    Keras fit_generator运行非常缓慢

  3. 3

    Keras fit_generator()在Colab上不显示准确性

  4. 4

    Keras ---在fit_generator()期间冻结训练

  5. 5

    使用.fit_generator()在keras中训练GAN

  6. 6

    AsyncResult在tensorflow keras的fit_generator中意外挂起

  7. 7

    Keras fit_generator(),这是正确的用法吗?

  8. 8

    fit_generator和fit的精度不同

  9. 9

    Keras:如何将fit_generator与不同类型的多个输出一起使用

  10. 10

    使用keras fit_generator的Tensorboard回调,``函数''没有属性``fetch_callbacks''

  11. 11

    在Keras fit_generator中将shuffle设置为True时,精度会降低

  12. 12

    Python无法将fit_generator应用于具有多个输入的keras模型

  13. 13

    Keras fit_generator 使用输入和输出图像生成器“ndim”错误

  14. 14

    使用 fit_generator 时,Keras 模型的批量大小为 1

  15. 15

    使用fit_generator拟合keras模型时如何修复“MemoryError”?

  16. 16

    Keras model.fit 输出中的 acc 是什么意思?一个时期内最终迭代的准确度还是一个时期内的平均准确度?

  17. 17

    将keras fit_generator与max_queue_size,worker和use_multiprocessing一起使用

  18. 18

    Keras fit_generator 一次训练一个样本,而我从生成器中输出不止一个样本

  19. 19

    将批量数据发送到fit_generator

  20. 20

    fit_generator挂在R的第一步

  21. 21

    使用class_weight平衡数据-.fit_generator()

  22. 22

    调用 fit_generator 时出错:python Tensorflow

  23. 23

    class_weight='auto' for model.fit_generator keras

  24. 24

    改变 keras 指标=准确度

  25. 25

    在Keras中多次调用“ fit”

  26. 26

    使用Tensorflow将学习率添加到fit_generator的历史对象

  27. 27

    在Tensorflow中应用数据扩充时使用fit_generator()拟合模型时出错

  28. 28

    使用fit_generator()时如何获取y_true,y_pred?

  29. 29

    是否有适用于 use_multiprocessing=True 的 fit_generator 的工作示例?

热门标签

归档