TensorFlow2を触ってみる posted at 3月 21, 2020 しょっぱなから補完が効かないとかハマったわけですが、TensorFlowを触り始めました。 過去に使っていたことがあるのですが、1.0より前のころだったので、kerasとかeagerとか戸惑いまくりです。 そんなわけで、しばらくは昔の記憶でTensorFlowを触って試行錯誤したり、VSCodeの設定をいじったり、といったメモ書きが続くと思います。 コメント
TensorFlow2:TensorBoardのグラフがうまく表示されず困った件 posted at 4月 08, 2020 前回は、kerasのsummaryなどでグラフの可視化をしましたが、今回はTensorboardのグラフを使ってみます。 使用するモデルは、 TensorFlow2:MNISTやってみる(keras model class) で作成したものです。 1.xのときと違って、Summaryを保存するだけではグラフは出力されないようです。 ということで、変更を加えて出力してみたけど、うまく動かなかったり、いまいちきれいに出なかったという話。 Reference: Examining the TensorFlow Graph グラフ出力のための変更 紆余曲折が長いので、まずは最終的な形を記載します。 今回はsubclassedなモデルで、 model.fit() は使用していないので、 Graphs of tf.functions セクションで記載のある方法を試す。 計算開始時に tf.summary.trace_on(graph=True) を呼び、終了時に tf.summary.trace_export() を呼ぶ。 注意点としては、 trace_export() は、 writer.as_default() のブロック内で呼び出す必要がある。 必然的に、SummaryWriterのインスタンスが必要になる(Writerが書き出すファイル内にグラフが入るので、当たり前かもしれないが一応)。 以下の「# !!! ADD」コメント部分が追加した箇所。 def training(model, optimizer, epochs, ds_train, ds_test, logdir=None): # ...skip writer = tf.summary.create_noop_writer() if logdir: logdir.mkdir(parents=True, exist_ok=True) writer = tf.summary.create_file_writer(str(logdir)) global_step = 1 tf.summary.trace_on(graph=True) # !!! ADD for epoch in range(1, epochs... 続きを読む
TensorFlow2:TensorBoardのグラフがうまく表示されず困った件(余談) posted at 4月 09, 2020 前回の記事 のおまけ。 余談と言いつつ、重要そうなことも入っている気がする。 余談:モデルが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 がエラーの原因となっている。 いやいやテスト中はループでぐるぐる回してるだけで、処理は変わってないし! とりあえず本筋でないから放置するか。。。 と思ってぼーっとコード見ていたら、なんとなくバッチが気になってきた。 結果、データ読み込みの部分を... 続きを読む
TensorFlow2:ログディレクトリ指定時のみSummaryを保存する posted at 4月 01, 2020 ちょっと動かすときはログを保存せず、学習時はログを保存する、みたいな切替をやりたくなる。 けど、summary記録箇所全部にif文入れるのはなぁというときの対処。 なにもしないnoop_writerが使える。 サンプルコード def run ( epochs , logdir = None ) : writer = tf . summary . create_noop_writer ( ) if logdir : writer = tf . summary . create_file_writer ( logdir ) for epoch in range ( epochs ) : loss = step_train ( ) with writer . as_default ( ) : # do nothing if writer is noop_writer. tf . summary . scalar ( "train_loss" , loss , epoch ) writer . close ( ) ちょっと記述が減って素敵。 続きを読む
コメント
コメントを投稿