このページは Cloud Translation API によって翻訳されました。
Switch to English

TensorFlow1コードをTensorFlow2に移行します

TensorFlow.orgで表示 GoogleColabで実行 GitHubでソースを表示ノートブックをダウンロード

低レベルのTensorFlowAPIのユーザー向けのこのドキュメント。高レベルのAPI( tf.keras )を使用している場合、コードをTensorFlow 2.0と完全に互換性のあるものにするために、実行する必要のあるアクションはほとんどまたはまったくない場合があります。

TensorFlow 2.0で、変更せずに( contribを除く)1.Xコードを実行することは引き続き可能です。

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

ただし、これではTensorFlow2.0で行われた多くの改善点を利用できません。このガイドは、コードをアップグレードして、コードをよりシンプルでパフォーマンスが高く、保守しやすくするのに役立ちます。

自動変換スクリプト

このドキュメントで説明されている変更を実装する前の最初のステップは、アップグレードスクリプトを実行することです。

これにより、コードをTensorFlow2.0にアップグレードする際の最初のパスが実行されます。ただし、コードを2.0に慣用的にすることはできません。コードは引き続きtf.compat.v1エンドポイントを使用して、プレースホルダー、セッション、コレクション、およびその他の1.xスタイルの機能にアクセスできます。

トップレベルの行動の変化

tf.compat.v1.disable_v2_behavior()を使用してコードがTensorFlow 2.0で機能する場合でも、対処する必要のあるグローバルな動作の変更があります。主な変更点は次のとおりです。

  • 熱心な実行、 v1.enable_eager_execution() :暗黙的にtf.Graphを使用するコードはすべて失敗します。このコードは、必ずwith tf.Graph().as_default()コンテキストでラップしてください。

  • リソース変数、 v1.enable_resource_variables() :一部のコードは、TF参照変数によって有効化される非決定論的動作に依存する場合があります。リソース変数は書き込み中にロックされるため、より直感的な一貫性が保証されます。

    • これにより、エッジケースの動作が変わる可能性があります。
    • これにより、余分なコピーが作成され、メモリ使用量が増える可能性があります。
    • これは、 use_resource=Falsetf.Variableコンストラクターに渡すことで無効にできます。
  • テンソル形状、 v1.enable_v2_tensorshape() :TF 2.0は、テンソル形状の動作を簡素化します。代わりにt.shape[0].valueあなたが言うことができt.shape[0]これらの変更は小さいはずであり、すぐに修正するのが理にかなっています。例については、 TensorShapeを参照してください。

  • 制御フローv1.enable_control_flow_v2() :TF 2.0制御フローの実装が簡素化されたため、さまざまなグラフ表現が生成されます。問題がある場合はバグ報告してください。

コードを2.0ネイティブにする

このガイドでは、TensorFlow1.xコードをTensorFlow2.0に変換するいくつかの例について説明します。これらの変更により、コードでパフォーマンスの最適化と簡素化されたAPI呼び出しを利用できるようになります。

いずれの場合も、パターンは次のとおりです。

v1.Session.run呼び出しを置き換えます

すべてのv1.Session.run呼び出しは、Python関数に置き換える必要があります。

  • feed_dictv1.placeholderは関数の引数になります。
  • fetchesは関数の戻り値になります。
  • 変換中の熱心な実行により、 pdbなどの標準のPythonツールを使用して簡単にデバッグできます。

その後、 tf.functionデコレータを追加して、グラフで効率的に実行できるようにします。これがどのように機能するかについての詳細は、サインガイドを参照してください。

ご了承ください:

  • v1.Session.runとは異なり、 tf.functionには固定の戻りシグネチャがあり、常にすべての出力を返します。これによりパフォーマンスの問題が発生する場合は、2つの別々の関数を作成してください。

  • tf.control_dependenciesまたは同様の操作は必要ありませんtf.functionは、記述された順序で実行されたかのように動作します。たとえば、 tf.Variable割り当てとtf.assertは自動的に実行されます。

モデル変換セクションには、この変換プロセスの実際の例が含まれています。

2.Pythonオブジェクトを使用して変数と損失を追跡します

TF 2.0では、すべての名前ベースの変数追跡は強く推奨されていません。 Pythonオブジェクトを使用して変数を追跡します。

tf.Variable代わりにv1.get_variable使用します。

すべてのv1.variable_scopeはPythonオブジェクトに変換する必要があります。通常、これは次のいずれかになります。

