Python. TensorFlow для чайников. Часть 2
На прошлом уроке я рассказал как создать на TensorFlow простой нейрон. Сегодня будем изучать другу часть библиотеки, связанную с визуализацией (TensorBoard). Что такое TensorBoard? Это мощная система визуализации, которая, как правило, ставиться вместе с самим TensorFlow. Он позволяет, например, визуализировать схему нейронной сети. Сейчас я вам это продемонстрирую. Итак, берем код прошлого урока. Слегка переделываем его, вставляя необходимые функции, чтобы передать нужные данные TensorBoard:
import tensorflow as tf import matplotlib.pyplot as plt #создаим сессию sess = tf.Session() #Создадим граф graph = tf.get_default_graph() #Создадим входное значение input_value = tf.constant(1.0) #Создадим переменную weight = tf.Variable(0.8) #Создаим выходное значение output_value = weight * input_value #Создаем оптимизиатор desired_output_value = tf.constant(2.0) loss = (output_value - desired_output_value)**2 #Функция ошибки optim = tf.train.GradientDescentOptimizer(learning_rate=0.025) #Оптимизатор grads_and_vars = optim.compute_gradients(loss) #Инициализируем переменные init=tf.global_variables_initializer() sess.run(init) writer = tf.summary.FileWriter("e:\\output_dir", sess.graph) #Обучаем train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss) for i in range(100): writer.add_summary(sess.run(train_step),i) print(sess.run(output_value)) writer.add_graph(graph) writer.close()
Затем запускаем TensorBoard, например, вот таким вот батничком:
C:\Users\user\AppData\Local\Programs\Python\Python36\python.exe C:\Users\user\AppData\Local\Programs\Python\Python36\Lib\site-packages\tensorflow\tensorboard\tensorboard.py —logdir=e:\output_dir
Мы увидим окно командной строки, где будет показан адрес доступа к локальной странице показа информации:
Набираем ее в браузере, переключаемся на закладку Grapth и видим граф нашей нейронной сети:
Этот граф можно двигать мышкой и даже менять его масштаб (колесиком мышки):
В тексте программы можно задавать имена операциям (параметр name), например:
#Создадим входное значение input_value = tf.constant(1.0, name="Input") #Создадим переменную weight = tf.Variable(0.8, name="Weight")
На графе они тоже будут видны:
Еще элементы графа можно группировать. Например, вот так:
import tensorflow as tf import matplotlib.pyplot as plt #создаим сессию sess = tf.Session() #Создадим граф graph = tf.get_default_graph() with tf.name_scope("MyOperationGroup"): with tf.name_scope("Scope_A"): #Создадим входное значение input_value = tf.constant(1.0, name="Input") #Создадим переменную weight = tf.Variable(0.8, name="Weight") #Создаим выходное значение output_value = weight * input_value with tf.name_scope("Scope_B"): #Создаем оптимизиатор desired_output_value = tf.constant(2.0) loss = (output_value - desired_output_value)**2 #Функция ошибки optim = tf.train.GradientDescentOptimizer(learning_rate=0.025) #Оптимизатор grads_and_vars = optim.compute_gradients(loss) #Инициализируем переменные init=tf.global_variables_initializer() sess.run(init) writer = tf.summary.FileWriter("e:\\output_dir", sess.graph) #Обучаем train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss) for i in range(100): writer.add_summary(sess.run(train_step),i) print(sess.run(output_value)) writer.add_graph(graph) writer.close()
Теперь граф будет сгруппирован на области:
Каждую из областей можно раскрыть «плюсиком»
Обратные вызовы
Callback – набор функций, применяемых в определенные моменты во время процедуры обучения. Вы можете использовать функции callback чтобы получить информацию о внутреннем состоянии модели в процессе обучения. Нужно передавать список callback’ов (именованным аргументом callbacks) методу .fit() Sequential или Model классов. Подходящие методы callback будут вызваны на каждой стадии обучения.
Callback
Абстрактный базовый класс для разработки новых callback’ов
— params: словарь. Параметры обучения (к примеру, размер батча, эпоха)
— model: экземпляр keras.models.Model. Ссылка на обучаемую модель.
Словарь logs, который методы callback принимают в качестве аргумента, будет содержать параметры, релевантные для текущего батча или эпохи.
На данный момент, метод .fit() класса Sequential в словаре logs содержит следующие величины, которые передаются методам callback:
— on_epoch_end: logs по умолчанию влючает в себя acc и loss, опционально может включать val_loss(если проверочная выборка включена в fit) и val_acc(если проверочная выборка включена в fit и мониторинг точности был включен).
— on_batch_begin: logs включает в себя параметр size – число образцов в текущем батче.
— on_batch_end: logs будет содержать параметр loss, и, опционально, acc (если мониторинг точности был включен)
BaseLogger
keras.callbacks.callbacks.BaseLogger(stateful_metrics=None)
Callback, собирающий среднее значение метрик на эпохе. По умолчанию он применяется к каждой модели keras.
— stateful_metrics: Итерируемый объект строковых имен метрик, которые не усредняются. Метрики в этом списке будут записаны «как есть» в on_epoch_end. Все остальные метрики будут усреднены и записаны в on_epoch_end.
TerminateOnNaN
Callback, останавливающий обучение когда встречается NaN loss.
ProgbarLogger
keras.callbacks.callbacks.ProgbarLogger(count_mode=’samples’, stateful_metrics=None)
Callback выводящий метрики в stdout (стандартный интерфейс вывода).
— count_mode: “steps” или “samples”.
— stateful_metrics: Итерируемый объект строковых имен метрик, которые не усредняются. Метрики в этом списке будут записаны «как есть»
— ValueError: Если в cout_mode подано неверное значение
History
Callback, записывающий события в объект History. По умолчанию он применяется к каждой модели keras. Объект History возвращается методом модели fit.
ModelCheckpoint
keras.callbacks.callbacks.ModelCheckpoint(filepath, monitor=’val_loss’, verbose=0, save_best_only=False, save_weights_only=False, mode=’auto’, period=1)
Сохранение модели после каждой эпохи.
Filepath может содержать именованные опции форматирования, заполняемые значениями epoch и ключами в logs (передаваемыми on_epoch_end).
К примеру: если filepath назван weights.-.hdf5, тогда модель будет сохраняться с номером эпохи и validation_loss в имени файла.
— filepath: строка, путь сохранения модели
— monitor: параметр для мониторинга
— verbose: режим отображения, 0 или 1
— save_best_only: если save_best_only=True, если результат текущей эпохи хуже предыдущей, он не будет сохранен.
— save_weights_only: если True, тогда будут сохраняться только веса модели (model.save_weights(filepath)), в противном случае будет сохраняться вся модель (model.save(filepath)).
— mode: один из . Если save_best_only=True, решение о перезаписи текущего файла будет приниматься в зависимости от уменьшения/увеличения параметра мониторинга. Для val_acc, необходим max, для val_loss необходим min. В auto режиме, mode выбирается в зависимости от имени monitor.
— period: Интервал (число эпох) между сохранениями.
EarlyStopping
keras.callbacks.callbacks.EarlyStopping(monitor=’val_loss’, min_delta=0, patience=0, verbose=0, mode=’auto’, baseline=None, restore_best_weights=False)
Прекращение обучения, когда параметр monitor перестает улучшаться.
— monitor: параметр для мониторинга
— min_delta: минимальное значение изменения величины monitor, расцениваемое как улучшение, то есть, если абсолютное изменение меньше min_delta, то улучшение не засчитывается
— patience: число эпох, за которые величина monitor не улучшается, после которых обучение будет остановлено. Проверочные величины могут производиться не после каждой эпохи если validation_freq (model.fit(validation_freq=5)) больше единицы.
— verbose: режим отображения, 0 или 1.
— mode: один из . В режиме min, обучение остановится когда величина monitor перестанет уменьшаться; в режиме max, обучение остановится когда величина monitor перестанет увеличиваться; в режиме auto, mode выбирается в зависимости от имени monitor.
— baseline: значение, которое должна достичь величина monitor. Обучение прекратится, если модель не
— restore_best_weights: восстанавливать ли веса модели с эпохи с лучшем значением параметра monitor. Если False, веса модели будут загружены из последней шага обучения.
RemoteMonitor
keras.callbacks.callbacks.RemoteMonitor(root=’http://localhost:9000′, path=’/publish/epoch/end/’, field=’data’, headers=None, send_as_json=False)
Callback, передающий события на сервер.
Необходима библиотека requests. События по умолчанию отправляются в каталог root + ‘/publish/epoch/end/’. Вызовы – это HTTP POST, с аргументом data, который является JSON-закодированным словарем событий. Если send_as_json присвоен True, тип контента в запросе будет приложением/JSON. В противном случае сериализованный JSON будет отправлен внутри формы.
— root: Строка; корневой каталог целевого сервера
— path: Строка; относительный к root путь, в который будут посылаться события
— field: Строка; поле JSON в котором будут храниться данные. Field используется только если данные пересылаются через форму(то есть send_as_json установлен как False)
— headers: Словарь; дополнительные пользовательские заголовки HTTP.
— send_as_json: Boolean; посылать ли запрос как приложение/json.
LearningRateScheduler
Планировщик скорости обучения
— schedule: функция, принимающая индекс эпохи (integer, отсчет с нуля) и текущую скорость обучения, и возвращающая новую скорость обучения (float).
— verbose: int. 0: «тихий» режим, 1: выводить сообщения
ReduceLROnPlateau
keras.callbacks.callbacks.ReduceLROnPlateau(monitor=’val_loss’, factor=0.1, patience=10, verbose=0, mode=’auto’, min_delta=0.0001, cooldown=0, min_lr=0)
Уменьшение скорости обучения, когда метрика перестала улучшаться.
Модели зачастую работают лучше если уменьшать скорость обучения на коэффициент от 2 до 10 как только в обучении происходит стагнация. Этот callback следит за параметром monitor и, если не происходит улучшения за patience эпох, уменьшает скорость обучения.
reduce_lr = ReduceLROnPlateau(monitor=’val_loss’, factor=0.2,
model.fit(X_train, Y_train, callbacks=[reduce_lr])
— monitor: параметр для мониторинга
— factor: коэффициент уменьшения скорости обучения. new_lr = lr * factor
— patience: число эпох, за которые величина monitor не улучшается, после которых обучение будет остановлено. Проверочные величины могут производиться не после каждой эпохи если validation_freq (model.fit(validation_freq=5)) больше единицы.
— verbose: int. 0: «тихий» режим, 1: выводить сообщения
— mode: один из . В режиме min, скорость обучения уменьшится когда величина monitor перестанет уменьшаться; в режиме max, скорость обучения уменьшится когда величина monitor перестанет увеличиваться; в режиме auto, mode выбирается в зависимости от имени monitor.
— min_delta: минимальное значение изменения величины monitor, расцениваемое как улучшение, то есть, если абсолютное изменение меньше min_delta, то улучшение не засчитывается
— cooldown: число эпох после уменьшения скорости обучения, которые должны пройти, прежде чем стандартный процесс уменьшения возобновится.
— min_lr: нижняя граница скорости обучения
CSVLogger
keras.callbacks.callbacks.CSVLogger(filename, separator=’,’, append=False)
Callback, записывающий результаты эпох в csv файл.
Поддерживает любые значения, которые можно представить в виде строки, включая одномерные итерируемые объекты, такие как np.ndarray.
model.fit(X_train, Y_train, callbacks=[csv_logger])
— filename: имя csv файла (к примеру: ‘run/log.csv’)
— separator: строка, используемая для разделения элементов в файле.
— append: True: добавить к существующему файлу (если он существует). False: перезаписать существующий файл.
LambdaCallback
keras.callbacks.callbacks.LambdaCallback(on_epoch_begin=None, on_epoch_end=None, on_batch_begin=None, on_batch_end=None, on_train_begin=None, on_train_end=None) Callback для создания простых пользовательских callback’ов «на лету».
Этот callback собирается с помощью анонимных функций. Обратите внимание, что callback’и ожидают позиционных аргументов, таких как:
— on_epoch_begin и on_epoch_end ожидают два позиционных аргумента: epochs, logs.
— on_batch_begin и on_batch_end ожидают два позиционных аргумента: batch, logs.
— on_train_begin и on_train_end ожидают один позиционных аргумент: logs
— on_epoch_begin: вызывается в начале каждой эпохи
— on_epoch_end: вызывается в конце каждой эпохи
— on_batch_begin: вызывается в начале каждого батча
— on_batch_end: вызывается в конце каждого батча
— on_train_begin: вызывается в начале обучения модели
— on_train_end: вызывается в конце обучения модели
# Выводить номер батча в начале каждого батча
on_batch_begin=lambda batch,logs: print(batch))
# Записывать loss эпохи в файл в формате JSON.
# Состав файла — не хорошо структурированный JSON, а скорее файл,
# Имеющий объект JSON на каждой строке.
import json
json_log = open(‘loss_log.json’, mode=’wt’, buffering=1)
on_epoch_end=lambda epoch, logs: json_log.write(
on_train_end=lambda logs: json_log.close()
# Завершение некоторых процессов после окончания обучения модели
on_train_end=lambda logs: [
p.terminate() for p in processes if p.is_alive()])
TensorBoard
keras.callbacks.tensorboard_v1.TensorBoard(log_dir=’./logs’, histogram_freq=0, batch_size=32, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None, embeddings_data=None, update_freq=’epoch’)
Базовые визуализации TensorBoard.
TensorBoard – средство визуализации, предоставляемое с библиотекой Tensorflow.
Этот callback записывает лог для TensorBoard, который позволяет визуализировать динамические графы обучающих и проверочных метрик, а также гистограммы активации для различных слоев модели.
Если вы установили TensorFlow с помощью pip, вы можете запустить TensorBoard из командной строки:
Когда вы использовуете бэкенд, отличный от TensorFlow, TensorBoard все еще будет работать (если у вас установлен TensorFlow), но отображаться будут только графики ошибок и метрик.
— log_dir: путь сохранения логов, которые TensorBoard будет использовать
— histogram_freq: частота (в эпохах), с которой вычислять гистограммы активаций и весов для слоев модели. Если histogram_freq = 0, вычисления гистограмм не будут происходить. Проверочный набор (val_data/val_split) должен быть задан для визуализации гистограмм.
— batch_size: размер батча для вычисления гистограмм.
— write_graph: визуализировать ли граф в TensorBoard. Файл логов может стать очень большим когда write_graph = True.
— write_grads: визуализировать ли гистограммы градиентов в TensorBoard. histogram_freq должен быть больше 0.
— write_images: записывать ли веса модели для визуализации в качестве изображения в TensorBoard.
— embeddings_freq: частота (в эпохах), с которой выбранные Embedding слои будут сохранены. Если embeddings_freq = 0, embedding’и не будут вычисляться. Данные для визуализации во вкладке Embedding инструмента TensorBoard передаются через embeddings_data.
— embedding_layer_names: список имен слоев, которые нуждаются в мониторинге. Елси None или пустой список – все слои будут учитыватся.
— embedding_metadata: словарь, связывающий имя слоя с именем файла, в котором храняться метаданные для этого слоя. Детали о формате файлов метаданных. В случае, если для всех Embedding слоев используется один файл, можно передавать не словарь, а строку.
— embedding_data: данные, используемые в Embedding слоях, объявленных в embeddings_layer_names. Массив numpy (если у модели один вход) или список массивов (если несколько). Больше об Embedding.
— update_freq: ‘batch’, или, ‘epoch’ или integer. При использовании ‘batch’, записывать потери и метрики в TensorBoard после каждого батча. По такому же принципу с ‘epoch’. При использовании integer (числа), к примеру 10000, callback запишет метрики и потери в Tensorboard после каждыз 10000 примеров. Обратите внимание, что слишком частая запись может замедлить процесс обучения.
Создание callback’ов
Вы можете создать callback, наследуя от базового класса keras.callbacks.Callback. Callback имеет доступ к связанной с ним модели через свойство класса self.model.
Простой пример сохранения списка потерь на каждом батче во время обучения:
class LossHistory(keras.callbacks.Callback):
def on_train_begin(self, logs=<>):
def on_batch_end(self, batch, logs=<>):
Пример: запись истории потерь
class LossHistory(keras.callbacks.Callback):
def on_train_begin(self, logs=<>):
def on_batch_end(self, batch, logs=<>):
model.add(Dense(10, input_dim=784, kernel_initializer=’uniform’))
model.fit(x_train, y_train, batch_size=128, epochs=20, verbose=0, callbacks=[history])
[0.66047596406559383, 0.3547245744908703, …, 0.25953155204159617, 0.25901699725311789]
Пример: сохранение модели после каждой эпохи
from keras.callbacks import ModelCheckpoint
model.add(Dense(10, input_dim=784, kernel_initializer=’uniform’))
Сохранение модели после каждой эпохи, если ошибка на проверочном наборе уменьшилась
checkpointer = ModelCheckpoint(filepath=’/tmp/weights.hdf5′, verbose=1, save_best_only=True)
model.fit(x_train, y_train, batch_size=128, epochs=20, verbose=0, validation_data=(X_test, Y_test), callbacks=[checkpointer])
Что такое tensorboard
1 min read
Jul 20, 2017
https://i2.wp.com/storage.dev-ops-notes.ru/TensorFlow-TensorBoard-visualizations.png?fit=1024%2C512 В этой статье мы рассмотрим, как создавать и визуализировать граф при помощи TensorBoard. Мы сознательно пропустили этот инструмент до того, как вы успели познакомиться базовыми операциями в TensorFlow, т.к. работа с переменными, массивами или использование placeholder-ов. Итак, что такое http://default.dev-ops-notes-ru.appspot.com/2017/07/20/tensorflow-%d0%b2%d0%b8%d0%b7%d1%83%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%b2-tensorboard/
Machine Learning
Tensorboard
TensorFlow
Written by Andrei Maksimov
Cloud Infrastructure Architect @ Amazon Web Services https://hands-on.cloud
More from Andrei Maksimov
How to test your AWS CLI credentials
1 min read · Jan 10, 2018
AWS Step Functions. How to process arrays
3 min read · Feb 7, 2018
Сравнение ECS, Nomad, Docker Swarm, Kubernetes, DC/OS и Rancher
10 min read · Apr 17, 2017
Quick And Simple Introduction to Kubernetes Helm Charts in 10 minutes
This article will walk you through the Helm installation process and basic usage scenarios. We’ll briefly walk you through the process of…
9 min read · Jan 10, 2021
stable_baselines 3 doesn’t store the tensorboard_log
I am just getting into reinforcement learning. My Model doesn’t create any files in the given directory. What am i doing wrong?
def train(): model = PPO('MlpPolicy', env, verbose=1, tensorboard_log=log_path) model.learn(total_timesteps=3000) with open(os.path.join(log_path,"Text.txt")) as file: #Test if given directory works print(file.read()) model.save(PPO_Path)
The trained model does work perfectly fine.
asked Jul 3, 2021 at 15:41
141 1 1 silver badge 8 8 bronze badges
1 Answer 1
model.learn() function should have additional parameter tb_log_name
model.learn(total_timesteps=3000, tb_log_name="experiment_1")
answered Jul 21, 2021 at 11:58
405 4 4 silver badges 17 17 bronze badges
- python
- stable-baselines
-
The Overflow Blog
Related
Hot Network Questions
Subscribe to RSS
Question feed
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.10.27.43697
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.