Привет народ!! В этом блоге я собираюсь обсудить очень интересную особенность Keras. При обучении любой модели глубокого обучения обязательным условием для получения хорошего результата являются огромные данные для обучения. Чем больше набор данных, тем больше мы можем полагаться на модель. Проблема в том, что большую часть времени мы работаем с ограниченными ресурсами, такими как память и процессор. С увеличением размера обучающих данных становится трудно полностью разместить их в ОЗУ и провести обучение. В этом случае лучший способ решить эту проблему - обучать модель партиями. Данные поезда будут храниться на диске. На каждом шаге с диска будет извлекаться порция данных, загружаться в ОЗУ, будет выполняться обучение модели. Затем этот же процесс будет повторяться до тех пор, пока не закончатся данные для обучения.

fit_generator () Керас:

В моделях Keras есть метод под названием fit_generator (), который помогает выполнять вышеупомянутое пакетное обучение.



fit_generator (generator,steps_per_epoch=None, epochs=1, verbose=1,            callbacks=None, validation_data=None, validation_steps=None,    validation_freq=1, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0)

В качестве аргумента требуется генератор. Этот генератор получает пакет обучающих данных и отправляет их для обучения модели за один шаг. Validation_data также можно передать как генератор. Согласно документации

generator: A generator or an instance of Sequence (keras.utils.Sequence) object in order to avoid duplicate data when using multiprocessing. The output of the generator must be either
- tuple (inputs, targets)
- tuple (inputs, targets, sample_weights).
  This tuple (a single output of the generator) makes a single batch. Therefore, all arrays in this tuple must have the same length (equal to the size of this batch). Different batches may have different sizes. For example, the last batch of the epoch is commonly smaller than the others, if the size of the dataset is not divisible by the batch size. The generator is expected to loop over its data indefinitely. An epoch finishes when steps_per_epoch batches have been seen by the model.

Итак, нам нужен генератор, который будет создавать кортеж с двумя списками, такими как входы и цели. Давайте рассмотрим пример, чтобы продемонстрировать вышесказанное.

  1. Набор данных

Например, мы будем использовать набор данных MNIST в качестве обучающих данных. Весь набор данных разбит на две части и сохраняется как train.csv и test.csv. Данные выглядят так, как показано ниже. Где первый столбец - это целевой столбец. Остальные - значения пикселей

Размерность данных поезда (42000,784)

Размер тестовых данных (28000,784)

Давайте определим нашу функцию генератора, которая собирает данные из приведенной выше таблицы в пакетном режиме.

def batch_generator(Train_df,batch_size,
                    steps):
    idx=1
    while True: 
        yield load_data(Train_df,idx-1,batch_size)## Yields data
        if idx<steps:
            idx+=1
        else:
            idx=1

Вышеуказанный генератор будет генерировать пакет на каждом шаге с помощью функции load_data () ниже

def load_data(Train_df,idx,
              batch_size):
    df = pd.read_csv(
                  Train_df, skiprows=idx*batch_size,
                  nrows=batch_size)
    x = df.iloc[:,1:]
         
    y = df.iloc[:,0]
    return (np.array(x), np_utils.to_categorical(y))

В каждом вызове выше генератор выдает кортеж (входы, цели). Где и «входы», и «цели» - это массивы длины «batch_size»

2. Сетевая архитектура

Теперь давайте спроектируем простую нейронную сеть с помощью keras.

## importing libraries
from keras.models import Sequential 
from keras.layers import Dense, Activation
# some model parameters
output_dim = 10
input_dim = 784
batch_size = 256 
nb_epoch = 10
steps_per_epoch=np.ceil(42000/batch_size)
validation_steps=np.ceil(28000/batch_size)
### Generator objects for train and validation
my_training_batch_generator = batch_generator('train.csv', 256,steps_per_epoch)
my_validation_batch_generator = batch_generator('test.csv', 256,validation_steps)
## Layer 1
model = Sequential()
model.add(Dense(50, input_dim=input_dim, activation='relu'))
## Layer 2
model.add(Dense(output_dim, input_dim=50, activation='softmax'))
##Compile model
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])

Теперь вместо model.fit () мы будем использовать model.fit_generator () и передавать my_training_batch_generator и my_validation_batch_generator

model.fit_generator(my_training_batch_generator,
epochs=nb_epoch,steps_per_epoch=steps_per_epoch,
 verbose=1, validation_data=my_validation_batch_generator,
validation_steps=validation_steps)

Мы сделали. Теперь модель Keras будет обучаться с данными пакетного обучения без загрузки всего набора данных в RAM. Мы можем воспользоваться поддержкой многопроцессорности, установив use_multiprocessing = True. Затем будет запущено несколько потоков для получения разных фрагментов данных и обучения модели. Наконец, результаты будут объединены.

На сегодня все, ребята. Удачного обучения.