あなたは(のような変数の集計リストに必要がある場合はtf.Graph.get_collection(tf.GraphKeys.VARIABLES)使用.variables.trainable_variablesの属性Layerし、 Modelオブジェクト。

これらのLayerクラスとModelクラスは、グローバルコレクションの必要性を排除する他のいくつかのプロパティを実装します。それらの.lossesプロパティは、 tf.GraphKeys.LOSSESコレクションを使用する代わりに使用できます。

詳細については、 kerasガイドを参照してください。

3.トレーニングループをアップグレードします

ユースケースに適した最高レベルのAPIを使用してください。独自のトレーニングループを構築するよりも、 tf.keras.Model.fittf.keras.Model.fitします。

これらの高レベルの関数は、独自のトレーニングループを作成した場合に見逃しがちな、多くの低レベルの詳細を管理します。たとえば、正則化の損失を自動的に収集し、モデルを呼び出すときにtraining=True引数を設定します。

4.データ入力パイプラインをアップグレードします

データ入力にはtf.dataデータセットを使用します。これらのオブジェクトは効率的で表現力があり、テンソルフローとうまく統合されます。

それらはtf.keras.Model.fitメソッドに直接渡すことができます。

model.fit(dataset, epochs=5)

それらは、直接標準のPythonで繰り返すことができます。

for example_batch, label_batch in dataset:
    break

compat.v1シンボルを移行します

tf.compat.v1モジュールには、元のセマンティクスを備えた完全なTensorFlow 1.xAPIが含まれています。

TF2のアップグレードスクリプトは、このような変換が安全であるならば、それはバージョン2.0の動作はまったく同じであると判断できる場合、すなわち、彼らの2.0当量にシンボルに変換されます(例えば、それは名前を変更しますv1.arg_maxtf.argmaxいるので、それらは同じ機能です)。

アップグレードスクリプトがコードの一部で実行された後、 compat.v1について多くの言及がある可能性があります。コードを調べて、これらを手動で2.0相当に変換する価値があります(ログに記載されている場合はログに記載する必要があります)。

モデルの変換

低レベル変数と演算子の実行

低レベルのAPIの使用例は次のとおりです。

  • 可変スコープを使用して再利用を制御する
  • v1.get_variableを使用して変数を作成します。
  • コレクションに明示的にアクセスする
  • 次のようなメソッドを使用して暗黙的にコレクションにアクセスします。

  • v1.placeholderを使用してグラフ入力を設定する

  • Session.runグラフを実行する

  • 変数を手動で初期化する

変換する前に

TensorFlow 1.xを使用したコードでは、これらのパターンは次のようになります。

import tensorflow as tf
import tensorflow.compat.v1 as v1

import tensorflow_datasets as tfds
g = v1.Graph()

with g.as_default():
  in_a = v1.placeholder(dtype=v1.float32, shape=(2))
  in_b = v1.placeholder(dtype=v1.float32, shape=(2))

  def forward(x):
    with v1.variable_scope("matmul", reuse=v1.AUTO_REUSE):
      W = v1.get_variable("W", initializer=v1.ones(shape=(2,2)),
                          regularizer=lambda x:tf.reduce_mean(x**2))
      b = v1.get_variable("b", initializer=v1.zeros(shape=(2)))
      return W * x + b

  out_a = forward(in_a)
  out_b = forward(in_b)
  reg_loss=v1.losses.get_regularization_loss(scope="matmul")

with v1.Session(graph=g) as sess:
  sess.run(v1.global_variables_initializer())
  outs = sess.run([out_a, out_b, reg_loss],
                feed_dict={in_a: [1, 0], in_b: [0, 1]})

print(outs[0])
print()
print(outs[1])
print()
print(outs[2])
[[1. 0.]
 [1. 0.]]

[[0. 1.]
 [0. 1.]]

1.0

変換後

変換されたコードの場合:

  • 変数はローカルPythonオブジェクトです。
  • forward関数は、引き続き計算を定義します。
  • Session.run呼び出しは、 forwardする呼び出しに置き換えられSession.run
  • オプションのtf.functionデコレータを追加してパフォーマンスを向上させることができます。
  • 正則化は、グローバルコレクションを参照せずに、手動で計算されます。
  • セッションやプレースホルダーはありません。
W = tf.Variable(tf.ones(shape=(2,2)), name="W")
b = tf.Variable(tf.zeros(shape=(2)), name="b")

@tf.function
def forward(x):
  return W * x + b

out_a = forward([1,0])
print(out_a)
tf.Tensor(
[[1. 0.]
 [1. 0.]], shape=(2, 2), dtype=float32)

out_b = forward([0,1])

regularizer = tf.keras.regularizers.l2(0.04)
reg_loss=regularizer(W)

tf.layers基づくモデル

v1.layersモジュールは、変数を定義して再利用するためにv1.variable_scopeに依存するv1.variable_scope関数を含めるために使用されます。

変換する前に

def model(x, training, scope='model'):
  with v1.variable_scope(scope, reuse=v1.AUTO_REUSE):
    x = v1.layers.conv2d(x, 32, 3, activation=v1.nn.relu,
          kernel_regularizer=lambda x:0.004*tf.reduce_mean(x**2))
    x = v1.layers.max_pooling2d(x, (2, 2), 1)
    x = v1.layers.flatten(x)
    x = v1.layers.dropout(x, 0.1, training=training)
    x = v1.layers.dense(x, 64, activation=v1.nn.relu)
    x = v1.layers.batch_normalization(x, training=training)
    x = v1.layers.dense(x, 10)
    return x
train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

print(train_out)
print()
print(test_out)
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:4: conv2d (from tensorflow.python.keras.legacy_tf_layers.convolutional) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.keras.layers.Conv2D` instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/convolutional.py:424: Layer.apply (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `layer.__call__` method instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:5: max_pooling2d (from tensorflow.python.keras.legacy_tf_layers.pooling) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.MaxPooling2D instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:6: flatten (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Flatten instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:7: dropout (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.dropout instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:8: dense (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Dense instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:9: batch_normalization (from tensorflow.python.keras.legacy_tf_layers.normalization) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.BatchNormalization instead.  In particular, `tf.control_dependencies(tf.GraphKeys.UPDATE_OPS)` should not be used (consult the `tf.keras.layers.BatchNormalization` documentation).
tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)

tf.Tensor(
[[ 0.07562444 -0.27538717  0.21692204  0.2411264  -0.01209673 -0.0923705
   0.19058049 -0.00468709 -0.17215249 -0.07528099]], shape=(1, 10), dtype=float32)

変換後

ほとんどの議論は同じままでした。ただし、違いに注意してください。

  • training引数は、モデルの実行時にモデルによって各レイヤーに渡されます。
  • 元のmodel関数(入力x )の最初の引数はなくなりました。これは、オブジェクトレイヤーがモデルの構築とモデルの呼び出しを分離しているためです。

また、次の点にも注意してください。

  • tf.contribの初期化子の正規化子を使用していた場合、これらには他の引数よりも多くの引数の変更があります。
  • コードがコレクションに書き込まれなくなったため、 v1.losses.get_regularization_lossようなv1.losses.get_regularization_lossはこれらの値を返さなくなり、トレーニングループが壊れる可能性があります。
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.04),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))
train_out = model(train_data, training=True)
print(train_out)
tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)

test_out = model(test_data, training=False)
print(test_out)
tf.Tensor(
[[-0.32132083  0.22252844 -0.11330387 -0.4613616  -0.08817139 -0.52697927
  -0.1538124   0.23069203 -0.15860984 -0.453844  ]], shape=(1, 10), dtype=float32)

# Here are all the trainable variables.
len(model.trainable_variables)
8
# Here is the regularization loss.
model.losses
[<tf.Tensor: shape=(), dtype=float32, numpy=0.08671833>]

混合変数とv1.layers

既存のコードでは、多くの場合、低レベルのv1.layers変数と操作が高レベルのv1.layersます。

変換する前に

def model(x, training, scope='model'):
  with v1.variable_scope(scope, reuse=v1.AUTO_REUSE):
    W = v1.get_variable(
      "W", dtype=v1.float32,
      initializer=v1.ones(shape=x.shape),
      regularizer=lambda x:0.004*tf.reduce_mean(x**2),
      trainable=True)
    if training:
      x = x + W
    else:
      x = x + W * 0.5
    x = v1.layers.conv2d(x, 32, 3, activation=tf.nn.relu)
    x = v1.layers.max_pooling2d(x, (2, 2), 1)
    x = v1.layers.flatten(x)
    return x

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

変換後

このコードを変換するには、前の例のようにレイヤーをレイヤーにマッピングするパターンに従います。

一般的なパターンは次のとおりです。

  • __init__レイヤーパラメータを収集します。
  • build変数をbuildます。
  • callで計算を実行し、結果を返します。

v1.variable_scopeは、本質的には独自のレイヤーです。したがって、 tf.keras.layers.Layerとして書き直してtf.keras.layers.Layer 。詳細については、ガイドを参照してください。

# Create a custom layer for part of the model
class CustomLayer(tf.keras.layers.Layer):
  def __init__(self, *args, **kwargs):
    super(CustomLayer, self).__init__(*args, **kwargs)

  def build(self, input_shape):
    self.w = self.add_weight(
        shape=input_shape[1:],
        dtype=tf.float32,
        initializer=tf.keras.initializers.ones(),
        regularizer=tf.keras.regularizers.l2(0.02),
        trainable=True)

  # Call method will sometimes get used in graph mode,
  # training will get turned into a tensor
  @tf.function
  def call(self, inputs, training=None):
    if training:
      return inputs + self.w
    else:
      return inputs + self.w * 0.5
custom_layer = CustomLayer()
print(custom_layer([1]).numpy())
print(custom_layer([1], training=True).numpy())
[1.5]
[2.]

train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))

# Build the model including the custom layer
model = tf.keras.Sequential([
    CustomLayer(input_shape=(28, 28, 1)),
    tf.keras.layers.Conv2D(32, 3, activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
])

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

注意すべきいくつかの事柄:

  • サブクラス化されたKerasモデルとレイヤーは、v1グラフ(自動制御の依存関係なし)とイーガーモードの両方で実行する必要があります

    • call()tf.function() call()でラップして、サインと自動制御の依存関係を取得します
  • callためのtraining引数を受け入れることを忘れないでください。

    • 時々それはtf.Tensor
    • 時々それはPythonブール値です。
  • self.add_weight()を使用して、コンストラクターまたはModel.buildでモデル変数を作成します。

  • オブジェクトにtf.Tensorsを保持しないでください。

    • それらはtf.functionまたは熱心なコンテキストのいずれかで作成される可能性があり、これらのテンソルは異なる動作をします。
    • 状態にはtf.Variable使用します。これらは、両方のコンテキストから常に使用できます。
    • tf.Tensorsは中間値専用です。

Slim&contrib.layersに関するメモ

古いTensorFlow1.xコードの多くは、TensorFlow1.xにtf.contrib.layersとしてパッケージ化されているSlimライブラリを使用していtf.contrib.layerscontribモジュールとして、これはTensorFlow 2.0では、 tf.compat.v1でも使用できなくなりtf.compat.v1 。 Slimを使用したコードのv1.layers変換は、 v1.layersを使用するリポジトリの変換よりもv1.layersです。実際、最初にSlimコードをv1.layers変換してから、 v1.layersに変換するのが理にかなっているかもしれません。

  • arg_scopes削除しarg_scopes 。すべての引数は明示的である必要があります
  • それらを使用する場合は、 normalizer_fnactivation_fnを独自のレイヤーに分割します
  • 分離可能なconvレイヤーは、1つ以上の異なるKerasレイヤー(深さ方向、点方向、および分離可能なKerasレイヤー)にマップされます。
  • Slimとv1.layers引数名とデフォルト値は異なります
  • 一部の引数のスケールは異なります
  • あなたはスリム事前に訓練されたモデルを使用している場合は、Kerasの事前traimedからモデル試すtf.keras.applicationsまたはTFハブのTF2 SavedModelsがオリジナルスリムコードからエクスポートしました。

一部のtf.contribレイヤーは、コアTensorFlowに移動されていない可能性がありますが、代わりにTFアドオンパッケージに移動されています

トレーニング

tf.kerasモデルにデータをフィードする方法はたくさんあります。 PythonジェネレーターとNumpy配列を入力として受け入れます。

モデルにデータをフィードするための推奨される方法は、データを操作するための高性能クラスのコレクションを含むtf.dataパッケージを使用することです。

まだtf.queueを使用している場合、これらは入力パイプラインとしてではなく、データ構造としてのみサポートされるようになりました。

データセットの使用

TensorFlow Datasetsパッケージ( tfds )には、事前定義されたデータセットをtf.data.Datasetオブジェクトとしてロードするためのユーティリティが含まれてtf.data.Datasetます。

この例では、tfdsを使用してtfdsロードしtfds

datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
mnist_train, mnist_test = datasets['train'], datasets['test']
Downloading and preparing dataset mnist/3.0.1 (download: 11.06 MiB, generated: 21.00 MiB, total: 32.06 MiB) to /home/kbuilder/tensorflow_datasets/mnist/3.0.1...

Warning:absl:Dataset mnist is hosted on GCS. It will automatically be downloaded to your
local data directory. If you'd instead prefer to read directly from our public
GCS bucket (recommended if you're running on GCP), you can instead pass
`try_gcs=True` to `tfds.load` or set `data_dir=gs://tfds-data/datasets`.


Dataset mnist downloaded and prepared to /home/kbuilder/tensorflow_datasets/mnist/3.0.1. Subsequent calls will reuse this data.

次に、トレーニング用のデータを準備します。

  • 各画像を再スケーリングします。
  • 例の順序をシャッフルします。
  • 画像とラベルのバッチを収集します。
BUFFER_SIZE = 10 # Use a much larger value for real code.
BATCH_SIZE = 64
NUM_EPOCHS = 5


def scale(image, label):
  image = tf.cast(image, tf.float32)
  image /= 255

  return image, label

例を短くするために、データセットをトリミングして5つのバッチのみを返します。

train_data = mnist_train.map(scale).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
test_data = mnist_test.map(scale).batch(BATCH_SIZE)

STEPS_PER_EPOCH = 5

train_data = train_data.take(STEPS_PER_EPOCH)
test_data = test_data.take(STEPS_PER_EPOCH)
image_batch, label_batch = next(iter(train_data))

Kerasトレーニングループを使用する

トレーニングプロセスの低レベルの制御が必要ない場合は、Kerasの組み込みのfitevaluate 、およびpredict方法を使用predictことをお勧めします。これらのメソッドは、実装(シーケンシャル、機能、またはサブクラス化)に関係なく、モデルをトレーニングするための統一されたインターフェイスを提供します。

これらの方法の利点は次のとおりです。

  • Numpy配列、Pythonジェネレーター、およびtf.data.Datasetsを受け入れます
  • それらは正則化とアクティベーション損失を自動的に適用します。
  • マルチデバイストレーニング用のtf.distributeサポートしています。
  • それらは、損失およびメトリックとして任意の呼び出し可能オブジェクトをサポートします。
  • これらは、 tf.keras.callbacks.TensorBoardなどのコールバックとカスタムコールバックをサポートしています。
  • これらはパフォーマンスが高く、TensorFlowグラフを自動的に使用します。

これは、 Datasetを使用してモデルをトレーニングする例です。 (これがどのように機能するかの詳細については、チュートリアルを参照してください。)

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

# Model is the full model w/o custom layers
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(train_data, epochs=NUM_EPOCHS)
loss, acc = model.evaluate(test_data)

print("Loss {}, Accuracy {}".format(loss, acc))
Epoch 1/5
5/5 [==============================] - 0s 6ms/step - loss: 1.5665 - accuracy: 0.4969
Epoch 2/5
5/5 [==============================] - 0s 6ms/step - loss: 0.5249 - accuracy: 0.8656
Epoch 3/5
5/5 [==============================] - 0s 5ms/step - loss: 0.3246 - accuracy: 0.9438
Epoch 4/5
5/5 [==============================] - 0s 6ms/step - loss: 0.2407 - accuracy: 0.9719
Epoch 5/5
5/5 [==============================] - 0s 5ms/step - loss: 0.1841 - accuracy: 0.9906
5/5 [==============================] - 0s 4ms/step - loss: 1.5957 - accuracy: 0.5375
Loss 1.5956770181655884, Accuracy 0.5375000238418579

独自のループを書く

Kerasモデルのトレーニングステップが機能するが、そのステップ以外でより詳細な制御が必要な場合は、独自のデータ反復ループでtf.keras.Model.train_on_batchメソッドを使用することを検討してください。

注意:多くのものはtf.keras.callbacks.Callbackとして実装できます。

この方法には、前のセクションで説明した方法の多くの利点がありますが、ユーザーが外側のループを制御できます。

tf.keras.Model.test_on_batchまたはtf.keras.Model.evaluateを使用して、トレーニング中のパフォーマンスを確認することもできます。

上記のモデルのトレーニングを続行するには:

# Model is the full model w/o custom layers
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

for epoch in range(NUM_EPOCHS):
  #Reset the metric accumulators
  model.reset_metrics()

  for image_batch, label_batch in train_data:
    result = model.train_on_batch(image_batch, label_batch)
    metrics_names = model.metrics_names
    print("train: ",
          "{}: {:.3f}".format(metrics_names[0], result[0]),
          "{}: {:.3f}".format(metrics_names[1], result[1]))
  for image_batch, label_batch in test_data:
    result = model.test_on_batch(image_batch, label_batch,
                                 # return accumulated metrics
                                 reset_metrics=False)
  metrics_names = model.metrics_names
  print("\neval: ",
        "{}: {:.3f}".format(metrics_names[0], result[0]),
        "{}: {:.3f}".format(metrics_names[1], result[1]))
train:  loss: 0.145 accuracy: 1.000
train:  loss: 0.183 accuracy: 0.984
train:  loss: 0.216 accuracy: 0.953
train:  loss: 0.229 accuracy: 0.938
train:  loss: 0.201 accuracy: 0.969

eval:  loss: 1.588 accuracy: 0.628
train:  loss: 0.097 accuracy: 1.000
train:  loss: 0.101 accuracy: 1.000
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.130 accuracy: 0.984
train:  loss: 0.127 accuracy: 1.000

eval:  loss: 1.580 accuracy: 0.766
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.081 accuracy: 1.000
train:  loss: 0.079 accuracy: 1.000
train:  loss: 0.076 accuracy: 1.000
train:  loss: 0.077 accuracy: 1.000

eval:  loss: 1.542 accuracy: 0.809
train:  loss: 0.067 accuracy: 1.000
train:  loss: 0.068 accuracy: 1.000
train:  loss: 0.063 accuracy: 1.000
train:  loss: 0.063 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000

eval:  loss: 1.503 accuracy: 0.816
train:  loss: 0.055 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000
train:  loss: 0.051 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000

eval:  loss: 1.482 accuracy: 0.828

トレーニングステップをカスタマイズする

より柔軟性と制御が必要な場合は、独自のトレーニングループを実装することでそれを実現できます。 3つのステップがあります:

  1. Pythonジェネレーターまたはtf.data.Datasetを反復処理して、例のバッチを取得します。
  2. tf.GradientTapeを使用してtf.GradientTapeを収集します。
  3. tf.keras.optimizersいずれかを使用して、モデルの変数に重みの更新を適用します。

覚えておいてください:

  • サブクラス化されたレイヤーとモデルのcallメソッドには、常にtraining引数を含めてください。
  • training引数が正しく設定されたモデルを呼び出すようにしてください。
  • 使用法によっては、モデルがデータのバッチで実行されるまでモデル変数が存在しない場合があります。
  • モデルの正規化損失などを手動で処理する必要があります。

v1に比べて単純化されていることに注意してください。

  • 変数初期化子を実行する必要はありません。変数は作成時に初期化されます。
  • 手動制御の依存関係を追加する必要はありません。 tf.functionでも、操作はtf.functionモードのように機能します。
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

optimizer = tf.keras.optimizers.Adam(0.001)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

@tf.function
def train_step(inputs, labels):
  with tf.GradientTape() as tape:
    predictions = model(inputs, training=True)
    regularization_loss=tf.math.add_n(model.losses)
    pred_loss=loss_fn(labels, predictions)
    total_loss=pred_loss + regularization_loss

  gradients = tape.gradient(total_loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

for epoch in range(NUM_EPOCHS):
  for inputs, labels in train_data:
    train_step(inputs, labels)
  print("Finished epoch", epoch)
Finished epoch 0
Finished epoch 1
Finished epoch 2
Finished epoch 3
Finished epoch 4

新しいスタイルの指標と損失

TensorFlow 2.0では、メトリックと損失はオブジェクトです。これらは熱心にそしてtf.functionの両方でtf.functionます。

損失オブジェクトは呼び出し可能であり、引数として(y_true、y_pred)を期待します。

cce = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
cce([[1, 0]], [[-1.0,3.0]]).numpy()
4.01815

メトリックオブジェクトには、次のメソッドがあります。

オブジェクト自体は呼び出し可能です。を呼び出すと、 update_stateと同様に、新しい観測値で状態が更新され、メトリックの新しい結果が返されます。

メトリックの変数を手動で初期化する必要はありません。また、TensorFlow 2.0には自動制御の依存関係があるため、それらについても心配する必要はありません。

以下のコードは、メトリックを使用して、カスタムトレーニングループ内で観察された平均損失を追跡します。

# Create the metrics
loss_metric = tf.keras.metrics.Mean(name='train_loss')
accuracy_metric = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')

@tf.function
def train_step(inputs, labels):
  with tf.GradientTape() as tape:
    predictions = model(inputs, training=True)
    regularization_loss=tf.math.add_n(model.losses)
    pred_loss=loss_fn(labels, predictions)
    total_loss=pred_loss + regularization_loss

  gradients = tape.gradient(total_loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))
  # Update the metrics
  loss_metric.update_state(total_loss)
  accuracy_metric.update_state(labels, predictions)


for epoch in range(NUM_EPOCHS):
  # Reset the metrics
  loss_metric.reset_states()
  accuracy_metric.reset_states()

  for inputs, labels in train_data:
    train_step(inputs, labels)
  # Get the metric results
  mean_loss=loss_metric.result()
  mean_accuracy = accuracy_metric.result()

  print('Epoch: ', epoch)
  print('  loss:     {:.3f}'.format(mean_loss))
  print('  accuracy: {:.3f}'.format(mean_accuracy))
Epoch:  0
  loss:     0.207
  accuracy: 0.991
Epoch:  1
  loss:     0.167
  accuracy: 0.994
Epoch:  2
  loss:     0.147
  accuracy: 0.997
Epoch:  3
  loss:     0.123
  accuracy: 0.997
Epoch:  4
  loss:     0.109
  accuracy: 0.997

Kerasメトリック名

TensorFlow 2.0では、kerasモデルはメトリック名の処理に関してより一貫性があります。

これで、メトリックのリストで文字列を渡すと、その正確な文字列がメトリックのnameとして使用されます。これらの名前は、 model.fitによって返される履歴オブジェクト、およびmodel.fitに渡されるログに表示されkeras.callbacks 。メトリックリストで渡した文字列に設定されます。

model.compile(
    optimizer = tf.keras.optimizers.Adam(0.001),
    loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics = ['acc', 'accuracy', tf.keras.metrics.SparseCategoricalAccuracy(name="my_accuracy")])
history = model.fit(train_data)
5/5 [==============================] - 0s 6ms/step - loss: 0.1233 - acc: 0.9937 - accuracy: 0.9937 - my_accuracy: 0.9937

history.history.keys()
dict_keys(['loss', 'acc', 'accuracy', 'my_accuracy'])

これは、 metrics=["accuracy"]dict_keys(['loss', 'acc'])以前のバージョンとは異なります。

Kerasオプティマイザー

v1.train.AdamOptimizerv1.train.GradientDescentOptimizerなどのv1.train.AdamOptimizerのオプティマイザーは、 v1.trainに同等のものがtf.keras.optimizersます。

v1.trainkeras.optimizers変換しkeras.optimizers

オプティマイザを変換する際に留意すべき点は次のとおりです。

一部のtf.keras.optimizers新しいデフォルト

optimizers.SGDoptimizers.Adam optimizers.RMSpropoptimizers.Adam 、またはoptimizers.RMSprop optimizers.Adam変更はありません。

次のデフォルトの学習率が変更されました。

TensorBoard

TensorFlow 2には、 tf.summaryで視覚化するための要約データを書き込むために使用されるtf.summaryへの重要な変更が含まれてtf.summaryます。新しいtf.summary一般的な紹介として、TF tf.summaryを使用するチュートリアルいくつかあります。これには、 TensorBoard TF2移行ガイドが含まれます

保存と読み込み

チェックポイントの互換性

TensorFlow 2.0は、オブジェクトベースのチェックポイントを使用します

注意すれば、古いスタイルの名前ベースのチェックポイントを引き続きロードできます。コード変換プロセスにより変数名が変更される場合がありますが、回避策があります。

新しいモデルの名前をチェックポイントの名前と並べる最も簡単なアプローチは次のとおりです。

  • 変数には、設定可能なname引数があります。
  • Kerasモデルは、変数のプレフィックスとして設定するname引数も取ります。
  • v1.name_scope関数を使用して、変数名のプレフィックスを設定できます。これはtf.variable_scopeとは大きく異なります。名前にのみ影響し、変数と再利用を追跡しません。

それがユースケースで機能しない場合は、 v1.train.init_from_checkpoint関数を試してv1.train.init_from_checkpoint 。古い名前から新しい名前へのマッピングを指定するassignment_map引数を取ります。

TensorFlow Estimatorリポジトリには、 事前に作成されたEstimatorのチェックポイントをTensorFlow1.Xから2.0にアップグレードするための変換ツールが含まれています。これは、同様のユースケースのツールを構築する方法の例として役立つ場合があります。

保存されたモデルの互換性

保存されたモデルには、互換性に関する重大な懸念はありません。

  • TensorFlow 1.xsaved_modelsはTensorFlow2.xで機能します。
  • TensorFlow 2.x saved_modelsは、すべての操作がサポートされている場合、TensorFlow1.xで機能します。

Graph.pbまたはGraph.pbtxt

生のGraph.pbファイルをTensorFlow2.0にアップグレードする簡単な方法はありません。最善の策は、ファイルを生成したコードをアップグレードすることです。

ただし、「フリーズグラフ」(変数が定数に変換されたtf.Graphがある場合は、 tf.Graphを使用してこれをconcrete_functionに変換できv1.wrap_function

def wrap_frozen_graph(graph_def, inputs, outputs):
  def _imports_graph_def():
    tf.compat.v1.import_graph_def(graph_def, name="")
  wrapped_import = tf.compat.v1.wrap_function(_imports_graph_def, [])
  import_graph = wrapped_import.graph
  return wrapped_import.prune(
      tf.nest.map_structure(import_graph.as_graph_element, inputs),
      tf.nest.map_structure(import_graph.as_graph_element, outputs))

たとえば、2016年のInceptionv1のフリーズグラフは次のとおりです。

path = tf.keras.utils.get_file(
    'inception_v1_2016_08_28_frozen.pb',
    'http://storage.googleapis.com/download.tensorflow.org/models/inception_v1_2016_08_28_frozen.pb.tar.gz',
    untar=True)
Downloading data from http://storage.googleapis.com/download.tensorflow.org/models/inception_v1_2016_08_28_frozen.pb.tar.gz
24698880/24695710 [==============================] - 1s 0us/step

tf.GraphDefロードしtf.GraphDef

graph_def = tf.compat.v1.GraphDef()
loaded = graph_def.ParseFromString(open(path,'rb').read())

それをconcrete_functionラップします:

inception_func = wrap_frozen_graph(
    graph_def, inputs='input:0',
    outputs='InceptionV1/InceptionV1/Mixed_3b/Branch_1/Conv2d_0a_1x1/Relu:0')

入力としてテンソルを渡します。

input_img = tf.ones([1,224,224,3], dtype=tf.float32)
inception_func(input_img).shape
TensorShape([1, 28, 28, 96])

推定量

推定量を使用したトレーニング

推定量はTensorFlow2.0でサポートされています。

Estimatorを使用する場合は、TensorFlow 1.xのinput_fn()tf.estimator.TrainSpec 、およびtf.estimator.EvalSpecを使用できます。

これは、trainとevaluateの仕様でinput_fnを使用する例です。

input_fnおよびtrain / eval仕様の作成

# Define the estimator's input_fn
def input_fn():
  datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
  mnist_train, mnist_test = datasets['train'], datasets['test']

  BUFFER_SIZE = 10000
  BATCH_SIZE = 64

  def scale(image, label):
    image = tf.cast(image, tf.float32)
    image /= 255

    return image, label[..., tf.newaxis]

  train_data = mnist_train.map(scale).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
  return train_data.repeat()

# Define train & eval specs
train_spec = tf.estimator.TrainSpec(input_fn=input_fn,
                                    max_steps=STEPS_PER_EPOCH * NUM_EPOCHS)
eval_spec = tf.estimator.EvalSpec(input_fn=input_fn,
                                  steps=STEPS_PER_EPOCH)

Kerasモデル定義の使用

TensorFlow2.0で推定量を構築する方法にはいくつかの違いがあります。

tf.keras.estimator.model_to_estimator使用してモデルを定義してから、 tf.keras.estimator.model_to_estimatorユーティリティを使用してモデルを推定器に変換することをお勧めします。以下のコードは、Estimatorを作成およびトレーニングするときにこのユーティリティを使用する方法を示しています。

def make_model():
  return tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
  ])
