TensorFlow2:TensorBoardのグラフがうまく表示されず困った件(余談)

前回の記事のおまけ。

余談と言いつつ、重要そうなことも入っている気がする。

余談:モデルがmain graphに表示されない件

TensorBoardでは、グラフが複雑になるのを避けるため、入出力が多いノード(原文では"high-degree nodes")は、Auxiliary Nodes側に配置される。

"入出力が多いノードは、だいたい保存とかそんな感じのノードなので、外しても問題ないっしょ。メイングラフには〇も置いとくし"(超意訳)らしい。モデルなんだがなぁ…。

Reference: TensorBoard: Graph Visualization

グラフを見ていると、レイヤ内の各weightの定義が、ただのVariableではなく、ReadVariableOpになっていることが原因のようだ。 しかしweightの定義はkeras内でやっているので、手が出せない。

調べてみると、issueが上がっていたが解決していない(放置されている?)。

[TF 2.0] Inconvenient graph visualization #29215

この件は、今のところ手動でmain graphに移動させることで回避。

余談:test側のグラフ出力がエラーになる

前回の変更2では@tf.functionを付与する関数をtrainのみにして対処したが、testのみにした場合はうまく動かない。 この場合、最初と同じでGraph visualization failed. Error: Malformed GraphDef.が表示されてしまう。

TensorBoardのコンソールには以下のエラーが表示される。

ValueError: Cannot combine GraphDefs because nodes share a name but contents are different: images

よく見てみると、今度は入力であるimagesがエラーの原因となっている。

いやいやテスト中はループでぐるぐる回してるだけで、処理は変わってないし! とりあえず本筋でないから放置するか。。。

と思ってぼーっとコード見ていたら、なんとなくバッチが気になってきた。

結果、データ読み込みの部分をこんな感じにすると、うまく動いた。

def load_dataset(batch_size=32):
    (x_train, y_train), (x_test, y_test) = tfk.datasets.mnist.load_data()
    # normalize 0.0 ~ 1.0
    x_train, x_test = x_train / 255.0, x_test / 255.0
    # add newaxis for channel.
    x_train = x_train[..., tf.newaxis]
    x_test = x_test[..., tf.newaxis]
    # build pipeline: shuffle -> batch.
    """ build new graph if remainder is exist, so avoiding this, add `drop_remainder=True` to `batch`.
    ds_train = tf.data.Dataset.from_tensor_slices(
        (x_train, y_train)).shuffle(10000).batch(batch_size)
    ds_test = tf.data.Dataset.from_tensor_slices(
        (x_test, y_test)).batch(batch_size)
    """
    ds_train = tf.data.Dataset.from_tensor_slices(
        (x_train, y_train)).shuffle(10000).batch(batch_size, drop_remainder=True)
    ds_test = tf.data.Dataset.from_tensor_slices(
        (x_test, y_test)).batch(batch_size, drop_remainder=True)
    # return dataset.
    return ds_train, ds_test

batch(batch_size, drop_remainder=True)の、drop_remainderがポイント。

train用のデータは60000 % 32 == 0で、test用のデータは10000 % 32 == 16で、後者は端数が出る。 ということで、入力画像のバッチサイズ部分に変化があると、別グラフとして扱われるようだ…。

なんかハマりそうなので、デフォルトでTrueにしておくのが安全かなー。

コメント

このブログの人気の投稿

TensorFlow2:TensorBoardのグラフがうまく表示されず困った件

TensorFlow2:MNISTやってみる(keras model class)