Как выбрать batch_size, steps_per_epoch и epoch с генератором Keras - PullRequest
0 голосов
/ 27 мая 2019

Я тренирую 2 разных CNN (пользовательское и трансферное обучение) для задачи классификации изображений.Я использую один и тот же генератор для обеих моделей.Набор данных содержит 5000 образцов для 5 классов, но не сбалансирован.

Вот пользовательская модель, которую я использую.

def __init__(self, transfer_learning = False, lambda_reg = 0.001, drop_out_rate = 0.1):
    if(transfer_learning == False):
        self.model = Sequential();
        self.model.add(Conv2D(32, (3,3), input_shape = (224,224,3), activation = "relu"))
        self.model.add(MaxPooling2D(pool_size = (2,2)))

        self.model.add(Conv2D(64, (1,1), activation = "relu"))
        self.model.add(MaxPooling2D(pool_size = (2,2)))

        self.model.add(Conv2D(128, (3,3), activation = "relu"))
        self.model.add(MaxPooling2D(pool_size = (2,2)))

        self.model.add(Conv2D(128, (1,1), activation = "relu"))
        self.model.add(MaxPooling2D(pool_size = (2,2)))

        self.model.add(Flatten())

        self.model.add(Dense(512))
        self.model.add(Dropout(drop_out_rate))
        self.model.add(Dense(256))
        self.model.add(Dropout(drop_out_rate))

        self.model.add(Dense(5, activation = "softmax"))

Так что я не могу понять связь между steps_per_epoch и batch_size.batch_size - количество сэмплов, которые посылает генератор.Но является ли steps_per_epoch число batch_size для завершения одной тренировочной эпохи?Если так, то должно быть: steps_per_epoch = total_samples/batch_size?

Какое бы значение я ни пытался, у меня всегда возникает одна и та же проблема (на обеих моделях), val_acc, кажется, достигает локального оптимума.

Ответы [ 2 ]

1 голос
/ 14 июля 2019

Вы смешиваете два вопроса здесь. Один из них - как определить batch_size vs steps_per_epoch; другая причина в том, что val_acc, кажется, достигает локальной оптимумы и не будет продолжать улучшаться.

(1) Для вопроса - batch_size vs steps_per_epoch

Стратегия должна быть в первую очередь, чтобы максимизировать размер batch_size настолько, насколько позволяет память, особенно когда вы используете графический процессор (4 ~ 11 ГБ). Обычно batch_size = 32 или 64 должно быть в порядке, но в некоторых случаях вам придется уменьшить его до 8, 4 или даже 1. Учебный код будет генерировать исключения, если недостаточно памяти для выделения, поэтому вы знаете, когда прекратить увеличение размера batch_size.

Как только batch_size установлен, steps_per_epoch может быть рассчитан с помощью Math.ceil (total_samples / batch_size). но иногда вам может потребоваться увеличить его в несколько раз при использовании дополнения данных.

(2) Вторая проблема - val_acc достигает локального оптимума, улучшаться не будет

В этом суть глубокого изучения, не так ли? Это делает DL одновременно захватывающим и сложным. Batch_size, steps_per_epoch и количество эпох здесь не сильно помогут. Именно модель и гиперпараметры (такие как скорость обучения, функция потерь, функция оптимизации и т. Д.) Управляют работой модели.

Несколько простых советов - попробовать разные скорости обучения, разные функции оптимизации. Если вы обнаружите, что модель переоснащается (val_acc уменьшается с увеличением числа эпох), увеличение размера выборки всегда помогает, если это возможно. Увеличение данных помогает в некоторой степени.

1 голос
/ 27 мая 2019

Прежде всего, steps_per_epoch = total_samples/batch_size является правильным в общих чертах.
Это пример кода, написанного tenowflow следующим образом:

for epoch in range(training_epochs):
    avg_cost = 0
    total_batch = int(mnist.train.num_examples / batch_size)

    for i in range(total_batch):
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        feed_dict = {X: batch_xs, Y: batch_ys}
        c, _ = sess.run([cost, optimizer], feed_dict=feed_dict)
        avg_cost += c / total_batch

    print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost))

print('Learning Finished!')

Кстати, хотя это не совсем связано с вашим вопросом. Существует несколько различных оптимизаторов, таких как Stochastic Gradient Descent и Adam, потому что обучение занимает слишком много времени при большом наборе данных.
Он не изучает все данные каждый раз. Есть много статей об этом. Здесь я просто оставляю один из них.

И, для вашего val_acc, похоже, что ваша модель имеет так много слоя Convolution.
Вы сократили фильтры и максимальное количество слоев свертки, но я думаю, что это слишком много. Как дела? Это лучше, чем раньше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...