model = make_model()

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

estimator = tf.keras.estimator.model_to_estimator(
  keras_model = model
)

tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.

INFO:tensorflow:Using default config.

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp333woaev

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp333woaev

INFO:tensorflow:Using the Keras model provided.

INFO:tensorflow:Using the Keras model provided.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py:220: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating:
Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py:220: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating:
Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp333woaev', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp333woaev', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmp333woaev/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={})

INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmp333woaev/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={})

INFO:tensorflow:Warm-starting from: /tmp/tmp333woaev/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting from: /tmp/tmp333woaev/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES.

INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES.

INFO:tensorflow:Warm-started 8 variables.

INFO:tensorflow:Warm-started 8 variables.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.946777, step = 0

INFO:tensorflow:loss = 2.946777, step = 0

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:37Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:37Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Inference Time : 0.84716s

INFO:tensorflow:Inference Time : 0.84716s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:38

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:38

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.715625, global_step = 25, loss = 1.5356585

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.715625, global_step = 25, loss = 1.5356585

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.52498615.

INFO:tensorflow:Loss for final step: 0.52498615.

({'accuracy': 0.715625, 'loss': 1.5356585, 'global_step': 25}, [])

カスタムmodel_fn使用

維持する必要のある既存のカスタム推定量model_fnある場合は、 model_fnmodel_fnモデルを使用するように変換できます。

