Я тренирую модель классификации изображений на наборе данных 260K изображений с использованием Keras. Раньше я сохранял обработанные данные изображений для выбора файлов и писал генератор для загрузки их в модель. Затем я обнаружил, что чтение данных из файла HDF5 в два раза быстрее, чем чтение из файла рассола. Поэтому я сохранил данные в файлы HDF5 и изменил генератор так, чтобы он считывал и загружал данные из файлов HDF5 вместо файлов Pickle. Но скорость тренировки стала намного медленнее, чем раньше. Пожалуйста, может кто-нибудь сказать мне, почему и помочь мне решить проблему?
Конверт: Keras 2.2.4, h5py 2.8.0, маринованные огурцы 0.7.8, numpy 1.15.4
Я вручную проверил стоимость времени. Тип вывода из генератора был одинаковым для обоих способов (numpy.darray, dtype = np.float64), и я подтвердил, что скорость чтения HDF5 в два раза выше, чем Pickle.
# Before, the parameters were x and y corresponding to the pickle files
def img_generator(batches):
while True:
for batch in batches:
data_batch = h5py.File(batch, 'r')
img_batch = data_batch['x'][()]
label_batch = data_batch['y'][()]
# img_batch = pk.load(open(x, 'br'))
# label_batch = pk.load(open(y, 'br'))
yield img_batch, label_batch
# Read data file paths
batch_fps = glob(IMG_DIR + 'batch_*')
batches_h5 = sorted(batch_fps, key=lambda x: int(x.split('_')[-1][:-3]))
# Build model and train
resnet_50 = ResnetBuilder.build_resnet_50((512, 512, 3), n_classes)
parallel_model = multi_gpu_model(resnet_50, GPU_COUNT) # GPU_COUNT=4
parallel_model.compile(loss='categorical_crossentropy',
optimizer=SGD(lr=0.01, momentum=0.9, decay=0, nesterov=True),
metrics=['accuracy', f1])
parallel_model.fit_generator(generator=img_generator(batches_h5),
epochs=NUM_EPOCH, steps_per_epoch=STEPS_PER_EPOCH,
callbacks=[checkpoint])
Я ожидаю, что стоимость обучения будет на 30 минут быстрее, чем раньше, но она стала на 2 часа медленнее (раньше, чем 3,5 часа).