Keras' fit_generator额外训练值

时间:2017-04-21 12:02:06

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

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:Epoch包含超过samples_per_epoch个样本,   这可能会影响学习成果。正确设置samples_per_epoch   避免这种警告)。

它适用于Single-Gpu但是如果我尝试训练 使用Multi-Gpus会出现错误:

  

InvalidArgumentError(参见上面的回溯):不兼容的形状:   [21] vs. [20] [[节点:等于=等于[T = DT_INT64,   _device =" / job:localhost / replica:0 / task:0 / gpu:0"](ArgMax,ArgMax_1)]] [[Node:gradients / concat_25_grad / Slice_1 / _10811 =   _Recvclient_terminated = false,recv_device =" / job:localhost / replica:0 / task:0 / gpu:1",   send_device =" /作业:本地主机/复制:0 /任务:0 / CPU:0&#34 ;,   send_device_incarnation = 1,   tensor_name =" edge_101540_gradients / concat_25_grad / Slice_1&#34 ;,   tensor_type = DT_FLOAT,   _device =" /作业:本地主机/复制:0 /任务:0 / GPU:1"]]

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

感谢您的帮助......

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

训练数据的数量必须等于samples_per_epoch×batch_size。 请通过减少一个数据将训练数据的数量设为2260。 steps_per_epoch = 113 的batch_size = 20

答案 2 :(得分:0)

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

对于验证和谓词也是如此。您不能让一个或多个GPU闲置而其他GPU仍在工作。

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