【问题标题】:Keras' fit_generator extra training valueKeras 的 fit_generator 额外训练值
【发布时间】:2017-09-18 10:16:00
【问题描述】:
train_datagen = ImageDataGenerator(
                    rescale=1./255,
                    shear_range=0.1,
                    zoom_range=0.1,
                    rotation_range=5.,
                    width_shift_range=0.1,
                    height_shift_range=0.1)

val_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
                    train_data_dir,
                    target_size = (img_width, img_height),
                    batch_size = 20,
                    shuffle = True,
                    classes = TYPES,
                class_mode = 'categorical')

validation_generator = val_datagen.flow_from_directory(
                    val_data_dir,
                    target_size=(img_width, img_height),
                    batch_size=20,
                    shuffle = True,
                    classes = TYPES,
                    class_mode = 'categorical')

model.fit_generator(
                train_generator,
                samples_per_epoch = 2000,
                nb_epoch = 20
            )

Epoch 14/50
 480/2000 [======>.......................] - ETA: 128s - loss: 0.8708

Epoch 13/50
2021/2000 [==============================] - 171s - loss: 0.7973 - acc: 0.7041 

我的 ImageGenerators 从文件夹中读取 2261 个训练图像和 567 个测试图像。我正在尝试使用 2000 个samples_per_epoch 和 20 个 batch_size 来训练我的模型。 Batch_size 对于 samples_per_epoch 是可整除的,但不知何故它增加了额外的价值并显示警告:

( UserWarning: E​​poch 包含超过 samples_per_epoch 个样本, 可能会影响学习效果。正确设置samples_per_epoch 以避免此警告)。

它适用于单 Gpu,但如果我尝试训练 使用 Multi-Gpus 时会出现该错误:

InvalidArgumentError(参见上面的回溯):不兼容的形状: [21] 与 [20] [[节点:等于 = 等于 [T=DT_INT64, _device="/job:localhost/replica:0/task:0/gpu:0"](ArgMax, ArgMax_1)]] [[节点:梯度/concat_25_grad/Slice_1/_10811 = _Recvclient_terminated=false, recv_device="/job:localhost/replica:0/task:0/gpu:1", send_device="/job:localhost/replica:0/task:0/cpu:0", send_device_incarnation=1, tensor_name="edge_101540_gradients/concat_25_grad/Slice_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:1"]]

我正在使用 code 进行模型并行化:

感谢您的帮助...

【问题讨论】:

  • 你有多少个 GPU?
  • 我有 4xK80 GPU

标签: python python-3.x tensorflow deep-learning keras


【解决方案1】:

问题是有 4 个 GPU,而训练集不能被 4(GPU 数量)整除,2261 /4 =565.25。最好的办法是让训练集可以被 4 * 20 (# of GPU * Batch_size) 整除。由于代码对多个 GPU 使用数据并行性,因此无法在 4 个 GPU 之间平均分割训练集。尝试使您的训练和验证集可被 4 整除。

验证和预测也是如此。当其他 GPU 工作时,您不能让一个或多个 GPU 空闲。

这也是单 CPU 工作的原因,因为不需要划分训练数据。

【讨论】:

    【解决方案2】:

    训练数据的数量必须是相同的samples_per_poch×batch_size。 通过减少一条数据,请将培训数据的数量达到2260。 stable_per_epoch = 113. batch_size = 20

    【讨论】:

      【解决方案3】:

      尝试将 samples_per_epoch 更改为 your_train_data.shape[0]

      【讨论】:

      • 您是指训练数据中的图像数量吗?像2261?它不能被批量大小整除
      • 你可以先试试
      猜你喜欢
      • 2020-03-20
      • 2020-03-06
      • 2021-12-25
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 2023-03-22
      • 2018-05-01
      相关资源
      最近更新 更多