Логично ли зацикливаться на model.fit в Керасе? - PullRequest
0 голосов
/ 21 мая 2018

Логично ли сделать так, как показано ниже в Keras, чтобы не исчерпать память?

for path in ['xaa', 'xab', 'xac', 'xad']:
    x_train, y_train = prepare_data(path)
    model.fit(x_train, y_train, batch_size=50, epochs=20, shuffle=True)

model.save('model')

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Я бы посоветовал взглянуть на эту нить на Github.

Вы действительно могли бы рассмотреть возможность использования model.fit(), но это сделало бы тренировку более стабильной, чтобы сделать это в такой ситуации.путь:

for epoch in range(20):
    for path in ['xaa', 'xab', 'xac', 'xad']:
        x_train, y_train = prepare_data(path)
        model.fit(x_train, y_train, batch_size=50, epochs=epoch+1, initial_epoch=epoch, shuffle=True)

Таким образом, вы перебираете все свои данные один раз за эпоху, а не перебираете 20 эпох по части своих данных перед переключением.

Как обсуждалось в теме, другойРешением было бы разработать собственный генератор данных и использовать его с model.fit_generator().

0 голосов
/ 21 мая 2018

Да, но предпочитают model.train_on_batch, если каждая итерация генерирует один пакет.Это устраняет некоторые накладные расходы, которые идут с fit.

Вы также можете попробовать создать генератор и использовать model.fit_generator():

def dataGenerator(pathes, batch_size):

    while True: #generators for keras must be infinite
        for path in pathes:
            x_train, y_train = prepare_data(path)

            totalSamps = x_train.shape[0]
            batches = totalSamps // batch_size

            if totalSamps % batch_size > 0:
                batches+=1

            for batch in range(batches):
                section = slice(batch*batch_size,(batch+1)*batch_size)
                yield (x_train[section], y_train[section])

Создать и использовать:

gen = dataGenerator(['xaa', 'xab', 'xac', 'xad'], 50)
model.fit_generator(gen,
                    steps_per_epoch = expectedTotalNumberOfYieldsForOneEpoch
                    epochs = epochs)
...