Tensorflow2.0のTensorBoard:トレーニングプロセスの可視化


文書ディレクトリ
  • TensorBoardプロセス
  • を使用
  • 具体的な流れ
  • Step 1
  • Step 2
  • Step 3
  • Step 4
  • GraphおよびProfile情報を表示する
  • 1、定義モデル及び訓練過程
  • 2、TensorBoardを格納フォルダを作成する記録ファイル
  • 3、実例化レコーダ(Traceオン)
  • 4、指定するレコーダにパラメータを記録する
  • .
    TensorBoardプロセスの使用
  • 1、フォルダを作成してTensorBoardの記録ファイルを保存する.
  • 2、実例化レコーダ;
  • 3、パラメータ(一般にスカラー)を指定のレコーダに記録する;
  • 4、TensorBoardのビジュアルインターフェースにアクセス.

  • 具体的なプロセス
    Step 1
    コードディレクトリの下に./tensorboardなどのフォルダを作成します.
    Step 2
    インスタンスレコーダ:
    summary_writer = tf.summary.create_file_writer('./tensorboard')     #              
    

    Step 3
    パラメータ(一般的にスカラー)を指定したレコーダに記録します.
    summary_writer = tf.summary.create_file_writer('./tensorboard')
    #       
    for batch_index in range(num_batches):
        # ...(    ,  batch        loss )
        with summary_writer.as_default():                               #         
            tf.summary.scalar("loss", loss, step=batch_index)  #              
    

    tfを実行するたびに.summary.scalar()では、レコーダが記録ファイルに記録を書き込みます.
    Step 4
    トレーニングプロセスを可視化する場合は、コードディレクトリで端末を開き、次のように実行します.
    tensorboard --logdir=E:\Pycharm\code\Jupyter\tensorflow2.0\My_net\Tensorboard\tensorboard --host=127.0.0.1
    

    そのうち‘E:PycharmcodeJupytertensorflow 2.0\My_NetTensorboardtensorboard'はTensorBoardレコードファイルを格納するフォルダパスです.
    次に、ブラウザを使用してコマンドラインプログラムから出力されたWebサイトにアクセスします(一般的にはhttp://127.0.0.1:6006/)を使用してTensorBoardのビジュアルインタフェースにアクセスできます.
    GraphとProfile情報の表示
    tf.summary.trace_on(graph=True, profiler=True)  #   Trace,        profile  
    #     
    with summary_writer.as_default():
        tf.summary.trace_export(name="model_trace", step=0, profiler_outdir=log_dir)    #   Trace     
    

    その後、TensorBoardで「Profile」を選択し、各操作の所要時間を時間軸で確認できます.tfを使用すると.functionは計算図を作成し、「Graphs」をクリックして図構造を表示することもできます.
    ≪インスタンス|Instance|emdw≫
    ここではMNISTのトレーニング手順を例に挙げます.
    1、モデルと訓練過程を定義する
    import tensorflow as tf
    import tensorflow.keras as keras
    import tensorflow.keras.layers as layers
    
    mnist = keras.datasets.mnist
    
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    x_train, x_test = x_train / 255.0, x_test / 255.0
    
    # Add a channels dimension
    x_train = x_train[..., tf.newaxis].astype(np.float32)
    x_test = x_test[..., tf.newaxis].astype(np.float32)
    
    train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000).batch(32)
    test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(x_test.shape[0])
    
    class MyModel(keras.Model):
        # Set layers.
        def __init__(self):
            super(MyModel, self).__init__()
            # Convolution Layer with 32 filters and a kernel size of 5.
            self.conv1 = layers.Conv2D(32, kernel_size=5, activation=tf.nn.relu)
            # Max Pooling (down-sampling) with kernel size of 2 and strides of 2.
            self.maxpool1 = layers.MaxPool2D(2, strides=2)
    
            # Convolution Layer with 64 filters and a kernel size of 3.
            self.conv2 = layers.Conv2D(64, kernel_size=3, activation=tf.nn.relu)
            # Max Pooling (down-sampling) with kernel size of 2 and strides of 2.
            self.maxpool2 = layers.MaxPool2D(2, strides=2)
    
            # Flatten the data to a 1-D vector for the fully connected layer.
            self.flatten = layers.Flatten()
    
            # Fully connected layer.
            self.fc1 = layers.Dense(1024)
            # Apply Dropout (if is_training is False, dropout is not applied).
            self.dropout = layers.Dropout(rate=0.5)
    
            # Output layer, class prediction.
            self.out = layers.Dense(10)
    
        # Set forward pass.
        def call(self, x, is_training=False):
            x = tf.reshape(x, [-1, 28, 28, 1])
            x = self.conv1(x)
            x = self.maxpool1(x)
            x = self.conv2(x)
            x = self.maxpool2(x)
            x = self.flatten(x)
            x = self.fc1(x)
            x = self.dropout(x, training=is_training)
            x = self.out(x)
            if not is_training:
                # tf cross entropy expect logits without softmax, so only
                # apply softmax when not training.
                x = tf.nn.softmax(x)
            return x
    
    model = MyModel()
    
    loss_object = keras.losses.SparseCategoricalCrossentropy()
    optimizer = keras.optimizers.Adam()
    
    @tf.function
    def train_step(images, labels):
        with tf.GradientTape() as tape:
            predictions = model(images)
            loss = loss_object(labels, predictions)
            loss = tf.reduce_mean(loss)
        gradients = tape.gradient(loss, model.trainable_variables)
        optimizer.apply_gradients(zip(gradients, model.trainable_variables))
        return loss
    

    2、フォルダを作成してTensorBoardの記録ファイルを保存する
    log_dir = 'tensorboard'
    

    3、実例化記録器(トレースオン)
    summary_writer = tf.summary.create_file_writer(log_dir)     #       
    tf.summary.trace_on(profiler=True)  #   Trace(  )
    

    4、指定したレコーダにパラメータを記録する
    EPOCHS = 5
    
    for epoch in range(EPOCHS):
        for images, labels in train_ds.take(10):
            loss = train_step(images, labels)
            with summary_writer.as_default():                           #      
                tf.summary.scalar("loss", loss, step=epoch)       #               
    
    with summary_writer.as_default():
        tf.summary.trace_export(name="model_trace", step=0, profiler_outdir=log_dir)    #   Trace     (  )