Создание нейронной сети (НС) средствами библиотеки Keras выполняется в следующем порядке:
Эффективность созданной НС можно и оценить на этапе тестирования по точности решения поставленной задачи, например, по точности классификации графических изображений:
acc = n_true / n,
где n – общее число классифицируемых на этапе тестирования изображений;
n_true – число правильно классифицированных на этапе тестирования изображений.
Более полно качество обучения НС можно оценить по показателям (вычисляются в разрезе классов):
оперируя следующими значениями:
precision = true_positive / (true_positive + false_positive)
recall = true_positive / (true_positive + false_negative)
F1 = 2 * precision * recall / (precision + recall)
Пример:
import numpy as np
from sklearn.metrics import classification_report
y_pred = np.array([0, 1, 2, 3, 0, 0, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2]) # Прогноз
y_true = np.array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]) # На самом деле
print(classification_report(y_true, y_pred, digits = 4))
tp, fp, tn, fn = [], [], [], []
for cls in range(4):
tp.append(np.sum(y_pred == cls, where = y_true == cls))
fp.append(np.sum(y_pred == cls, where = y_true != cls))
tn.append(np.sum(y_true == cls, where = y_pred == cls))
fn.append(np.sum(y_true == cls, where = y_pred != cls))
for cls in range(4):
precision = round(tp[cls] / (tp[cls] + fp[cls]), 4)
recall = round(tp[cls] / (tp[cls] + fn[cls]), 4)
F1 = 2 * precision * recall / (precision + recall)
print(precision, recall, round(F1, 4))
Результат:
Класс | precision | recall | F1 |
---|---|---|---|
0 | 0.6667 | 0.5000 | 0.5714 |
1 | 0.5000 | 0.5000 | 0.5000 |
2 | 0.5000 | 1.0000 | 0.6667 |
3 | 1.0000 | 0.2500 | 0.4000 |
accuracy | 0.5625 | ||
macro avg | 0.6667 | 0.5625 | 0.5345 |
weighted avg | 0.6667 | 0.5625 | 0.5345 |
На каждом этапе создания НС библиотека Keras предоставляет большой выбор параметров, влияющих на результативность НС. Поэтому перед пользователем, создающим НС, опираясь на методы библиотеки Keras, стоит непростая задача выбора правильных значений параметров. (В [1] отмечается, что невозможно дать обобщенные рекомендации по выбору параметров модели НС ввиду большого разнообразия НС и решаемых с их помощью задач.)
Ниже описываются методы, используемые при построении сверточных нейронных сетей с помощью следующих слоев:
Замечание. Многослойный перцептрон может быть создан как комбинация слоев Input, BatchNormalization, Dropout и Dense).
Слои Flatten и Input далее не рассматриваются, поскольку слой Flatten используется без параметров, а Input имеет неизменяемый параметр, задающий форму входных данных. Например, в задаче классификации изображений рукописных цифр:
inp = Input(shape = (28, 28, 1))
Форма (28, 28, 1) означает, что каждая цифра задана в виде рисунка размера 28*28 пикселей, выполненного в оттенках серого цвета.
Задание слоев НС выполняется следующими методами [3, 4, 5]:
Параметры слоев описаны в табл. 1.
Таблица 1. Параметры слоев (перечислены в алфавитном порядке)
№ | Параметр | Описание | Тип данных |
---|---|---|---|
1 | activation | Функция активации. | |
2 | activity_regularizer | Функция регуляризации, применяемая к выходу слоя. | |
3 | axis | Ось, по которой выполняется нормализация (the axis that should be normalized (обычно ось признаков)). Например, после здания Conv2D-слоя с data_format="channels_first", следует указать axis=1. | Integer |
4 | beta_constraint | Ограничение параметра beta. | |
5 | beta_initializer | Инициализатор параметра beta. | |
6 | beta_regularizer | Регуляризатор параметра beta. | |
7 | bias_constraint | Функция ограничения, применяемая к вектору смещения. | |
8 | bias_initializer | Инициализатор вектора смещения. | |
9 | bias_regularizer | Функция регуляризации, применяемая к вектору смещения. | |
10 | center | Если True, то добавляется смещений beta к нормализованному тензору. | Boolean |
11 | data_format | Принимает значение "channels_last" или "channels_first". Задает порядок следования измерений входных данных. В случае "channels_last" форма входа должна быть задана как (batch, height, width, channels); в случае "channels_first" – (batch, channels, height, width). Значение по умолчанию: "channels_last". | String |
12 | dilation_rate | Расширение свертки | Integer или кортеж/список двух целых чисел |
13 | epsilon | Небольшое вещественное число, добавляемое к дисперсии, чтобы избежать деления на 0. | Float |
14 | filters | Число выходных фильтров в свертке (размерность выхода). | Integer |
15 | gamma_constraint | Ограничение коэффициента gamma. | |
16 | gamma_initializer | Инициализатор коэффициента gamma. | |
17 | gamma_regularizer | Регуляризатор коэффициента gamma. | |
18 | kernel_constraint | Функция ограничения, применяемая к матрице весов. | |
19 | kernel_initializer | Инициализатор матрицы весов. | |
20 | kernel_regularizer | Функция регуляризации, применяемая к матрице весов. | |
21 | kernel_size | Высота и ширина окна свертки. | Integer или кортеж/список двух целых чисел |
22 | momentum | Импульс для скользящего среднего и скользящей дисперсии. | Float |
23 | moving_mean_initializer | Инициализатор скользящего среднего. | |
24 | moving_variance_initializer | Инициализатор скользящей дисперсии. | |
25 | noise_shape | Форма маски разрежения (выход слоя получается в результате умножения входа на эту маску). Например, если форма входа (batch_size, timesteps, features), то маска будет одинакова для всех шагов (timesteps), если задать noise_shape = (batch_size, 1, features). | 1D integer tensor |
26 | padding | Принимает значения "valid" или "same". Влияет на размерность выхода слоя. Так, в случае сверточного слоя при padding = "valid" свертки выполняются только на тех окнах, которые полностью помещаются в пределах входного массива; поэтому размеры массива (карты признаков) на выходе могут быть меньше, чем на входе; например, в картинку размером 28*28 пикселя поместятся только 24*24 окон свертки размера 5*5. В случае "same" и сверточного слоя при единичном шаге окна свертки размеры карт признаков выхода и входа совпадают; для окон свертки, выходящих за границы входного массива, входной массив дополняется нулями. Аналогично параметр работает и на слое подвыборки: при padding = "valid" подвыборки выполняются только на окнах, которые полностью помещаются в пределах входного массива; при padding = "same" область подвыборки расширяется так же, как и в случае сверточного слоя; слой подвыборки (в случае "same") уменьшает размеры карты признаков пропорционально размерам окна подвыборки. | |
27 | pool_size | Размер окна подвыборки. | Integer или кортеж двух целых чисел |
28 | rate | Число в интервале [0, 1], задающее долю нейронов, исключаемых из модели НС. Так, если на входе слоя N нейронов, то на входе слоя, следующего Dropout-слоем, будет (1 - rate) * N нейронов. | Float |
29 | scale | Если True, то тензор умножается на gamma. Можно задать False, если следующий слой линейный (например, nn.relu), поскольку масштабирование будет выполнено следующим слоем. | Boolean |
30 | seed | Затравка датчика случайных чисел. | Integer |
31 | strides | Шаги свертки и подвыборки по высоте и ширине | Integer или кортеж/список двух целых чисел. |
32 | use_bias | Флаг использования вектора смещения. | Boolean |
33 | units | Размер выхода слоя. | Integer |
Функции активации [6], которые можно указать в качестве значения параметра activation при задании слоя (также эти функции можно задать и в виде слоя):
Способы задания функций активации:
from keras.layers import Activation, Dense
model.add(Dense(64))
model.add(Activation('tanh'))
или
model.add(Dense(64, activation = 'tanh'))
или
from keras import backend as K
model.add(Dense(64, activation = K.tanh))
Функции активации, которые задаются в виде слоя [7]:
Возможный способ задания функции активации (на примере LeakyReLU):
from keras.layers import LeakyReLU
hidden2_3 = Dense(12)(hidden2_2)
hidden2_4 = LeakyReLU(alpha = 0.4) (hidden2_3)
Функции регуляризации позволяют применять штрафы к параметрам слоя или активности слоя во время обучения сети. Эти штрафы включены в функцию потерь, которую оптимизирует сеть.
Доступны следующие штрафы [8] (в скобках указаны заданные по умолчанию значения коэффициентов регуляризации):
Эти функции позволяют устанавливать ограничения на значения параметров сети во время оптимизации.
Доступны следующие функции ограничения [9]:
Инициализатор определяет способ задания начальных случайных весов слоев Keras. Доступны следующие инициализаторы [10]:
Параметры инициализаторов приведены в табл. 2.
Таблица 2. Параметры инициализаторов (перечислены в алфавитном порядке)
№ | Параметр | Описание | Тип данных |
---|---|---|---|
1 | fan_in | Количество входных единиц в тензоре весов | Integer |
2 | fan_out | Количество выходных единиц в тензоре весов | тот же |
3 | gain | Коэффициент, на который умножается матрица весов | Float |
4 | limit | Предельное значение равномерного распределения | тот же |
5 | maxval, minval | Соответственно верхняя и нижняя границы равномерного распределения инициализатора RandomUniform | тот же |
6 | mean | Среденее в распределении | тот же |
7 | mode | Режим инициализатора VarianceScaling. Принимает значения 'fan_in', 'fan_out' и 'fan_avg' | String |
8 | scale | Параметр VarianceScaling, влияющий на значение limit | Float |
9 | seed | Затравка датчика случайных чисел | Integer |
10 | stddev | Стандартное отклонение распределения | Float |
Компиляция модели НС выполняется в результате употребления метода compile [11]:
compile(optimizer, loss=None, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)
Параметры метода приведены в табл. 3.
Таблица 3. Параметры метода compile
№ | Параметр | Описание |
---|---|---|
1 | optimizer | Оптимизатор |
2 | loss | Функция потерь |
3 | metrics | Список метрик ('accuracy', 'loss' – точность, потери), используемых при обучении и тестировании |
4 | loss_weights | Необязательный список или словарь, задающий скалярные коэффициенты для взвешивания вкладов потерь различных выходов модели. Потери, которые минимизируются при обучении, будет вычисляться как сумма индивидуальных потерь, взвешенных коэффициентам loss_weights |
5 | sample_weight_mode | Если необходимо выполнить взвешивание выборки с временным шагом (2D-веса), то следует задать sample_weight_mode = 'temporal'. None – значение по умолчанию для случая 1D. Если модель имеет несколько выходов, то можно использовать разные sample_weight_mode для каждого выхода, передав их в виде словаря или списка |
6 | weighted_metrics | Список метрик, которые будут оцениваться и взвешиваться с помощью sample_weight или loss_weight во время обучения и тестирования |
7 | target_tensors | По умолчанию целевые тензоры создаются Keras; параметр target_tensors позволяет пользователю задать свои целевые тензоры (для модели с одним выходом задается один тензор) |
Доступны следующие оптимизаторы [12]:
Параметры оптимизаторов приведены в табл. 4.
Таблица 4. Параметры оптимизаторов (перечислены в алфавитном порядке)
№ | Параметр | Описание | Тип данных |
---|---|---|---|
1 | amsgrad | Флаг использования AMSGrad-варианта алгоритма Adam [14] | Boolean |
2 | beta_1, beta_2 | Соответственно экспоненциально убывающие коэффициенты обновления смещенной оценки первого и второго моментов | Float |
3 | clipnorm | Значения градиентов будут ограничиваться нормой clipnorm | тот же |
4 | clipvalue | Значения градиентов будут находиться в интервале [clipvalue, -clipvalue] | тот же |
5 | decay | Коэффициент убывания скорости обучения | тот же |
6 | epsilon | Коэффициент нечеткости, если не задан, то равен K.epsilon() | тот же |
7 | lr | Скорость обучения | тот же |
8 | momentum (импульс) | Параметр, ускоряющий оптимизатор | тот же |
9 | nesterov | Флаг использования импульса Нестерова | Boolean |
10 | rho | Коэффициент убывания градиента | Float |
Доступные следующие функции потерь [15]:
y_true, y_pred – тензоры, содержащие соответственно истинные и предсказанные значения меток.
Подробное описание функций потерь, имеющихся в библиотеке Keras, дано в [16].
Обучение НС выполняется в результате обращения к методу fit [11]:
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)
Параметры метода fit приведены в табл. 5.
Таблица 5. Параметры метода fit
№ | Параметр | Описание | Тип данных |
---|---|---|---|
1 | x | Массив обучающих данных, если модель имеет один входной слой, или список массивов – в противном случае | Numpy-массив |
2 | y | Массив целей (меток), если модель имеет один выходной слой, или список массивов – в противном случае | тот же |
3 | batch_size | Размер пакета обучения. Градиент усредняется по примерам, имеющимся в пакете обучения, после чего веса НС пересчитываются с использованием этой усредненной величины. В известном смысле выполняется аппроксимация градиента по всему обучающему множеству. Значение по умолчанию равно 32 | Integer или None |
4 | epochs | Число эпох обучения НС (эпоха – это применение всех заданных параметрами x и y данных). При использовании параметра initial_epoch параметр epochs задает номер последней эпохи обучения | Integer |
5 | verbose | Уровень печати в процессе обучения. Равен 0, 1 или 2. 0 – нет печати; 1 – печать после каждой обучающей порции; 2 – печать после каждой эпохи | тот же |
6 | callbacks | Список процедур, выполняемых в процессе обучения | |
7 | validation_split | Значение между 0 и 1, разбивающее входные данные на две порции: обучающую и тестовую. долю обучающих данных, используемую для проверки НС. В качестве тестовых данных берутся последние образцы из x и y (это выполняется до перетасовки данных) | Float |
8 | validation_data | Кортеж (x_val, y_val) или кортеж (x_val, y_val, val_sample_weights) данных импользукемых для оценки потерь и любой другой заданной метрики в конце каждой эпохи epoch. Если заданы одновременно validation_data и validation_split, то validation_split игнорируется | |
9 | shuffle | Если имеет тип Boolean, то трактуется как флаг перетасовки обучающих данных перед каждой эпохой обучения, если равен 'batch', то перетасовка выполняется порциями размером batch-sized. Параметр игнорируется, когда steps_per_epoch отличен от None | Boolean/String |
10 | class_weight | Необязательный словарь, отображающий индекс класса в значение веса, используемое для взвешивания функции потерь (только во время обучения). Параметр позволяет указать модели "уделять больше внимания" образцам из недостаточно полно представленных классов | Float |
11 | sample_weight | Необязательный массив весов для обучающих образцов, используемый для взвешивания функции потерь (только во время тренировки). Можно задать 1D-массив (вектор) той же длины, что входной массив (отображение вес-образец 1:1). В случае временных данных задается 2D-массив формы (samples, sequence_length), позволяющий применять различные веса на каждом временном шаге. В последнем случае в методе compile следует задать sample_weight_mode='temporal' | Numpy array |
12 | initial_epoch | Эпоха, с которой будет начато обучение. Параметр полезен при возобновление прерванного обучения | Integer |
13 | steps_per_epoch | Число шагов (порций данных), после выполнения которых эпоха обучения объявляется завершенной. Если на входе TensorFlow-тензор, значение по умолчанию, равное None, означает, что эпоха будет завершена через len(x) / batch-size шагов, где len(x) – число образцов в x (минимальное число шагов равно 1) | Integer или None |
14 | validation_steps | Число шагов, после выполнения которых завершается тестирование). Задается, если задан параметр steps_per_epoch | Integer |
Метод fit возвращает объект типа History. Его свойство History.history содержит значения потерь и заданных метрик после завершения каждой эпохи обучения, а также значения потерь и метрик последующего тестирования (если оно предусмотрено по завершению эпохи).
Показаны на рис. 1 – 3.
Рис. 1. Пример структуры многослойного перцептрона
Рис. 2. Пример структуры сверточной нейронной сети
Рис. 3. Пример структуры сборки сверточных нейронных сетей с двумя ветвями
Для объединения идущих по ветвям сборки данных используется слой Average. Иные способы объединения данных описаны в [17]; вот их список:
Известны советы относительно применения некоторых рассмотренных выше параметров:
В частности, в [19] используются следующие средства управления скоростью обучения:
import keras.callbacks as cb
#
# Параметр функции обратного вызова LearningRateScheduler
# Изменяет скорость обучения в зависимости от числа пройденных эпох
def lr_schedule(epoch):
lr = 1e-3
if epoch>180:
lr *= 0.5e-3
elif epoch>160:
lr *= 1e-3
elif epoch>120:
lr *= 1e-2
elif epoch>80:
lr *= 1e-1
print('Скорость обучения:', lr)
return lr
#
# Функция обратного вызова, задающая график изменения скорости обучения
lr_scheduler = cb.LearningRateScheduler(lr_schedule)
# Функция обратного вызова, снижающая скорость обучения, если потери val_loss не снижаются patience эпох
lr_reducer = cb.ReduceLROnPlateau(factor = np.sqrt(0.1), cooldown = 0, patience = 5, min_lr = 0.5e-6)
# Список функций обратного вызова
callbacks_list = [lr_reducer, lr_scheduler]
# Обучение модели
history = model.fit(<другие параметры метода fit>, callbacks = callbacks_list)
Метрика – это функция, используемая для оценки эффективности модели НС [20]. Метрики задаются параметром metrics (в виде списка) метода compile, например:
model.compile(loss = 'mean_squared_error', optimizer = 'sgd', metrics = ['mae', 'acc'])
или
from keras import metrics
model.compile(loss = 'mean_squared_error', optimizer = 'sgd', metrics = [metrics.mae, metrics.categorical_accuracy])
Функция метрики схожа с функцией потерь, однако результат оценки сети по метрике не используется при обучении модели. В качестве метрики может быть использована любая функция потерь.
Также в качестве метрики можно указать имя доступной метрики, например, 'accuracy' символьную функцию Theano/TensorFlow.
Параметры функции метрики:
Функция метрики возвращает единичный тензор, представляющий среднее значение по всем элементам массива, вычисляемого по входным данным в соответствии с заданной метрикой.
Доступные метрики:
Пользовательские функции метрики так же должны иметь два параметра (y_true, y_pred) и возвращать единичный тензор, например:
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])
Замечание 2. Для функции потерь binary crossentropy в случае указания метрики 'accuracy' возвращает завышенные значения точности (binary_accuracy).
Чтобы получить реальную точность, с binary crossentropy используется вдобавок метрика categorical_accuracy:
metrics = ['accuracy', keras.metrics.categorical_accuracy]
Воспроизведение результатов эпизода обучения обеспечивает следующий код [20], который должен быть исполнен до начала создания НС и ее обучения:
# Флаг задания режима воспроизведения результатов
repeat_results = True # True
seedVal = 348
import numpy as np
np.random.seed(seedVal) # Задание затравки датчика случайных чисел
#
if repeat_results:
print('Режим воспроизведения (повторяемости) результатов')
import random as rn
import tensorflow as tf
import os
from keras import backend as K
# Код, необходимый для воспроизведения результата
os.environ['PYTHONHASHSEED'] = '0'
rn.seed(seedVal)
tf.set_random_seed(seedVal)
session_conf = tf.ConfigProto(intra_op_parallelism_threads = 1,
inter_op_parallelism_threads = 1)
sess = tf.Session(graph = tf.get_default_graph(), config = session_conf)
K.set_session(sess)
В этом коде фиксируются затравки датчиков случайных чисел, значение системной переменной PYTHONHASHSEED и устанавливается в сессии tensorFlow однопоточность.
Неповторяемость результата обучения возникает также при использовании TensorFlow на GPU: некоторые операции, в частности tf.reduce_sum(), имеют нечеткий результат. Это обусловлено тем, что на GPU многие операции исполняются параллельно, поэтому порядок выполнения не всегда гарантирован. Из-за ограниченной точности вычислений даже сложение нескольких чисел может дать разные результаты при разных порядках выполнения этой операции. Можно попытаться при программировании избежать нечетких операций, но некоторые могут быть созданы автоматически TensorFlow при вычислении градиентов. Проще всего добиться повторяемости результатов, выполняя код на CPU. Для этого следует переменную окружения CUDA_VISIBLE_DEVICES инициализировать пустой строкой, например [21]:
$ CUDA_VISIBLE_DEVICES="" PYTHONHASHSEED=0 python your_program.py
Градиентные методы, лежащие в основе алгоритмов машинного обучения, весьма чувствительны к распределению индивидуальных признаков: результативность алгоритмов может быть неудовлетворительной, если распределение индивидуального признака существенно отличается от стандартного нормального распределения, имеющего нулевое математическое ожидание и единичную дисперсию.
Изменение распределения признака выполняется в результате нормализации или стандартизации.
Нормализация предполагает такое масштабирование признака, после которого он имеет единичную норму (l1 или l2).
Стандартизация – такое преобразование данных, после которого среднее значение каждого признака равно 0, а дисперсия равна 1 (то есть, как в стандартном нормальном распределении).
В библиотеке Scikit-Learn есть следующие функции нормализации и стандартизации:
from sklearn import preprocessing
normalized_X = preprocessing.normalize(X, norm = 'l2') # Нормализация (другая норма – 'l1')
standardized_X = preprocessing.scale(X) # Стандартизация
# Иная возможность нормализации и стандартизации данных
normalizer = preprocessing.Normalizer().fit(X)
X = normalizer.transform(X)
# fit – вычисляет среднее значение и стандартное отклонение для последующей стандартизации
scaler = preprocessing.StandardScaler(copy = False).fit(X)
X = scaler.transform(X) # Стандартизация за счет центрирования и масштабирования
В случае НС на вход 1D-слоя подается тензор формы (размер_пакета, карта_признаков), то есть пакет признаков. Поэтому нормализация признаков НС называется пакетной. Пакетная нормализация выполняется по следующему алгоритму [2]:
Входные данные: значения x из пакета B = {x1, x2, ..., xm} (xi – индивидуальный признак; m – размер пакета); обучаемые параметры γ и β; константа ε для вычислительной устойчивости.
Выходные данные: {yi = BNγ, β(xi)}
Пакетная нормализация позволяет:
Согласно [2], выполняемая по приведенному выше алгоритму пакетная нормализация, уменьшает эффект внутреннего сдвига переменных (internal covariate shift). Этот эффект иллюстрирует рис. П1 (пример взят из [22]).
Рис. П1. Иллюстрация эффекта внутреннего сдвига
На рис. П1 представлен нейрон первого слоя с двумя входами и функцией активации tanh.
Предполагается, что на входы нейрона подаются нормально распределенные данные со средними значениями 2 и -2 и дисперсией 0.5. Эти распределения показаны в левой части рис. П1.
В правой части рис. П1 показаны распределения выхода нейрона для случаев w = (0, 0.5, 0.5) и w = (0.5, 0.9, 0.1). Эти распределения построены в результате выполнения программы, генерирующей входные данные (согласно заданным распределениям на входе) и вычисляющий выход
y = tanh(w0 + w1x1 + w2x2).
Нейрон второго слоя первоначально обучится реагировать на входы из распределения, получаемого при весах w = (0, 0.5, 0.5) нейрона первого слоя, то есть на данные преимущественно из интервала [-0.5, 0.5]. Однако после изменения весов нейрона первого слоя выход этого нейрона попадает в интервал [0.5, 1] (чаще ближе к 1), то есть нейрон второго слоя придется обучать заново.
Пакетная нормализация позволяет устранить эту проблему, получившую название внутреннего сдвига переменных.
1. Hinton G., Srivastava N., Swersky K. Neural networks for machine learning. [Электронный ресурс] URL: http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf (дата обращения: 01.01.2019).
2. Sergey Ioffe, Christian Szegedy. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. [Электронный ресурс] URL: https://arxiv.org/abs/1502.03167 (дата обращения: 01.01.2019).
3. Normalization Layers. BatchNormalization. [Электронный ресурс] URL: https://keras.io/layers/normalization/ (дата обращения: 01.01.2019).
4. Convolutional layers. [Электронный ресурс] URL: https://keras.io/layers/convolutional/ (дата обращения: 01.01.2019).
5. Core layers. [Электронный ресурс] URL: https://keras.io/layers/core/ (дата обращения: 01.01.2019).
6. Keras activations. [Электронный ресурс] URL: https://keras.io/activations/ (дата обращения: 01.01.2019).
7. Keras advanced activations. [Электронный ресурс] URL: https://keras.io/layers/advanced-activations/ (дата обращения: 01.01.2019).
8. Keras regularizers. [Электронный ресурс] URL: https://keras.io/regularizers/ (дата обращения: 01.01.2019).
9. Keras constraints. [Электронный ресурс] URL: https://keras.io/constraints/ (дата обращения: 01.01.2019).
10. Keras initializers. [Электронный ресурс] URL: https://keras.io/initializers/ (дата обращения: 01.01.2019).
11. Model class API. [Электронный ресурс] URL: https://keras.io/models/model/https://keras.io/initializers/ (дата обращения: 01.01.2019).
12. Keras optimizers. [Электронный ресурс] URL: https://keras.io/optimizers/ (дата обращения: 01.01.2019).
13. Incorporating Nesterov Momentum into Adam URL: http://cs229.stanford.edu/proj2015/054_report.pdf (дата обращения: 01.01.2019).
14. On the Convergence of Adam and Beyond. [Электронный ресурс] URL: https://openreview.net/forum?id=ryQu7f-RZ (дата обращения: 01.01.2019).
15. Keras losses. [Электронный ресурс] URL: https://keras.io/losses/ (дата обращения: 01.01.2019).
16. Функции потерь библиотеки Keras. [Электронный ресурс] URL: http://100byte.ru/python/loss/loss.html (дата обращения: 01.01.2019).
17. Merge Layers. [Электронный ресурс] URL: https://keras.io/layers/merge/ (дата обращения: 01.01.2019).
18. Zulkifli H. Understanding Learning Rates and How It Improves Performance in Deep Learning. [Электронный ресурс] URL: https://towardsdatascience.com/understanding-learning-rates-and-how-it-improves-performance-in-deep-learning-d0d4059c1c10 (дата обращения: 01.01.2019).
19. Keras Documentation. CIFAR-10 ResNet. . [Электронный ресурс] URL: https://keras.io/examples/cifar10_resnet/ (дата обращения: 01.01.2019).
20. Usage of metrics. [Электронный ресурс] URL: https://keras.io/metrics/ (дата обращения: 01.01.2019).
21. Keras documentation. How can I obtain reproducible results using Keras during development? [Электронный ресурс] URL: https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development (дата обращения: 01.01.2019).
22. Николенко С., Кадурин А., Архангельская Е. Глубокое обучение. – СПб.: Питер, 2018. – 480 с.