Простой способ визуализировать график TensorFlow в Jupyter?

Официальный способ визуализировать график TensorFlow с TensorBoard, но иногда я просто хочу беглый взгляд на график, когда я работаю в Jupyter.

Существует ли быстрое решение, идеально на основе инструментов TensorFlow или стандартных пакетов SciPy (как matplotlib), но при необходимости на основе сторонних библиотек?

59
задан 4 July 2016 в 19:33

3 ответа

TensorFlow 2.0 теперь поддержки TensorBoard в Jupyter через волшебные команды (например, %tensorboard --logdir logs/train). Вот ссылка к учебным руководствам и примерам.

[РЕДАКТИРУЕТ 1, 2]

Как @MiniQuark упомянутый в комментарии, мы должны загрузить расширение сначала (%load_ext tensorboard.notebook).

Ниже примеры использования для использования режим графика , @tf.function и tf.keras (в [1 110]):

1. Пример с помощью [1 119] режим графика в TF2 (через [1 111])

%load_ext tensorboard.notebook
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
from tensorflow.python.ops.array_ops import placeholder
from tensorflow.python.training.gradient_descent import GradientDescentOptimizer
from tensorflow.python.summary.writer.writer import FileWriter

with tf.name_scope('inputs'):
   x = placeholder(tf.float32, shape=[None, 2], name='x')
   y = placeholder(tf.int32, shape=[None], name='y')

with tf.name_scope('logits'):
   layer = tf.keras.layers.Dense(units=2)
   logits = layer(x)

with tf.name_scope('loss'):
   xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)
   loss_op = tf.reduce_mean(xentropy)

with tf.name_scope('optimizer'):
   optimizer = GradientDescentOptimizer(0.01)
   train_op = optimizer.minimize(loss_op)

FileWriter('logs/train', graph=train_op.graph).close()
%tensorboard --logdir logs/train

2. Тот же пример как выше, но теперь использование @tf.function декоратор для передавать-обратных-проходов и не отключая нетерпеливое выполнение:

%load_ext tensorboard.notebook
import tensorflow as tf
import numpy as np

logdir = 'logs/'
writer = tf.summary.create_file_writer(logdir)
tf.summary.trace_on(graph=True, profiler=True)

@tf.function
def forward_and_backward(x, y, w, b, lr=tf.constant(0.01)):

    with tf.name_scope('logits'):
        logits = tf.matmul(x, w) + b

    with tf.name_scope('loss'):
        loss_fn = tf.nn.sparse_softmax_cross_entropy_with_logits(
            labels=y, logits=logits)
        reduced = tf.reduce_sum(loss_fn)

    with tf.name_scope('optimizer'):
        grads = tf.gradients(reduced, [w, b])
        _ = [x.assign(x - g*lr) for g, x in zip(grads, [w, b])]
    return reduced

# inputs
x = tf.convert_to_tensor(np.ones([1, 2]), dtype=tf.float32)
y = tf.convert_to_tensor(np.array([1]))
# params
w = tf.Variable(tf.random.normal([2, 2]), dtype=tf.float32)
b = tf.Variable(tf.zeros([1, 2]), dtype=tf.float32)

loss_val = forward_and_backward(x, y, w, b)

with writer.as_default():
    tf.summary.trace_export(
        name='NN',
        step=0,
        profiler_outdir=logdir)

%tensorboard --logdir logs/

3. Используя [1 113] API:

%load_ext tensorboard.notebook
import tensorflow as tf
import numpy as np
x_train = [np.ones((1, 2))]
y_train = [np.ones(1)]

model = tf.keras.models.Sequential([tf.keras.layers.Dense(2, input_shape=(2, ))])

model.compile(
    optimizer='sgd',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy'])

logdir = "logs/"

tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=logdir)

model.fit(x_train,
          y_train,
          batch_size=1,
          epochs=1,
          callbacks=[tensorboard_callback])

%tensorboard --logdir logs/

Эти примеры произведут что-то вроде этого ниже ячейки:

enter image description here

12
ответ дан 1 November 2019 в 11:56

TensorBoard визуализируют узлы - график архитектуры

<img src="https://www.tensorflow.org/images/graph_vis_animation.gif" width=1300 height=680>
0
ответ дан 1 November 2019 в 11:56

Код

def tb(logdir="logs", port=6006, open_tab=True, sleep=2):
    import subprocess
    proc = subprocess.Popen(
        "tensorboard --logdir={0} --port={1}".format(logdir, port), shell=True)
    if open_tab:
        import time
        time.sleep(sleep)
        import webbrowser
        webbrowser.open("http://127.0.0.1:{}/".format(port))
    return proc

Использование

tb()               # Starts a TensorBoard server on the logs directory, on port 6006
                   # and opens a new tab in your browser to use it.

tb("logs2", 6007)  # Starts a second server on the logs2 directory, on port 6007,
                   # and opens a new tab to use it.

Запуск сервера не блокирует Jupyter (за исключением 2 секунд, чтобы гарантировать, что сервер имеет время для запуска прежде, чем открыть вкладку). Все серверы TensorBoard остановятся при прерывании ядра.

Усовершенствованное использование

, Если Вы хотите больше управления, можно уничтожить серверы программно как это:

server1 = tb()
server2 = tb("logs2", 6007)
# and later...
server1.kill()  # stops the first server
server2.kill()  # stops the second server

можно установить open_tab=False, если Вы не хотите, чтобы новые вкладки открылись. Можно также установить sleep на некоторое другое значение, если 2 секунды слишком много или недостаточно в системе.

, Если Вы предпочитаете приостанавливать Jupyter, в то время как TensorBoard работает, затем можно назвать любой сервер wait() метод. Это заблокирует Jupyter, пока Вы не прервете ядро, которое остановит этот сервер и все другие.

server1.wait()

Предпосылки

Это решение предполагает установку TensorBoard (например, с помощью pip install tensorboard) и что это доступно в среде, в которой Вы запустили Jupyter.

Подтверждение

Этот ответ был вдохновлен ответом @SalvadorDali. Его решение хорошо и просто, но я хотел смочь запустить несколько tensorboard экземпляров, не блокируя Jupyter. Кроме того, я предпочитаю не удалять каталоги журнала. Вместо этого я запускаю tensorboard на корневом каталоге журнала, и каждый выполненный TensorFlow входит в систему различный подкаталог.

3
ответ дан 1 November 2019 в 11:56