{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "SB93Ge748VQs" }, "source": [ "##### Copyright 2019 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "cellView": "form", "id": "0sK8X2O9bTlz" }, "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "markdown", "metadata": { "id": "HEYuO5NFwDK9" }, "source": [ "# tf.summary の使用箇所を TF 2.0 に移行する\n", "\n", "
![]() | \n",
" ![]() | \n",
" ![]() | \n",
" ![]() | \n",
"
tf.compat.v1.summary
は以下の条件で TF 2.x 相当に自動的に転送されます。\n",
"\n",
"- 最も外側のコンテキストが Eager モードである\n",
"- デフォルトの TF 2.x サマリーライターが設定されている\n",
"- 空でないステップの値がライターに設定済みである(tf.summary.SummaryWriter.as_default
、tf.summary.experimental.set_step
、または tf.compat.v1.train.create_global_step
を使用)\n",
"\n",
"TF 2.x サマリー実装が呼び出されると、戻り値は空のバイト文字列テンソルになり、サマリーの書き込みが重複しないようにされることに注意してください。また、入力引数のフォワーディングはベストエフォートであり、すべての引数が保持されるとは限りません(たとえば、`family` 引数はサポートされていますが、`collections` は取り除かれます)。\n",
"\n",
"以下は、tf.compat.v1.summary.scalar
で tf.summary.scalar
の動作を呼び出す例です。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "6457297c0b9d"
},
"outputs": [],
"source": [
"# Enable eager execution.\n",
"tf.compat.v1.enable_v2_behavior()\n",
"\n",
"# A default TF 2.x summary writer is available.\n",
"writer = tf.summary.create_file_writer(\"/tmp/mylogs/enable_v2_in_v1\")\n",
"# A step is set for the writer.\n",
"with writer.as_default(step=0):\n",
" # Below invokes `tf.summary.scalar`, and the return value is an empty bytestring.\n",
" tf.compat.v1.summary.scalar('float', tf.constant(1.0), family=\"family\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Pq4Fy1bSUdrZ"
},
"source": [
"### 完全移行\n",
"\n",
"TF 2.x に全移行するには、コードを次のように適合させる必要があります。\n",
"\n",
"1. サマリー演算を使用するには、`.as_default()` によるデフォルトのライターセットが存在する必要がある\n",
"\n",
" - つまり、演算を Eager で実行するか、グラフ構造で演算を使用する\n",
" - デフォルトのライターがない場合、サマリー演算はサイレントの no-op になる\n",
" - デフォルトのライターは(まだ)`@tf.function` 実行境界に伝搬しません。関数がトレースされた場合にのみ検出されるため、関数の本文で `writer.as_default()` を呼び出し、`@tf.function` が使用される限りライターオブジェクトが存在し続けられるようにすることが、ベストプラクティスと言えます。\n",
"\n",
"2. 「step」値は `step` 引数で各演算に渡される必要がある\n",
"\n",
" - TensorBoard には、時系列としてデータをレンダリングするステップ値が必要です\n",
" - TF 1.x のグローバルステップは削除されており、各演算は読み取るための希望する step 変数を知っておくために、明示的に渡す必要があります\n",
" - ボイラープレートを減らすために、デフォルトステップを登録するための実験的サポートは`tf.summary.experimental.set_step()` として提供されていますが、これは暫定機能であり、予告なく変更される場合があります\n",
"\n",
"3. 個々のサマリー演算の関数シグネチャが変更されている\n",
"\n",
" - 戻り値はブール型になっています(要約が実際に書き込まれたかどうかを示す)\n",
" - 2 番目のパラメータ名(使用される場合)が`tensor` から `data` に代わっています\n",
" - `collections` パラメータが削除されています。collections は TF 1.x のみのパラメータです\n",
" - `family` パラメータが削除されています。`tf.name_scope()` を使用してください\n",
"\n",
"4. [レガシーグラフモードのみ / セッション実行ユーザー]\n",
"\n",
" - 最初に `v1.Session.run(writer.init())` でライターを初期化します\n",
"\n",
" - `v1.summary.all_v2_summary_ops()` を使用して、現在のグラフに関するすべての TF 2.0 サマリー演算を取得します(`Session.run()` で実行するためなど)。\n",
"\n",
" - `v1.Session.run(writer.flush())` でライターをフラッシュし、`close()` でも同様にフラッシュします\n",
"\n",
"TF 1.x コードで `tf.contrib.summary` API を使用していた場合は、TF 2.0 API にはるかに似ているため、`tf_upgrade_v2` スクリプトを使って、ほとんどの移行ステップ(および完全に移行できない使用箇所の発行警告またはエラー)を自動化できます。ほとんどにおいて、API 呼び出しを `tf.compat.v2.summary` に書き直すだけであるため、TF 2.0+ との互換性のみが必要である場合は、`compat.v2` を削除して、`tf.summary` として参照するようにすることができます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1GUZRWSkW3ZC"
},
"source": [
"## その他のヒント\n",
"\n",
"上記の重要な分野に加え、一部の補助的な側面も変更されています。\n",
"\n",
"- 条件付き記録(「100 ステップごとにログ」など)が新しくなりました\n",
"\n",
" - 演算と関連するコードを制御するには、通常の if ステートメント(Eager モードと[自動グラフ作成経由の `@tf.function`](https://www.tensorflow.org/alpha/guide/autograph) で機能)か、`tf.cond` でラップします\n",
" - 要約のみを制御するには、新しい `tf.summary.record_if()` コンテキストマネージャを使用して、選択したブール条件を渡します\n",
" - TF 1.x パターンを置き換えます\n",
" ```\n",
" if condition:\n",
" writer.add_summary()\n",
" ```\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9VMYrKn4Uh52"
},
"source": [
"- `tf.compat.v1.Graph` を直接書き込めない代わりにトレース関数を使用します\n",
"\n",
" - TF 2.x のグラフ実行では、明示的な Graph の代わりに `@tf.function` が使用されます\n",
" - TF 2.0 では、新しいトレース式 API である`tf.summary.trace_on()` と `tf.summary.trace_export()` を使用して、実行した関数グラフを記録します\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "UGItA6U0UkDx"
},
"source": [
"- `tf.summary.FileWriterCache` の使用により、logdir ごとのグローバルライターのキャッシュが不要になります\n",
"\n",
" - ユーザーは、ライターオブジェクトの独自のキャッシュ/共有を実装するか、個別のライターを使用する必要があります(TensorBoard の後者のサポートは[開発中](https://github.com/tensorflow/tensorboard/issues/1063)です)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "d7BQJVcsUnMp"
},
"source": [
"- イベントファイルのバイナリ表現が変更されました\n",
"\n",
" - TensorBoard 1.x は、新しい形式をサポート済みです。この違いは、要約データをイベントファイルから手動で解析しているユーザーのみに影響します)\n",
" - 要約データはテンソルバイトとして保存されるようになりました。`tf.make_ndarray(event.summary.value[0].tensor)` を使って numpy に変換できます。"
]
}
],
"metadata": {
"colab": {
"collapsed_sections": [],
"name": "migrate.ipynb",
"toc_visible": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}