Эффективная предварительная обработка данных из файла HDF5 в Керасе - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь понять, что этот парень сделал - в коде здесь - чтобы найти кодировки для изображений шрифтов.

Он использовал Лазанье / Теано но я использую Keras и TF.

Данные хранятся в файле HDF5 размером ~ 14 ГБ, который имеет 4 измерения: (f, k, w, h) - f - индекс шрифтов (50k +) k индекс символа (62) и w а h - ширина и высота фотографии (каждая размером 64x64).

Мне нужно превратить 1-й и 2-й указатель в кодировку «горячий» и свернуть 3-й и 4-й (фото) в 1 измерение. Для этого я создал DataGenerator . Но я подозреваю, что это одно из самых больших узких мест во всей операции. Существует много трудностей при использовании многопроцессорной обработки с HDF5 (я пробовал h5pickle, но не мог устранить ошибки).

Мне было интересно, есть ли способ сделать это эффективно?

В настоящее время каждая эпоха занимает около 20-25 минут на моей машине и 2 часа на моей выделенной машине. Так что любое ускорение может быть полезным.

Вот соответствующий код (полный код в ссылке DataGenerator выше):

def __getitem__(self, index):
    indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]

    # one hot encoding
    fonts = np.zeros((self.batch_size, len(self.hf)))
    chars = np.zeros((self.batch_size, len(self.hf[0])))
    f_i = indexes // len(self.hf[0])
    c_i = indexes % len(self.hf[0])
    fonts[np.arange(len(f_i)), f_i] = 1
    chars[np.arange(len(c_i)), c_i] = 1

    # collapsing of images into 1 array
    targets = np.zeros((self.batch_size, self.hf.shape[2]*self.hf.shape[3]))
    for i in range(self.batch_size):
        targets[i] = self.hf[f_i[i]][c_i[i]].reshape(self.hf.shape[2] * self.hf.shape[3],)

    return [fonts, chars], targets

Вызов: model.fit_generator(data_generator, use_multiprocessing=True, workers=6) выдает ошибки, связанные с травлением и другими полезными вещами, поэтому я вынужден Звоните model.fit_generator(data_generator).

...