ただし、互換性の理由から、カスタムmodel_fnは引き続き1.xスタイルのグラフモードで実行されます。これは、熱心な実行や自動制御の依存関係がないことを意味します。

最小限の変更でカスタムmodel_fn

カスタムmodel_fn機能させるために、既存のコードへの最小限の変更を希望する場合は、 tf.compat.v1 optimizersmetricsなどのtf.compat.v1シンボルを使用できます。

カスタムmodel_fnモデルを使用することは、カスタムトレーニングループで使用することに似ています。

  • mode引数に基づいて、 trainingフェーズを適切にmodeます。
  • モデルのtrainable_variablesをオプティマイザーに明示的に渡します。

ただし、カスタムループと比較して、重要な違いがあります

  • Model.lossesを使用する代わりに、 Model.lossesを使用して損失を抽出しModel.get_losses_for
  • Model.get_updates_forを使用して、モデルの更新を抽出します。

次のコードは、カスタムmodel_fnから推定量を作成し、これらすべての懸念事項を示しています。

def my_model_fn(features, labels, mode):
  model = make_model()

  optimizer = tf.compat.v1.train.AdamOptimizer()
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

  training = (mode == tf.estimator.ModeKeys.TRAIN)
  predictions = model(features, training=training)

  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

  reg_losses = model.get_losses_for(None) + model.get_losses_for(features)
  total_loss=loss_fn(labels, predictions) + tf.math.add_n(reg_losses)

  accuracy = tf.compat.v1.metrics.accuracy(labels=labels,
                                           predictions=tf.math.argmax(predictions, axis=1),
                                           name='acc_op')

  update_ops = model.get_updates_for(None) + model.get_updates_for(features)
  minimize_op = optimizer.minimize(
      total_loss,
      var_list=model.trainable_variables,
      global_step=tf.compat.v1.train.get_or_create_global_step())
  train_op = tf.group(minimize_op, update_ops)

  return tf.estimator.EstimatorSpec(
    mode=mode,
    predictions=predictions,
    loss=total_loss,
    train_op=train_op, eval_metric_ops={'accuracy': accuracy})

