Что такое batch size keras
Боковая панель
НАЧАЛО РАБОТЫ
МОДЕЛИ
ПРЕДОБРАБОТКА
ПРИМЕРЫ
Sequential model: руководство
Модель Sequential представляет собой линейный стек слоев.
Вы может создать модель Sequential, передав список слоев конструктору модели:
from keras.models import Sequential from keras.layers import Dense, Activation model = Sequential([Dense(32, input_shape=(784,)), Activation(‘relu’), Dense(10), Activation(‘softmax’),]) |
model = Sequential() model.add(Dense(32, input_dim=784)) model.add(Activation(‘relu’)) |
Указание размерности входных данных
Ваша модель должна знать, какую размерность данных ожидать на входе. В связи с этим, первый слой модели Sequential (и только первый, поскольку последующие слои производят автоматический расчет размерности) должен получать информацию о размерности входных данных. Есть несколько способов сделать это:
Таким образом, следующие примеры эквивалентны:
model = Sequential() model.add(Dense(32, input_shape=(784,))) |
model = Sequential() model.add(Dense(32, input_dim=784)) |
Компиляция
Перед обучением модели необходимо настроить сам процесс. Это выполняется с помощью метода compile(). Он получает три аргумента:
# Задача бинарной классификации
model.compile(optimizer=’rmsprop’, loss=’binary_crossentropy’, metrics=[‘accuracy’])
# Среднеквадратичная ошибка регрессии
model.compile(optimizer=’rmsprop’, loss=’mse’)
# Пользовательская метрика
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer=’rmsprop’, loss=’binary_crossentropy’, metrics=[‘accuracy’, mean_pred])
Обучение
Модели Keras обучаются на Numpy-массивах, содержащих набор исходных данных и метки. Для обучения обычно используется функция fit(). Документация по этой функции здесь.
# Модель с одномерными входными данными и бинарной классификацией
model.add(Dense(32, activation=’relu’, input_dim=100))
# Генерируем случайные данные
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
# Обучаем модель, перебирая данные в пакетах по 32 примера
model.fit(data, labels, epochs=10, batch_size=32)
# Модель с одномерными входными данными и 10 классами
model.add(Dense(32, activation=’relu’, input_dim=100))
# Генерируем случайные данные
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(10, size=(1000, 1))
# Преобразуем метки в OHE (one-hot encoding)
one_hot_labels = keras.utils.to_categorical(labels, num_classes=10)
# Обучаем модель, перебирая данные в пакетах по 32 примера
model.fit(data, one_hot_labels, epochs=10, batch_size=32)
Примеры
Вот несколько примеров, с которых можно начать!
В папке примеров вы также найдете варианты решения задач с реальными наборами данных:
Многослойный персептрон (MLP) для мультиклассовой классификаци (softmax):
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
# Генерируем случайные данные
import numpy as np
x_train = np.random.random((1000, 20))
y_train = keras.utils.to_categorical(
np.random.randint(10, size=(1000, 1)), num_classes=10)
x_test = np.random.random((100, 20))
y_test = keras.utils.to_categorical(
np.random.randint(10, size=(100, 1)), num_classes=10)
# Dense(64) — это полносвязный слой с 64 скрытыми нейронами.
# в первом слое вы должны указать размерность входных данных:
# здесь, это векторы длинной 20.
model.add(Dense(64, activation=’relu’, input_dim=20))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
score = model.evaluate(x_test, y_test, batch_size=128)
MLP для бинарной классификации:
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
# Генерируем случайные данные
x_train = np.random.random((1000, 20))
y_train = np.random.randint(2, size=(1000, 1))
x_test = np.random.random((100, 20))
y_test = np.random.randint(2, size=(100, 1))
model.add(Dense(64, input_dim=20, activation=’relu’))
score = model.evaluate(x_test, y_test, batch_size=128)
VGG-подобная сверточная сеть:
import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD
# Генерируем случайные данные
x_train = np.random.random((100, 100, 100, 3))
y_train = keras.utils.to_categorical(
np.random.randint(10, size=(100, 1)), num_classes=10)
x_test = np.random.random((20, 100, 100, 3))
y_test = keras.utils.to_categorical(
np.random.randint(10, size=(20, 1)), num_classes=10)
# применим здесь сверточный слой с 32 нейронами и ядром свертки (3, 3)
model.add(Conv2D(32, (3, 3), activation=’relu’,
input_shape=(100, 100, 3)))
model.add(Conv2D(32, (3, 3), activation=’relu’))
model.add(Conv2D(64, (3, 3), activation=’relu’))
model.add(Conv2D(64, (3, 3), activation=’relu’))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.fit(x_train, y_train, batch_size=32, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=32)
Классификация последовательностей с помощью LSTM:
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import LSTM
model.fit(x_train, y_train, batch_size=16, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=16)
Классификация последовательностей с помощью одномерной свертки:
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import Conv1D, GlobalAveragePooling1D, MaxPooling1D
model.add(Conv1D(64, 3, activation=’relu’,
input_shape=(seq_length, 100)))
model.add(Conv1D(64, 3, activation=’relu’))
model.add(Conv1D(128, 3, activation=’relu’))
model.add(Conv1D(128, 3, activation=’relu’))
model.fit(x_train, y_train, batch_size=16, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=16)
Классификация последовательностей с помощью LSTM с памятью:
В этой модели мы накладываем 3 слоя LSTM друг на друга, делая модель способной изучать временные представления более высокого уровня.
Первые два слоя возвращают свои полные выходные последовательности, но последний слой возвращает только последний шаг своей выходной последовательности. Таким образом отбрасывается временное измерение (то есть входная последовательность преобразуется в один вектор).
from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np
# ожидаемая размерность входных данных:
# (batch_size, timesteps, data_dim)
model.add(LSTM(32, return_sequences=True,
input_shape=(timesteps, data_dim)))
# возвращает последовательность векторов длинной 32
model.add(LSTM(32, return_sequences=True))
# возвращает последовательность векторов длинной 32
model.add(LSTM(32)) # возвращает одиночный векторов длинной 32
# Генерируем случайные данные
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))
# Генерируем случайные проверочные данные
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))
LSTM с передачей состояния
Рекуррентная модель с состоянием — это модель, для которой внутренней состояние, полученное после обработки очередного пакета данных, повторно используется в качестве начальных состояний для выборок следующей серии. Это позволяет обрабатывать более длинные последовательности.
from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np
# ожидаемая размерность входных данных:
# (batch_size, timesteps, data_dim)
# Обратите внимание, что мы должны указать полную размерность входных
# данных batch_input_shape, так как это сеть с состоянием
# i-тый пример в k-ом пакете является продолжением
# i-того примера в k-1-ом пакете
model.add(LSTM(32, return_sequences=True, stateful=True,
batch_input_shape=(batch_size, timesteps, data_dim)))
model.add(LSTM(32, return_sequences=True, stateful=True))
model.add(LSTM(32, stateful=True))
# Генерируем случайные данные
x_train = np.random.random((batch_size * 10, timesteps, data_dim))
y_train = np.random.random((batch_size * 10, num_classes))
# Генерируем случайные проверочные данные
x_val = np.random.random((batch_size * 3, timesteps, data_dim))
y_val = np.random.random((batch_size * 3, num_classes))
batch_size=batch_size, epochs=5, shuffle=False,
Боковая панель
НАЧАЛО РАБОТЫ
МОДЕЛИ
ПРЕДОБРАБОТКА
ПРИМЕРЫ
Sequential
API модели Sequential
Для начала прочтите это руководство по модели Keras Sequential.
Методы последовательной модели
compile
compile(optimizer, loss=None, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None) |
Настраивает модель Keras Sequential для обучения.
Исключения
fit
fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None, validation_freq=1, max_queue_size=10, workers=1, use_multiprocessing=False)
Обучает модель Keras Sequential для фиксированного количества эпох (итераций на наборе данных).
Аргументы
validation_data: Данные, по которым оцениваются потери и любые показатели модели в конце каждой эпохи. Модель не будет обучена работе с этими данными. данные validation_data будут переопределять данные validation_split. данные validation_data могут быть: — кортеж (x_val, y_val) нулевых массивов или тензоры — кортеж (x_val, y_val, val_sample_weights) нулевых массивов — набор данных или итератор набора данных.
Для первых двух случаев необходимо указать batch_size. В последнем случае должны быть предоставлены validation_steps.
shuffle: Булевы (чтобы перетасовать тренировочные данные перед каждой эпохой) или str (для «batch»). «Batch» — это специальная опция для работы с ограничениями данных HDF5; он тасуется в кусках пакетного размера. Не имеет эффекта, когда steps_per_epoch не None.
Объект History. Его атрибут History.history представляет собой запись обучающих значений потерь и метрик в последующие эпохи, а также значений потерь проверки и метрик проверки (если применимо).
Исключения
evaluate
evaluate(x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False)
Возвращает значение потерь и метрики для модели Keras Sequential в тестовом режиме.
Вычисление производится партиями.
Аргументы
Исключеия
Возврат
Скалярные тестовые потери (если модель имеет один выход и не имеет метрик) или список скаляров (если модель имеет несколько выходов и/или метрик). Атрибут model.metrics_names даст вам метки отображения для скалярных выходов.
predict
predict(x, batch_size=None, verbose=0, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False)
Генерирует предсказания для входных сэмплов.
Вычисление производится партиями.
Аргументы
Возврат
Numpy массив(ы) предсказаний.
train_on_batch
train_on_batch(x, y, sample_weight=None, class_weight=None, reset_metrics=True)
Выполняет обновление одного градиента на одном пакете данных.
Аргументы
Возврат
Скалярные потери при обучении (если модель имеет один выход и не имеет метрик) или список скаляров (если модель имеет несколько выходов и/или метрик). Атрибут model.metrics_names даст вам метки отображения для скалярных выходов.
test_on_batch
test_on_batch(x, y, sample_weight=None, reset_metrics=True)
Тестируем модель Keras Sequential на одной партии образцов.
Аргументы
Возврат
Скалярные тестовые потери (если модель имеет один выход и не имеет метрик) или список скаляров (если модель имеет несколько выходов и/или метрик). Атрибут model.metrics_names даст вам метки отображения для скалярных выходов.
predict_on_batch
Возвращает прогнозы для одной партии образцов.
Аргументы
Возврат
Numpy массив(ы) предсказаний.
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)
Поставляет модель Keras Sequential на основе данных, сгенерированных пакетно по пакетам генератором Python (или экземпляром Sequence).
Генератор работает параллельно с моделью, для большей эффективности. Например, это позволяет выполнять увеличение данных на изображениях на CPU в реальном времени параллельно с обучением модели на GPU.
Использование keras.utils.Sequence гарантирует упорядочение и однократное использование каждого входа в эпоху при использовании use_multiprocessing=True.
Returns
A History object. Its History.history attribute is a record of training loss values and metrics values at successive epochs, as well as validation loss values and validation metrics values (if applicable).
Пример
def generate_arrays_from_file(path):
while True:
with open(path) as f:
for line in f:
# создавать Numpy массивы входных данных
# и метки, из каждой строки в файле.
x1, x2, y = process_line(line)
evaluate_generator
evaluate_generator(generator, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False, verbose=0)
Оценивает модель Keras Sequential на генераторе данных.
Генератор должен возвращать данные того же типа, что и test_on_batch.
Аргументы
generator: Генератор, выдающий кортежи (входы, цели) или (входы, цели, sample_weights) или экземпляр объекта Sequence (keras.utils.Sequence), чтобы избежать дублирования данных при использовании многопроцессорной обработки.
steps: Общее количество шагов (партий образцов) для выхода из генератора до остановки. Необязательно для Sequence: если не указано, будет использоваться len(generator) в качестве нескольких шагов.
callbacks: Список экземпляров keras.callbacks.callback. List of callbacks to apply during training (Список обратных вызовов, применяемых во время тренировки). См. callbacks.
max_queue_size: максимальный размер очереди генератора.
workers: Целостный. Максимальное количество процессов для раскрутки при использовании многопоточности на основе процессов. Если не указано, то по умолчанию рабочие будут равны 1. Если 0, то генератор будет выполняться в главном потоке.
use_multiprocessing: если значение True, использовать многопоточность на основе процессов. Обратите внимание, что поскольку эта реализация основана на многопроцессорной обработке, не следует передавать генератору непикируемые аргументы, так как они не могут быть легко переданы дочерним процессам.
verbose: verbosity mode, 0 или 1.
Возврат.
Скалярные тестовые потери (если модель имеет один выход и не имеет метрик) или список скаляров (если модель имеет несколько выходов и/или метрик). Атрибут model.metrics_names даст вам метки отображения для скалярных выходов.
Исключения
predict_generator
predict_generator(generator, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False, verbose=0)
Генерирует предсказания для входных образцов из генератора данных.
Генератор должен возвращать данные того же вида, что и принятый в predict_on_batch.
Аргументы
Возврат
Numpy массив(ы) предсказаний.
Исключения
get_layer
get_layer(name=None, index=None)
Восстанавливает слой на основе его имени (уникального) или индекса.
Если указаны и name, и index, то приоритет будет отдан индексу.
Индексы основываются на порядке обхода горизонтального графика (снизу вверх).
Аргументы
Возврат
Исключения
Model training APIs
compile method
Configures the model for training.
Example
Arguments
fit method
Trains the model for a fixed number of epochs (iterations on a dataset).
Arguments
Returns
A History object. Its History.history attribute is a record of training loss values and metrics values at successive epochs, as well as validation loss values and validation metrics values (if applicable).
Raises
evaluate method
Returns the loss value & metrics values for the model in test mode.
Computation is done in batches (see the batch_size arg.)
Arguments
Returns
Scalar test loss (if the model has a single output and no metrics) or list of scalars (if the model has multiple outputs and/or metrics). The attribute model.metrics_names will give you the display labels for the scalar outputs.
Raises
predict method
Generates output predictions for the input samples.
Arguments
Returns
Numpy array(s) of predictions.
Raises
train_on_batch method
Runs a single gradient update on a single batch of data.
Arguments
Returns
Scalar training loss (if the model has a single output and no metrics) or list of scalars (if the model has multiple outputs and/or metrics). The attribute model.metrics_names will give you the display labels for the scalar outputs.
Raises
test_on_batch method
Test the model on a single batch of samples.
Arguments
Returns
Scalar test loss (if the model has a single output and no metrics) or list of scalars (if the model has multiple outputs and/or metrics). The attribute model.metrics_names will give you the display labels for the scalar outputs.
Raises
predict_on_batch method
Returns predictions for a single batch of samples.
Arguments
Returns
Numpy array(s) of predictions.
Raises
run_eagerly property
Settable attribute indicating whether the model should run eagerly.
Running eagerly means that your model will be run step by step, like Python code. Your model might run slower, but it should become easier for you to debug it by stepping into individual layer calls.
By default, we will attempt to compile your model to a static graph to deliver the best execution performance.
Returns
Boolean, whether the model should run eagerly.
What is batch size in neural network?
I’m using Python Keras package for neural network. This is the link. Is batch_size equals to number of test samples? From Wikipedia we have this information:
However, in other cases, evaluating the sum-gradient may require expensive evaluations of the gradients from all summand functions. When the training set is enormous and no simple formulas exist, evaluating the sums of gradients becomes very expensive, because evaluating the gradient requires evaluating all the summand functions’ gradients. To economize on the computational cost at every iteration, stochastic gradient descent samples a subset of summand functions at every step. This is very effective in the case of large-scale machine learning problems.
Above information is describing test data? Is this same as batch_size in keras (Number of samples per gradient update)?
6 Answers 6
The batch size defines the number of samples that will be propagated through the network.
For instance, let’s say you have 1050 training samples and you want to set up a batch_size equal to 100. The algorithm takes the first 100 samples (from 1st to 100th) from the training dataset and trains the network. Next, it takes the second 100 samples (from 101st to 200th) and trains the network again. We can keep doing this procedure until we have propagated all samples through of the network. Problem might happen with the last set of samples. In our example, we’ve used 1050 which is not divisible by 100 without remainder. The simplest solution is just to get the final 50 samples and train the network.
Advantages of using a batch size batch_size equal to 1. In that case, the gradient changes its direction even more often than a mini-batch gradient.
In the neural network terminology:
Example: if you have 1000 training examples, and your batch size is 500, then it will take 2 iterations to complete 1 epoch.
The question has been asked a while ago but I think people are still tumbling across it. For me it helped to know about the mathematical background to understand batching and where the advantages/disadvantages mentioned in itdxer’s answer come from. So please take this as a complementary explanation to the accepted answer.
$$\theta_
Full-Batch Gradient Descent
$$\theta_
This is what is described in the wikipedia excerpt from the OP. For large number of training samples, the updating step becomes very expensive since the gradient has to be evaluated for each summand.
Stochastic Gradient Descent
In Stochastic Gradient Descent one computes the gradient for one training sample and updates the paramter immediately. These two steps are repeated for all training samples.
$$\theta_
One updating step is less expensive since the gradient is only evaluated for a single training sample j.
Difference between both approaches
Updating Speed: Batch gradient descent tends to converge more slowly because the gradient has to be computed for all training samples before updating. Within the same number of computation steps, Stochastic Gradient Descent already updated the parameter multiple times. But why should we then even choose Batch Gradient Descent?
Convergence Direction: Faster updating speed comes at the cost of lower «accuracy». Since in Stochastic Gradient Descent we only incorporate a single training sample to estimate the gradient it does not converge as directly as batch gradient descent. One could say, that the amount of information in each updating step is lower in SGD compared to BGD.
The less direct convergence is nicely depicted in itdxer’s answer. Full-Batch has the most direct route of convergence, where as mini-batch or stochastic fluctuate a lot more. Also with SDG it can happen theoretically happen, that the solution never fully converges.
Memory Capacity: As pointed out by itdxer feeding training samples as batches requires memory capacity to load the batches. The greater the batch, the more memory capacity is required.
Summary
In my example I used Gradient Descent and no particular loss function, but the concept stays the same since optimization on computers basically always comprises iterative approaches.
So, by batching you have influence over training speed (smaller batch size) vs. gradient estimation accuracy (larger batch size). By choosing the batch size you define how many training samples are combined to estimate the gradient before updating the parameter(s).