Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шолле Ф. - Глубокое обучение на Python (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
11.34 Mб
Скачать

130    Глава 3. Введение в Keras и TensorFlow

. AUC;

. Precision;

. Recall .и.др.

Далее.в.книге.вы.увидите.многие.из.этих.вариантов.в.действии.

3.6.4. Выбор функции потерь

Выбор.правильной.функции.потерь.для.решения.конкретной.задачи.играет. очень.важную.роль:.ваша.модель.будет.использовать.любую.возможность.минимизировать.потери,.поэтому.если.функция.потерь.не.отвечает.полностью. критериям.успешного.решения.задачи,.то.модель.в.конечном.счете.может.выдать. совсем.не.тот.результат,.что.вам.нужен..Представьте.глупый.и.всемогущий.ИИ,. обученный.методом.градиентного.спуска,.с.неправильно.выбранной.целевой. функцией:.«максимизировать.среднее.благосостояние.всех.живущих.людей».. Чтобы.упростить.себе.работу,.такой.ИИ.мог.бы.уничтожить.всех,.кроме.нескольких.человек,.и.сосредоточиться.на.их.потребностях,.поскольку.среднее. благосостояние.не.зависит.от.количества.оставшихся..Но.мы.же.совсем.не.это. имели.в.виду!.Нейронные.сети,.которые.вы.строите,.в.минимизации.функции. потерь.будут.столь.же.беспощадны,.поэтому.мудро.выбирайте.цель,.иначе.вам. придется.столкнуться.с.неожиданными.побочными.эффектами.

К.счастью,.для.типовых.задач.(таких.как.классификация,.регрессия.и.предсказание.последовательностей).имеются.простые.рекомендации,.которым.можно. следовать.при.выборе.функции.потерь..Например,.для.классификации.в.две. категории.можно.использовать.функцию.бинарной.перекрестной.энтропии,.в.не- сколько.категорий.—.многозначной.перекрестной.энтропии.и.т..д..Свои.функции. потерь.вам.придется.разрабатывать,.только.сталкиваясь.с.действительно.новыми. исследовательскими.задачами..В.следующих.нескольких.главах.мы.подробно. объясним,.какие.функции.потерь.стоит.выбирать.для.распространенных.задач.

3.6.5. Метод fit()

За.вызовом.compile() .следует.вызов.fit()..Метод.fit() .реализует.собственно. цикл.обучения..Вот.его.основные.аргументы:

.данные.для.обучения.(исходные.данные.и.целевые.значения)..Обычно.передаются.в.виде.массивов.NumPy.или.объекта.Dataset.из.библиотеки.TensorFlow. (больше.о.возможностях.Dataset .вы.узнаете.в.следующих.главах);

.количество.эпох.обучения:.сколько.раз.должен.повториться.цикл.обучения. на.переданных.данных;

3.6. Анатомия нейронной сети: знакомство с основами Keras    131

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

Листинг 3.23. Вызов метода fit() с данными в формате NumPy

 

 

 

 

Исходные образцы

 

 

 

 

history = model.fit(

 

в виде массива NumPy

 

 

Цели обучения в виде

inputs,

 

 

 

 

 

 

 

targets,

 

 

 

массива NumPy

 

 

 

 

 

epochs=5,

 

 

 

Цикл обучения выполнит

 

 

 

batch_size=128

 

 

 

 

 

 

 

 

 

 

пять итераций по данным

 

 

)

 

 

 

В итерациях цикла обучения исходные данные

 

 

 

 

 

 

 

 

будут обрабатываться пакетами по 128 образцов

Вызов.fit() .возвращает.объект.History .с.полем.history .—.словарем,.ключами. которого.служат.имена.метрик.или.строки.(такие.как."loss"),.а.значениями.—. списки.значений.соответствующих.метрик,.полученных.в.разные.эпохи.

>>> history.history

{"binary_accuracy": [0.855, 0.9565, 0.9555, 0.95, 0.951], "loss": [0.6573270302042366,

0.07434618508815766,

0.07687718723714351,

0.07412414988875389,

0.07617757616937161]}

3.6.6. Оценка потерь и метрик на проверочных данных

Цель.машинного.обучения.не.в.том,.чтобы.создать.модели,.которые.дают.точные. прогнозы.на.обучающих.данных.(что.довольно.просто.—.достаточно.лишь.следо- вать.за.градиентом),.а.в.том,.чтобы.создать.модель,.хорошо.справляющуюся.со. своей.задачей.в.целом.—.и.особенно.на.данных,.которые.она.раньше.не.видела..

Хорошие.результаты.на.обучающих.данных.не.гарантируют.такой.же.исход. на.данных,.которые.модель.не.видела.прежде!.Например,.она.может.просто. запомнить.связь.между.обучающими.данными.и.ожидаемыми.результатами.—. и.в.новых.условиях.для.задачи.прогнозирования.станет.совершенно.бесполезной..

Мы.рассмотрим.этот.аспект.более.подробно.в.главе.5.

Для.оценки.качества.модели.—.того,.как.она.справляется.со.своей.задачей.на. новых.данных,.—.обычно.принято.выделять.некоторую.часть.исходных.данных. в.отдельную.проверочную выборку:.данные.из.этой.выборки.не.участвуют.в.обучении.модели,.но.используются.для.вычисления.величины.потерь.и.метрик..Проверочную.выборку.можно.передать.методу.fit() .в.аргументе.validation_data..

132    Глава 3. Введение в Keras и TensorFlow

По.аналогии.с.обучающими.данными.проверочные.данные.могут.передаваться. в.форме.массива.NumPy.или.объекта.Dataset .из.библиотеки.TensorFlow.

Листинг 3.24. Использование аргумента validation_data

model = keras.Sequential([keras.layers.Dense(1)]) model.compile(optimizer=keras.optimizers.RMSprop(learning_rate=0.1),

loss=keras.losses.MeanSquaredError(),

 

 

 

 

Чтобы избежать попадания

 

 

 

 

metrics=[keras.metrics.BinaryAccuracy()])

 

 

в проверочную выборку

indices_permutation = np.random.permutation(len(inputs))

 

 

 

только экземпляров одного

 

 

 

класса, исходные и целевые

 

shuffled_inputs = inputs[indices_permutation]

 

 

 

 

данные перемешиваются

 

 

 

 

shuffled_targets = targets[indices_permutation]

 

 

 

 

методом случайной

 

 

 

 

 

 

 

 

 

перестановки индексов

num_validation_samples = int(0.3 * len(inputs))

 

 

 

 

 

 

Зарезервировать 30 %

 

 

 

 

 

 

val_inputs = shuffled_inputs[:num_validation_samples]

 

 

исходных и целевых

val_targets = shuffled_targets[:num_validation_samples]

 

 

данных для проверки

 

 

training_inputs = shuffled_inputs[num_validation_samples:]

 

 

(эти образцы

training_targets = shuffled_targets[num_validation_samples:]

 

 

будут исключены

model.fit(

 

 

 

 

 

 

 

 

 

 

из процесса обучения

 

 

 

 

 

 

 

 

 

 

и используются только

training_inputs,

 

Обучающие данные, использующиеся

 

 

 

 

 

 

 

 

 

 

 

 

 

для вычисления

training_targets,

 

для корректировки весов модели

 

 

 

 

 

 

 

 

 

 

 

 

 

величины потерь

epochs=5,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

и метрик)

batch_size=16,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

validation_data=(val_inputs, val_targets)

 

 

Проверочные данные, использующиеся

)

 

 

 

 

 

 

 

 

только для оценки величины потерь

 

 

 

 

 

 

 

 

 

 

и метрик на этапе проверки

Величина.потерь,.полученная.при.оценке.на.проверочных.данных,.называется.

потерей.на проверочных данных,.чтобы.отличать.ее.от.потери на обучающих данных..Помните:.важно.строго.отделять.одни.данные.от.других..Задача.проверки.состоит.в.том,.чтобы.оценить,.насколько.хорошие.результаты.показывает. обученная.модель.на.новых.данных..Если.модель.видела.проверочные.данные. во.время.обучения,.то.потери.на.проверочных.данных.и.метрики.будут.оцениваться.некорректно.

Потери.на.проверочных.данных.и.метрики.можно.вычислить.после.завершения. обучения.вызовом.метода.evaluate():

loss_and_metrics = model.evaluate(val_inputs, val_targets, batch_size=128)

Метод.evaluate().выполнит.итерации.по.пакетам.(размером.batch_size).с.пере- данными.данными.и.вернет.список.скаляров,.первый.из.которых.—.величина. потерь.на.проверочных.данных,.а.последующие.—.метрики..Если.модель.не.имеет. метрик,.то.возвращено.будет.только.одно.значение.—.величина.потерь.на.про- верочных.данных.(а.не.список).

3.6. Анатомия нейронной сети: знакомство с основами Keras    133

3.6.7. Вывод: использование модели после обучения

После.обучения.модель.можно.использовать.для.вычисления.прогнозов.на.основе.новых.данных..Этот.этап.называется.выводом..Простейший.способ.получить. прогноз.—.вызвать.метод.__call__() .модели:

predictions = model(new_inputs)

Принимает массив NumPy или тензор TensorFlow и возвращает тензор TensorFlow

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

Лучший.способ.получить.вывод.—.использовать.метод.predict()..Он.выпол- нит.обход.данных,.разбив.их.на.небольшие.пакеты,.и.вернет.массив.NumPy. с.прогнозами..В.отличие.от.__call__(),.он.также.может.обрабатывать.объекты.

Dataset.

predictions = model.predict(new_inputs, batch_size=128)

Принимает массив NumPy или объект Dataset и возвращает массив NumPy

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

>>>predictions = model.predict(val_inputs, batch_size=128)

>>>print(predictions[:10])

[[0.3590725 ] [0.82706255] [0.74428225] [0.682058 ] [0.7312616 ] [0.6059811 ] [0.78046083] [0.025846 ] [0.16594526] [0.72068727]]

На.данный.момент.это.все,.что.нужно.знать.о.моделях.Keras..Теперь.вы.готовы. перейти.к.решению.реальных.задач.машинного.обучения.с.помощью.Keras,.чем. мы.и.займемся.в.следующей.главе.