# Create the Estimator & Train
estimator = tf.estimator.Estimator(model_fn=my_model_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.

INFO:tensorflow:Using default config.

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmpnhx_c2r_

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmpnhx_c2r_

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpnhx_c2r_', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpnhx_c2r_', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.7539256, step = 0

INFO:tensorflow:loss = 2.7539256, step = 0

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:41Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:41Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Inference Time : 0.94175s

INFO:tensorflow:Inference Time : 0.94175s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:42

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:42

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.678125, global_step = 25, loss = 1.5622549

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.678125, global_step = 25, loss = 1.5622549

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.39462265.

INFO:tensorflow:Loss for final step: 0.39462265.

({'accuracy': 0.678125, 'loss': 1.5622549, 'global_step': 25}, [])

model_fnシンボルをmodel_fnしたカスタムmodel_fn

すべてのmodel_fnシンボルをmodel_fnし、カスタムmodel_fnをネイティブTF 2.0にアップグレードする場合は、オプティマイザーとメトリックをtf.keras.optimizerstf.keras.metricsに更新する必要があります。

カスタムmodel_fnでは、上記の変更に加えて、さらにアップグレードを行う必要があります。

上記のmy_model_fn例では、2.0シンボルの移行されたコードは次のように表示されます。

def my_model_fn(features, labels, mode):
  model = make_model()

  training = (mode == tf.estimator.ModeKeys.TRAIN)
  loss_obj = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
  predictions = model(features, training=training)

  # Get both the unconditional losses (the None part)
  # and the input-conditional losses (the features part).
  reg_losses = model.get_losses_for(None) + model.get_losses_for(features)
  total_loss=loss_obj(labels, predictions) + tf.math.add_n(reg_losses)

  # Upgrade to tf.keras.metrics.
  accuracy_obj = tf.keras.metrics.Accuracy(name='acc_obj')
  accuracy = accuracy_obj.update_state(
      y_true=labels, y_pred=tf.math.argmax(predictions, axis=1))

  train_op = None
  if training:
    # Upgrade to tf.keras.optimizers.
    optimizer = tf.keras.optimizers.Adam()
    # Manually assign tf.compat.v1.global_step variable to optimizer.iterations
    # to make tf.compat.v1.train.global_step increased correctly.
    # This assignment is a must for any `tf.train.SessionRunHook` specified in
    # estimator, as SessionRunHooks rely on global step.
    optimizer.iterations = tf.compat.v1.train.get_or_create_global_step()
    # Get both the unconditional updates (the None part)
    # and the input-conditional updates (the features part).
    update_ops = model.get_updates_for(None) + model.get_updates_for(features)
    # Compute the minimize_op.
    minimize_op = optimizer.get_updates(
        total_loss,
        model.trainable_variables)[0]
    train_op = tf.group(minimize_op, *update_ops)

  return tf.estimator.EstimatorSpec(
    mode=mode,
    predictions=predictions,
    loss=total_loss,
    train_op=train_op,
    eval_metric_ops={'Accuracy': accuracy_obj})

# Create the Estimator & Train.
estimator = tf.estimator.Estimator(model_fn=my_model_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.

INFO:tensorflow:Using default config.

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp3kddt__h

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp3kddt__h

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp3kddt__h', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp3kddt__h', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.4914804, step = 0

INFO:tensorflow:loss = 2.4914804, step = 0

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:45Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:45Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Inference Time : 0.91708s

INFO:tensorflow:Inference Time : 0.91708s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:46

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:46

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.690625, global_step = 25, loss = 1.554177

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.690625, global_step = 25, loss = 1.554177

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.3999393.

INFO:tensorflow:Loss for final step: 0.3999393.

({'Accuracy': 0.690625, 'loss': 1.554177, 'global_step': 25}, [])

既製の推定量

tf.estimator.DNN*tf.estimator.Linear* 、およびtf.estimator.DNNLinearCombined*ファミリーのtf.estimator.DNN* Estimatorは、TensorFlow 2.0 APIで引き続きサポートされていますが、一部の引数が変更されています。

  1. input_layer_partitioner :2.0で削除されました。
  2. loss_reduction :に更新tf.keras.losses.Reductionの代わりtf.compat.v1.losses.Reduction 。デフォルト値もtf.keras.losses.Reduction.SUM_OVER_BATCH_SIZEからtf.compat.v1.losses.Reduction.SUM変更されtf.compat.v1.losses.Reduction.SUM
  3. optimizerdnn_optimizerlinear_optimizer :この引数はtf.keras.optimizersではなくtf.keras.optimizersに更新されtf.compat.v1.train.Optimizer

上記の変更を移行するには:

  1. Distribution Strategyinput_layer_partitionerで自動的に処理するため、 input_layer_partitioner移行は必要ありません。
  2. loss_reduction 、チェックtf.keras.losses.Reductionサポートオプションについて。
  3. optimizer引数の場合、 optimizerdnn_optimizerまたはlinear_optimizer argをlinear_optimizerない場合、またはoptimizer argをコード内のstringとして指定する場合は、何も変更する必要はありません。 tf.keras.optimizersがデフォルトで使用されます。それ以外の場合は、 tf.compat.v1.train.Optimizerから対応するtf.keras.optimizersに更新する必要があります

チェックポイントコンバータ

移行keras.optimizersとして、TFの1.1を使用して保存されたチェックポイントを中断しますtf.keras.optimizersチェックポイントに保存する変数の異なるセットを生成します。 TF 2.0への移行後に古いチェックポイントを再利用できるようにするには、 チェックポイントコンバータツールを試してください。

 curl -O https://raw.githubusercontent.com/tensorflow/estimator/master/tensorflow_estimator/python/estimator/tools/checkpoint_converter.py
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 15165  100 15165    0     0  32265      0 --:--:-- --:--:-- --:--:-- 32197

このツールにはヘルプが組み込まれています。

 python checkpoint_converter.py -h
2020-10-15 01:27:47.423752: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
usage: checkpoint_converter.py [-h]
                               {dnn,linear,combined} source_checkpoint
                               source_graph target_checkpoint

positional arguments:
  {dnn,linear,combined}
                        The type of estimator to be converted. So far, the
                        checkpoint converter only supports Canned Estimator.
                        So the allowed types include linear, dnn and combined.
  source_checkpoint     Path to source checkpoint file to be read in.
  source_graph          Path to source graph file to be read in.
  target_checkpoint     Path to checkpoint file to be written out.

optional arguments:
  -h, --help            show this help message and exit

TensorShape

このクラスは、 tf.compat.v1.Dimensionオブジェクトの代わりにintを保持するように簡略化されました。したがって、 intを取得するために.value()を呼び出す必要はありません。

個々のtf.compat.v1.Dimensionオブジェクトには、引き続きtf.TensorShape.dimsからアクセスできます。

以下に、TensorFlow1.xとTensorFlow2.0の違いを示します。

# Create a shape and choose an index
i = 0
shape = tf.TensorShape([16, None, 256])
shape
TensorShape([16, None, 256])

TF 1.xでこれを使用した場合:

value = shape[i].value

次に、TF2.0でこれを行います。

value = shape[i]
value
16

TF 1.xでこれを使用した場合:

for dim in shape:
    value = dim.value
    print(value)

次に、TF2.0でこれを行います。

for value in shape:
  print(value)
16
None
256

TF 1.xでこれを使用した場合(または他のディメンション方法を使用した場合):

dim = shape[i]
dim.assert_is_compatible_with(other_dim)

次に、TF2.0でこれを行います。

other_dim = 16
Dimension = tf.compat.v1.Dimension

if shape.rank is None:
  dim = Dimension(None)
else:
  dim = shape.dims[i]
dim.is_compatible_with(other_dim) # or any other dimension method
True
shape = tf.TensorShape(None)

if shape:
  dim = shape.dims[i]
  dim.is_compatible_with(other_dim) # or any other dimension method

tf.TensorShapeのブール値は、ランクがわかっている場合はTrue 、それ以外の場合はFalseです。

print(bool(tf.TensorShape([])))      # Scalar
print(bool(tf.TensorShape([0])))     # 0-length vector
print(bool(tf.TensorShape([1])))     # 1-length vector
print(bool(tf.TensorShape([None])))  # Unknown-length vector
print(bool(tf.TensorShape([1, 10, 100])))       # 3D tensor
print(bool(tf.TensorShape([None, None, None]))) # 3D tensor with no known dimensions
print()
print(bool(tf.TensorShape(None)))  # A tensor with unknown rank.
True
True
True
True
True
True

False

その他の変更

  • tf.colocate_with削除:TensorFlowのデバイス配置アルゴリズムが大幅に改善されました。これはもう必要ないはずです。それを削除するとパフォーマンスが低下する場合は、バグを報告してください

  • v1.ConfigProto使用法をv1.ConfigProtoの同等の関数にtf.configます。

結論

全体的なプロセスは次のとおりです。

  1. アップグレードスクリプトを実行します。
  2. contribシンボルを削除します。
  3. モデルをオブジェクト指向スタイル(Keras)に切り替えます。
  4. 可能な場合は、 tf.kerasまたはtf.estimatorトレーニングおよび評価ループを使用してください。
  5. それ以外の場合は、カスタムループを使用しますが、セッションとコレクションは避けてください。

コードを慣用的なTensorFlow2.0に変換するには少し手間がかかりますが、変更するたびに次のようになります。

  • コードの行数が少なくなります。
  • 明快さとシンプルさの向上。
  • より簡単なデバッグ。