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进行模型并行化:
感谢您的帮助......
答案 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可以工作的原因,因为不需要训练数据划分。