Керас - подборка моделей
Ранее мы изучали основы создания модели с использованием последовательного и функционального API. В этой главе объясняется, как скомпилировать модель. Компиляция - это последний шаг в создании модели. Как только компиляция будет завершена, мы можем перейти к фазе обучения.
Давайте узнаем несколько концепций, необходимых для лучшего понимания процесса компиляции.
Потеря
В машинном обучении LossФункция используется для поиска ошибки или отклонения в процессе обучения. Керасу требуется функция потерь в процессе компиляции модели.
Keras предоставляет довольно много функций потерь в losses модуль, и они следующие -
- mean_squared_error
- mean_absolute_error
- mean_absolute_percentage_error
- mean_squared_logarithmic_error
- squared_hinge
- hinge
- categorical_hinge
- logcosh
- huber_loss
- categorical_crossentropy
- sparse_categorical_crossentropy
- binary_crossentropy
- kullback_leibler_divergence
- poisson
- cosine_proximity
- is_categorical_crossentropy
Вся вышеуказанная функция потерь принимает два аргумента -
y_true - истинные метки как тензоры
y_pred - предсказание той же формы, что и y_true
Импортируйте модуль потерь перед использованием функции потерь, как указано ниже -
from keras import losses
Оптимизатор
В машинном обучении Optimization- важный процесс оптимизации входных весов путем сравнения прогноза и функции потерь. Keras предоставляет довольно много оптимизаторов в виде модулей, оптимизаторов, и они следующие:
SGD - Оптимизатор стохастического градиентного спуска.
keras.optimizers.SGD(learning_rate = 0.01, momentum = 0.0, nesterov = False)
RMSprop - Оптимизатор RMSProp.
keras.optimizers.RMSprop(learning_rate = 0.001, rho = 0.9)
Adagrad - Оптимизатор Adagrad.
keras.optimizers.Adagrad(learning_rate = 0.01)
Adadelta - Оптимизатор Adadelta.
keras.optimizers.Adadelta(learning_rate = 1.0, rho = 0.95)
Adam - Оптимизатор Адама.
keras.optimizers.Adam(
learning_rate = 0.001, beta_1 = 0.9, beta_2 = 0.999, amsgrad = False
)
Adamax - Оптимизатор Adamax от Adam.
keras.optimizers.Adamax(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)
Nadam - Нестеров Адам оптимизатор.
keras.optimizers.Nadam(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)
Импортируйте модуль оптимизаторов перед использованием оптимизаторов, как указано ниже -
from keras import optimizers
Метрики
В машинном обучении Metricsиспользуется для оценки производительности вашей модели. Она похожа на функцию потерь, но не используется в тренировочном процессе. Keras предоставляет довольно много показателей в виде модуля,metrics и они следующие
- accuracy
- binary_accuracy
- categorical_accuracy
- sparse_categorical_accuracy
- top_k_categorical_accuracy
- sparse_top_k_categorical_accuracy
- cosine_proximity
- clone_metric
Подобно функции потерь, метрики также принимают следующие два аргумента:
y_true - истинные метки как тензоры
y_pred - предсказание той же формы, что и y_true
Импортируйте модуль показателей перед использованием показателей, как указано ниже -
from keras import metrics
Скомпилируйте модель
Модель Кераса предоставляет метод, compile()составить модель. Аргумент и значение по умолчаниюcompile() метод выглядит следующим образом
compile(
optimizer,
loss = None,
metrics = None,
loss_weights = None,
sample_weight_mode = None,
weighted_metrics = None,
target_tensors = None
)
Важными аргументами являются следующие:
- функция потерь
- Optimizer
- metrics
Пример кода для компиляции режима выглядит следующим образом:
from keras import losses
from keras import optimizers
from keras import metrics
model.compile(loss = 'mean_squared_error',
optimizer = 'sgd', metrics = [metrics.categorical_accuracy])
где,
функция потерь установлена как mean_squared_error
оптимизатор установлен как sgd
метрики установлены как metrics.categorical_accuracy
Модельное обучение
Модели обучаются массивами NumPy с использованием fit(). Основное назначение этой функции соответствия - оценка вашей модели при обучении. Это также можно использовать для построения графиков производительности модели. Он имеет следующий синтаксис -
model.fit(X, y, epochs = , batch_size = )
Вот,
X, y - Это кортеж для оценки ваших данных.
epochs - Нет необходимости оценивать модель во время обучения.
batch_size - учебные экземпляры.
Давайте рассмотрим простой пример множества случайных данных, чтобы использовать эту концепцию.
Создать данные
Давайте создадим случайные данные, используя numpy для x и y с помощью приведенной ниже команды -
import numpy as np
x_train = np.random.random((100,4,8))
y_train = np.random.random((100,10))
Теперь создайте случайные данные проверки,
x_val = np.random.random((100,4,8))
y_val = np.random.random((100,10))
Создать модель
Создадим простую последовательную модель -
from keras.models import Sequential model = Sequential()
Добавить слои
Создайте слои для добавления модели -
from keras.layers import LSTM, Dense
# add a sequence of vectors of dimension 16
model.add(LSTM(16, return_sequences = True))
model.add(Dense(10, activation = 'softmax'))
составить модель
Теперь модель определена. Вы можете скомпилировать с помощью следующей команды -
model.compile(
loss = 'categorical_crossentropy', optimizer = 'sgd', metrics = ['accuracy']
)
Применить форму ()
Теперь мы применяем функцию fit () для обучения наших данных -
model.fit(x_train, y_train, batch_size = 32, epochs = 5, validation_data = (x_val, y_val))
Создание многослойной ИНС персептрона
Мы научились создавать, компилировать и обучать модели Keras.
Давайте применим наши знания и создадим простую ANN на основе MPL.
Модуль набора данных
Перед созданием модели нам нужно выбрать проблему, нужно собрать необходимые данные и преобразовать данные в массив NumPy. После сбора данных мы можем подготовить модель и обучить ее, используя собранные данные. Сбор данных - один из самых сложных этапов машинного обучения. Keras предоставляет специальный модуль, наборы данных для загрузки данных онлайн-машинного обучения в учебных целях. Он извлекает данные с онлайн-сервера, обрабатывает данные и возвращает данные в виде набора для обучения и тестирования. Давайте проверим данные, предоставленные модулем набора данных Keras. В модуле доступны следующие данные:
- Классификация небольших изображений CIFAR10
- Классификация небольших изображений CIFAR100
- IMDB Movie рассматривает классификацию настроений
- Классификация тем в ленте новостей Reuters
- База данных рукописных цифр MNIST
- База данных модных товаров Fashion-MNIST
- Набор данных регрессии цен на жилье в Бостоне
Давайте использовать MNIST database of handwritten digits(или minst) в качестве нашего ввода. minst - это коллекция из 60 000 изображений в оттенках серого 28x28. Он состоит из 10 цифр. Он также содержит 10 000 тестовых изображений.
Код ниже можно использовать для загрузки набора данных -
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
где
Line 1 импорт minst из модуля набора данных keras.
Line 3 называет load_data функция, которая будет получать данные с онлайн-сервера и возвращать данные в виде двух кортежей, первый кортеж, (x_train, y_train) представляют данные обучения в форме, (number_sample, 28, 28) и его цифровая метка с формой, (number_samples, ). Второй кортеж,(x_test, y_test) представляют тестовые данные одинаковой формы.
Другой набор данных также можно получить с помощью аналогичного API, и каждый API также возвращает похожие данные, за исключением формы данных. Форма данных зависит от типа данных.
Создать модель
Давайте выберем простой многослойный перцептрон (MLP), как показано ниже, и попробуем создать модель с помощью Keras.
Основные особенности модели следующие:
Входной слой состоит из 784 значений (28 x 28 = 784).
Первый скрытый слой, Dense состоит из 512 нейронов и функции активации relu.
Второй скрытый слой, Dropout имеет значение 0,2.
Третий скрытый слой, снова Dense, состоит из 512 нейронов и функции активации relu.
Четвертый скрытый слой, Dropout имеет значение 0,2.
Пятый и последний слой состоит из 10 нейронов и функции активации softmax.
Использовать categorical_crossentropy как функция потерь.
Использовать RMSprop() как оптимизатор.
Использовать accuracy как метрики.
Используйте 128 как размер партии.
Используйте 20 как эпохи.
Step 1 − Import the modules
Импортируем необходимые модули.
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
import numpy as np
Step 2 − Load data
Давайте импортируем набор данных mnist.
(x_train, y_train), (x_test, y_test) = mnist.load_data()
Step 3 − Process the data
Давайте изменим набор данных в соответствии с нашей моделью, чтобы его можно было использовать в нашей модели.
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
где
reshape используется для изменения формы ввода из кортежа (28, 28) в (784,)
to_categorical используется для преобразования вектора в двоичную матрицу
Step 4 − Create the model
Создадим актуальную модель.
model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation = 'relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation = 'softmax'))
Step 5 − Compile the model
Скомпилируем модель, используя выбранную функцию потерь, оптимизатор и метрики.
model.compile(loss = 'categorical_crossentropy',
optimizer = RMSprop(),
metrics = ['accuracy'])
Step 6 − Train the model
Обучим модель, используя fit() метод.
history = model.fit(
x_train, y_train,
batch_size = 128,
epochs = 20,
verbose = 1,
validation_data = (x_test, y_test)
)
Последние мысли
Мы создали модель, загрузили данные, а также обучили данные модели. Нам все еще нужно оценить модель и спрогнозировать выходные данные для неизвестных входных данных, о чем мы узнаем в следующей главе.
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
import numpy as np
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
model = Sequential()
model.add(Dense(512, activation='relu', input_shape = (784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation = 'relu')) model.add(Dropout(0.2))
model.add(Dense(10, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy',
optimizer = RMSprop(),
metrics = ['accuracy'])
history = model.fit(x_train, y_train,
batch_size = 128, epochs = 20, verbose = 1, validation_data = (x_test, y_test))
Выполнение приложения даст следующий контент в качестве вывода -
Train on 60000 samples, validate on 10000 samples Epoch 1/20
60000/60000 [==============================] - 7s 118us/step - loss: 0.2453
- acc: 0.9236 - val_loss: 0.1004 - val_acc: 0.9675 Epoch 2/20
60000/60000 [==============================] - 7s 110us/step - loss: 0.1023
- acc: 0.9693 - val_loss: 0.0797 - val_acc: 0.9761 Epoch 3/20
60000/60000 [==============================] - 7s 110us/step - loss: 0.0744
- acc: 0.9770 - val_loss: 0.0727 - val_acc: 0.9791 Epoch 4/20
60000/60000 [==============================] - 7s 110us/step - loss: 0.0599
- acc: 0.9823 - val_loss: 0.0704 - val_acc: 0.9801 Epoch 5/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0504
- acc: 0.9853 - val_loss: 0.0714 - val_acc: 0.9817 Epoch 6/20
60000/60000 [==============================] - 7s 111us/step - loss: 0.0438
- acc: 0.9868 - val_loss: 0.0845 - val_acc: 0.9809 Epoch 7/20
60000/60000 [==============================] - 7s 114us/step - loss: 0.0391
- acc: 0.9887 - val_loss: 0.0823 - val_acc: 0.9802 Epoch 8/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0364
- acc: 0.9892 - val_loss: 0.0818 - val_acc: 0.9830 Epoch 9/20
60000/60000 [==============================] - 7s 113us/step - loss: 0.0308
- acc: 0.9905 - val_loss: 0.0833 - val_acc: 0.9829 Epoch 10/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0289
- acc: 0.9917 - val_loss: 0.0947 - val_acc: 0.9815 Epoch 11/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0279
- acc: 0.9921 - val_loss: 0.0818 - val_acc: 0.9831 Epoch 12/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0260
- acc: 0.9927 - val_loss: 0.0945 - val_acc: 0.9819 Epoch 13/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0257
- acc: 0.9931 - val_loss: 0.0952 - val_acc: 0.9836 Epoch 14/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0229
- acc: 0.9937 - val_loss: 0.0924 - val_acc: 0.9832 Epoch 15/20
60000/60000 [==============================] - 7s 115us/step - loss: 0.0235
- acc: 0.9937 - val_loss: 0.1004 - val_acc: 0.9823 Epoch 16/20
60000/60000 [==============================] - 7s 113us/step - loss: 0.0214
- acc: 0.9941 - val_loss: 0.0991 - val_acc: 0.9847 Epoch 17/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0219
- acc: 0.9943 - val_loss: 0.1044 - val_acc: 0.9837 Epoch 18/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0190
- acc: 0.9952 - val_loss: 0.1129 - val_acc: 0.9836 Epoch 19/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0197
- acc: 0.9953 - val_loss: 0.0981 - val_acc: 0.9841 Epoch 20/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0198
- acc: 0.9950 - val_loss: 0.1215 - val_acc: 0.9828