Это 11-й день моего участия в августовском испытании обновлений.Подробности о событии:Испытание августовского обновления
Deep Learning with Python
Эта статья — одна из серии заметок, которые я написал, изучая Deep Learning with Python (второе издание, Франсуа Шолле). Содержимое статьи конвертировано из блокнотов Jupyter в Markdown, вы можете перейти наGitHubилиGiteeнайти оригинал.ipynb
ноутбук.
ты можешь идтиЧитайте оригинальный текст этой книги онлайн на этом сайте(Английский). Автор этой книги также дает соответствиеJupyter notebooks.
Эта статьяГлава 7. Передовые методы расширенного глубокого обучения (Chapter 7. Advanced deep-learning best practices) одной из записок.
7.2 Inspecting and monitoring deep-learning models using Keras callbacks and TensorBoard
Проверяйте и отслеживайте модели глубокого обучения с помощью обратных вызовов Keras и TensorBoard.
После запуска сложной обучающей задачи с помощью model.fit() мы можем только ждать, и мы не знаем, правильно она работает или нет, пока она не закончится, и мы не можем это контролировать, это как бросить бумажный самолетик и отпустив его Ветер уходит в неопределенное расстояние. Вместо такого неуправляемого бумажного самолета мы, возможно, предпочли бы интеллектуальный дрон, который может чувствовать окружающую среду, отправлять нам данные и автономно перемещаться в зависимости от текущего состояния. Функции обратного вызова Keras и такие инструменты, как TensorBoard, могут помочь нам превратить «бумажные самолетики» в «умные дроны».
Примените функцию обратного вызова к модели во время обучения
Когда мы обучаем модель, мы сначала не знаем, сколько раундов нужно запустить, мы можем только позволить ей выполнить достаточное количество раундов, затем вручную найти оптимальное количество раундов и повторно обучить эту модель оптимального количества раундов, которая занимает довольно много времени. Поэтому мы предпочитаем автоматически останавливать обучение, когда модель замечает, что потеря проверки больше не улучшается.
Эту операцию можно выполнить с помощью обратных вызовов Keras: Keras предоставляет множество полезных обратных вызовов, которые можно поместить вkeras.callbacks
Здесь обучение автоматической остановке является лишь одним из таких применений.
Обратный вызов вызывается моделью в разные моменты процесса обучения, он имеет доступ к состоянию модели и может выполнять некоторые действия, такие как:
- Контрольные точки модели: сохраняйте текущие веса модели в разные моменты процесса обучения.
- Досрочное прекращение: прерывайте обучение, когда потеря проверки больше не улучшается
- Динамическая настройка значений параметров: например, динамическая настройка скорости обучения оптимизатора.
- Запишите метрики обучения и проверки: используйте эти метрики для визуализации представлений, изученных моделью.
- ...
использовать обратный вызов
В Keras встроено множество полезных обратных вызовов, таких как:
-
ModelCheckpoint
: Сохранение модели, обученной определенным состояниям во время обучения. Его можно использовать для непрерывного сохранения модели, а также для выборочного сохранения текущей наилучшей модели; -
EarlyStopping
: целевой показатель для отслеживания, если он больше не улучшается в течение установленного количества раундов, тренировка будет прервана; -
ReduceLROnPlateau
: Уменьшите скорость обучения, когда потери при проверке больше не улучшаются (встречается плато потерь).
Использование этих обратных вызовов также просто:
from tensorflow import keras
callbacks_list = [
# 在每轮完成后保存权重
keras.callbacks.ModelCheckpoint(
filepath='my_model.h5', # 保存文件的路径
monitor='val_loss', # monitor:要验证的指标
save_best_only=True, # 只保存让 monitor 指标最好的模型(如果 monitor 没有改善,就不保存)
),
# 不再改善时中断训练
keras.callbacks.EarlyStopping(
monitor='acc', # 要验证的指标
patience=10, # 如果 monitor 在多于 patience 轮内(比如这里就是10+1=11轮)没有改善,则中断训练
),
# 不再改善时降低学习率
keras.callbacks.ReduceLROnPlateau(
monitor='val_loss', # 要验证的指标
factor=0.1, # 触发时:学习率 *= factor
patience=5, # monitor 在 patience 轮内没有改善,则触发降低学习率
),
]
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc']) # 在 callback 里用到了 acc 做指标,所以这里的 metrics 里要有 acc
model.fit(x, y,
epochs=10,
batch_size=32,
callbacks=callbacks_list, # 训练时使用这些回调
validation_data=(x_val, y_val)) # callback 里用到了 val,所以这里必须有 val
Напишите свою функцию обратного вызова
Помимо использования встроенных обратных вызовов Keras, вы также можете написать свои собственные обратные вызовы для выполнения операций, которые не являются встроенными.
Напишите обратный вызов самостоятельно, создавkeras.callbacks.Callback
подкласс для реализации. Подобно написанию игровых скриптов, реализуйте в этом подклассе некоторые методы, которые затем будут вызываться в определенные моменты процесса обучения:
метод | время, когда его назвали |
---|---|
on_epoch_begin | Вызывается в начале каждого раунда |
on_epoch_end | объявляется в конце каждого раунда |
on_batch_begin | вызывается перед обработкой каждого пакета |
on_batch_end | вызывается после обработки каждого пакета |
on_train_begin | позвонили в начале тренировки |
on_train_end | позвонили в конце тренировки |
Эти методы принимают параметр журнала (тип dict), который содержит информацию о предыдущей эпохе, партии или поезде, включая метрики обучения, метрики проверки и т. д.
В рамках этих методов вы также можете получить доступ:
-
self.model
: экземпляр модели, для которого вызывается обратный вызов; -
self.validation_data
: подходят входящие данные проверки;
Например, мы пишем пользовательскую функцию обратного вызова для сохранения рассчитанного значения активации каждого слоя модели для первого образца набора проверки после каждого раунда:
from tensorflow import keras
import numpy as np
class ActivationLogger(keras.callbacks.Callback):
def set_model(self, model): # 在训练之前由父模型调用,告诉回调函数是哪个模型在调用它
self.model = model
layer_outputs = [layer.output for layer in model.layers]
self.activations_model = keras.models.Model(model.input, layer_outputs) # 模型实例,返回每层的激活
def on_epoch_end(self, epoch, logs=None):
if self.validation_data is None:
raise RuntimeError('Requires validation_data.')
validation_sample = self.validation_data[0][0:1]
activations = self.activations_model.predict(validation_sample)
with open(f'activations_at_epoch_{epoch}.npz', 'w') as f:
np.savez(f, activations)
Введение в TensorBoard: платформа визуализации для TensorFlow
Чтобы сделать модель лучше, помимо размышлений об архитектуре и написания кода, нам также необходимо получить информацию о модели, понять, что происходит внутри модели во время обучения, и использовать эту информацию, чтобы знать, что мы можем переосмыслить. и повторно оптимизировать модель.
Мышление происходит в вашей голове, кодирование модели можно легко реализовать с помощью Keras API, а понимание модели можно позаимствовать у TensorBoard. TensorBoard — это браузерный инструмент визуализации, встроенный в TensorFlow, который позволяет вам визуально отслеживать все, что происходит внутри вашей модели во время обучения.
TensorBoard в основном имеет следующие функции:
- Визуально контролировать показатели во время обучения
- Визуализируйте архитектуру модели
- Визуализируйте гистограммы активаций и градиентов
- Исследуйте вложения в трех измерениях
Мы демонстрируем использование TensorBoard путем обучения одномерной сверточной нейронной сети задаче анализа тональности IMDB:
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing import sequence
max_features = 2000
max_len = 500
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
x_train = sequence.pad_sequences(x_train, maxlen=max_len)
x_test = sequence.pad_sequences(x_test, maxlen=max_len)
model = keras.models.Sequential()
model.add(layers.Embedding(max_features, 128,
input_length=max_len,
name='embed'))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.MaxPool1D(5))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(1))
model.summary()
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc'])
Чтобы использовать TensorBoard, вам нужно провести некоторую подготовку перед началом обучения. Сначала создайте каталог для файлов журналов, которые нужны TensorBoard, и запустите службу TensorBoard. В оболочке:
$ mkdir my_log_dir
Или в блокноте Jupyter:
%mkdir my_log_dir
Затем создайте экземпляр функции обратного вызова TensorBoard:
import tensorflow as tf
tensorboard_callback = tf.keras.callbacks.TensorBoard(
log_dir='my_log_dir', # 日志文件的储存位置
histogram_freq=1, # 每 histogram_freq 轮之后记录激活直方图
embeddings_freq=1, # 每 histogram_freq 轮之后记录词嵌入
)
Наконец, просто используйте этот обратный вызов при обучении:
history = model.fit(x_train, y_train,
epochs=20,
batch_size=128,
validation_split=0.2,
callbacks=[tensorboard_callback])
Epoch 1/20
157/157 [==============================] - 25s 156ms/step - loss: 0.6376 - acc: 0.6424 - val_loss: 0.7053 - val_acc: 0.7210
...
После запуска обучения (не дожидаясь окончания обучения) вы можете запустить сервис TensorBoard:
$ tensorboard --logdir=my_log_dir
Или в блокноте Jupyter:
%load_ext tensorboard
%tensorboard --logdir=my_log_dir
Теперь вы можете открыть его в своем браузереhttp://localhost:6006
Давайте посмотрим на процесс обучения визуальной модели TensorBoard.
- Во вкладке Scalars вы можете увидеть кривую изменения точности и потерь в процессе обучения, которая аналогична тому, что мы рисовали с помощью plt после каждой тренировки до этого, но в TensorBoard вы можете обновить ее в любой момент, не дожидаясь, пока обучение завершено. ;
- На вкладке "График" отображается визуализация базового графа операций TensorFlow за моделью Keras. Этот базовый граф операций сложнее, чем наша модель Keras. Это то, что Keras упрощает для нас. Keras позволяет нам не трогать эти сложные вещи. Делает рабочий процесс очень прост; если вы хотите увидеть графическое представление самой модели Keras, вы можете использовать
keras.utils.plot_model
:
import tensorflow as tf
tf.keras.utils.plot_model(model, show_shapes=True, to_file='model.png')
# show_shapes=True 可以把各层的输入输出张量形状显示出来
- Во вкладке «Гистограммы» есть гистограммы значений активации для каждого слоя;
- На вкладке «Проектор» есть встраивание слов в пространственные отношения для 2000 слов в нашем словаре. Это «проецируемое» изображение, полученное путем уменьшения 128-мерного пространства встраивания, изученного слоем встраивания, до 2 или 3 измерений с использованием таких алгоритмов, как PCA. Если вас интересует значение каждой точки в нем, вы можете нажать на точку, чтобы просмотреть ее номер, а затем использовать следующий код, чтобы восстановить слово, чтобы увидеть:
index_word = {v: k for k, v in imdb.get_word_index().items()}
def show_word_of_index(idx): # idx 输入看到的词编号
print(index_word[idx])
show_word_of_index(123)
Затем он выведет слово, например:ever
.