web-dev-qa-db-fra.com

Keras: utilisez Tensorboard avec train_on_batch ()

Pour les fonctions keras fit() et fit_generator(), il est possible de visualiser le tensorboard en passant un objet keras.callbacks.TensorBoard Aux fonctions. Pour la fonction train_on_batch() il n'y a évidemment aucun rappel disponible. Y a-t-il d'autres options dans les keras pour créer un Tensorboard dans ce cas?

17
Oliver Wilken

Je pense qu'actuellement la seule option est d'utiliser du code tensorflow. Dans cette réponse stackoverflow j'ai trouvé un moyen de créer un journal de tensorboard manuellement. Ainsi, un exemple de code avec les keras train_on_batch() pourrait ressembler à ceci:

# before training init writer (for tensorboard log) / model
writer = tf.summary.FileWriter(...)
model = ...

# train model
loss = model.train_on_batch(...)
summary = tf.Summary(value=[tf.Summary.Value(tag="loss", 
                                             simple_value=value), ])
writer.add_summary(summary)

Remarque: Pour cet exemple dans Tensorboard, vous devez choisir l'axe horizontal "RELATIVE" car aucune étape n'est passée à l'été.

3
Oliver Wilken

Une façon possible de créer le rappel TensorBoard et de le piloter manuellement:

# This example shows how to use keras TensorBoard callback
# with model.train_on_batch

import tensorflow.keras as keras

# Setup the model
model = keras.models.Sequential()
model.add(...) # Add your layers
model.compile(...) # Compile as usual

batch_size=256

# Create the TensorBoard callback,
# which we will drive manually
tensorboard = keras.callbacks.TensorBoard(
  log_dir='/tmp/my_tf_logs',
  histogram_freq=0,
  batch_size=batch_size,
  write_graph=True,
  write_grads=True
)
tensorboard.set_model(model)

# Transform train_on_batch return value
# to dict expected by on_batch_end callback
def named_logs(model, logs):
  result = {}
  for l in Zip(model.metrics_names, logs):
    result[l[0]] = l[1]
  return result

# Run training batches, notify tensorboard at the end of each Epoch
for batch_id in range(1000):
  x_train,y_train = create_training_data(batch_size)
  logs = model.train_on_batch(x_train, y_train)
  tensorboard.on_Epoch_end(batch_id, named_logs(model, logs))

tensorboard.on_train_end(None)
6
erenon