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

あなたのTensorFlow 1コードがTensorFlowへの移行2

TensorFlow.org上に表示します Googleのコラボで実行します GitHubの上のソースを表示 ダウンロードノート

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

(未修飾、1.Xコードを実行することが可能であるのcontribを除い TensorFlow 2.0):

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

しかし、これはあなたがTensorFlow 2.0で行われた改善点の多くを利用することはできません。このガイドでは、それは単純に、よりパフォーマンス、および保守が容易になり、あなたのコードをアップグレードするのに役立ちます。

自動変換スクリプト

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

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

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

あなたのコードを使用してTensorFlow 2.0で動作する場合tf.compat.v1.disable_v2_behavior()あなたが対処する必要があるかもしれグローバル行動の変化が残っています。主な変更点は以下のとおりです。

  • イーガー実行、 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ネイティブを作ります

このガイドは、TensorFlow 2.0 TensorFlow 1.xのコード変換のいくつかの例を介して歩いていきます。これらの変更は、あなたのコードは、パフォーマンスの最適化および簡素化APIコールを利用できるようになります。

それぞれの場合に、パターンがあります。

交換してください1. v1.Session.run呼び出しを

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

  • feed_dictv1.placeholder sが関数の引数になります。
  • fetches関数の戻り値になります。
  • 変換熱心実行中にのような標準的なPythonツールで簡単にデバッグが可能pdb

その後追加tf.functionそれがグラフで効率的に実行するためにデコレータを。参照オートグラフ・ガイドを 、これがどのように動作するかの詳細については。

ご了承ください:

  • 異なりv1.Session.run tf.function 、固定リターンの署名を持っており、常にすべての出力を返します。これはパフォーマンス上の問題が発生した場合は、二つの別々の関数を作成します。

  • 以下のための必要はありませんtf.control_dependencies :または同様の操作tf.functionことが書かれた順序で実行されたかのように振る舞うが。 tf.Variable割り当てとtf.assert Sは、例えば、自動的に実行されます。

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オブジェクト。

これらのLayerModelのクラスは、グローバルコレクションの必要性を削除し、他のいくつかのプロパティを実装します。彼らの.lossesプロパティには、使用するための交換可能tf.GraphKeys.LOSSESコレクションを。

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

あなたのトレーニングのループをアップグレード3.

ご使用のケースのために働く最高レベルのAPIを使用してください。優先tf.keras.Model.fit 、独自のトレーニングのループを構築する上で。

これらの高レベルの機能では、独自のトレーニングループを書く場合ミスに簡単かもしれない低レベルの詳細の多くを管理します。たとえば、自動的に収集彼ら正則損失、および設定training=Trueモデルを呼び出すときに引数を。

あなたのデータ入力パイプラインをアップグレード4.

使用tf.dataデータ入力のためのデータセットを。これらのオブジェクトは、効率的な表現力であり、tensorflowとうまく統合します。

彼らはに直接渡すことができtf.keras.Model.fit方法。

 model.fit(dataset, epochs=5)
 

彼らは直接、標準のPythonを繰り返し処理することができます。

 for example_batch, label_batch in dataset:
    break
 

オフ5.移行compat.v1シンボル

tf.compat.v1モジュールは、元の意味で、完全なTensorFlow 1.xのAPIが含まれています。

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

アップグレードスクリプトはコードの一部で行われた後、それは可能性があり、多くのの言及があるcompat.v1 。これは、コードを通過すると(存在する場合、それはログに言及されるべきである)2.0当量に対して手動でこれらを変換する価値があります。

モデルの変換

セットアップ

 import tensorflow as tf


import tensorflow_datasets as tfds
 

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

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

  • 再利用を制御するための変数のスコープを使用して
  • 変数の作成v1.get_variable
  • 明示的にコレクションにアクセス
  • 以下のような方法で、暗黙的にコレクションにアクセスします:

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

  • でグラフを実行Session.run

  • 手動で変数を初期化します

変換する前に

ここでは、これらのパターンはTensorFlow 1.xのを使用してコードのように見えるかもしれないものです

 in_a = tf.placeholder(dtype=tf.float32, shape=(2))
in_b = tf.placeholder(dtype=tf.float32, shape=(2))

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

out_a = forward(in_a)
out_b = forward(in_b)

reg_loss=tf.losses.get_regularization_loss(scope="matmul")

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

 

変換した後

変換されたコードでは:

  • 変数は、ローカルのPythonオブジェクトです。
  • forward機能はまだ計算を定義します。
  • Session.run呼び出しはへの呼び出しに置き換えられforward
  • オプションのtf.functionデコレータは、パフォーマンスのために追加することができます。
  • regularizationsは、任意のグローバルコレクションを参照せずに、手動で計算されます。
  • セッションまたはプレースホルダはありません。
 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定義すると、再利用変数。

変換する前に

 def model(x, training, scope='model'):
  with tf.variable_scope(scope, reuse=tf.AUTO_REUSE):
    x = tf.layers.conv2d(x, 32, 3, activation=tf.nn.relu,
          kernel_regularizer=tf.contrib.layers.l2_regularizer(0.04))
    x = tf.layers.max_pooling2d(x, (2, 2), 1)
    x = tf.layers.flatten(x)
    x = tf.layers.dropout(x, 0.1, training=training)
    x = tf.layers.dense(x, 64, activation=tf.nn.relu)
    x = tf.layers.batch_normalization(x, training=training)
    x = tf.layers.dense(x, 10)
    return x

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

変換した後

ほとんどの引数は同じとどまりました。しかし、違いに気づきます:

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

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

  • あなたから初期化子のregularizersを使用していた場合tf.contrib 、これらは他よりも引数の変更を持っています。
  • 以下のような関数ように、コードはもはや、コレクションに書き込むことはありません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.11456077 -0.3126101   0.13154565 -0.50197905 -0.02416557  0.36460522
  -0.24887308 -0.37784547  0.05524942  0.01696768]], 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.077528305>]

ミックス変数& v1.layers

既存のコードしばしばミックス上位レベルと下位レベルTF 1.xの変数および操作v1.layers

変換する前に

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

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

変換した後

このコードを変換するために、前の例のように層にマッピングする層のパターンに従います。

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

  • で収集層パラメータ__init__
  • 変数のビルドbuild
  • で計算を実行call 、その結果を返します。

v1.variable_scope 、本質的に、独自の層です。だから、としてそれを書き換え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グラフ(NO自動制御依存性)および熱心なモードで実行する必要があります

    • ラップcall()tf.function()直筆と自動制御の依存関係を取得します
  • 受け入れることを忘れないでくださいtrainingに引数をcall

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

    • Model.buildあなたは、入力形状へのアクセス権を持っているので、形状が一致する重みを作成することができます。
    • 使用tf.keras.layers.Layer.add_weight Kerasは、変数や正則損失を追跡することができます。
  • 保管しないでくださいtf.Tensorsあなたのオブジェクトに。

    • 彼らは、のいずれかで作成されてしまうかもしれませんtf.functionや熱心な文脈で、これらのテンソルは異なる挙動を示します。
    • 使用tf.Variable sの状態のために、彼らは常に両方のコンテキストから使用可能です
    • tf.Tensors中間値のためだけです。

スリム&contrib.layers上の注意事項

古いTensorFlow 1.xの大量のコードを使用していますスリムとしてTensorFlow 1.xのでパッケージングしたライブラリー、 tf.contrib.layerscontribモジュール、これもで、TensorFlow 2.0で利用できませんtf.compat.v1 。 TF 2.0にスリムを使用してコードを変換して使用することをリポジトリを変換するよりもより複雑であるv1.layers 。実際には、それはあなたにスリムコードを変換しても意味がありv1.layers Kerasに変換、その後、最初に。

  • 削除arg_scopes 、すべての引数を明示的に指定する必要があります
  • あなたがそれらを使用する場合は、分割normalizer_fnactivation_fn自身の層に
  • 分離CONV層は、1つまたは複数の異なるKeras層(深さ方向、点状、及び分離Keras層)にマップ
  • スリムでv1.layers異なる引数名&デフォルト値を持っています
  • いくつかの引数には、異なるスケールを持っています
  • あなたはスリム事前に訓練されたモデルを使用している場合は、Kerasの事前traimedからモデル試すtf.keras.applicationsまたはTFハブのTF2 SavedModelsがオリジナルスリムコードからエクスポートしました。

いくつかのtf.contrib層がコアTensorFlowに移動されていないかもしれないが、その代わりに移動されたTFのアドオンパッケージ

トレーニング

フィードデータには多くの方法がありますtf.kerasモデルが。彼らは、入力として、Pythonのジェネレータとnumpyの配列を受け入れます。

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

あなたはまだ使用している場合はtf.queue 、これらは今だけのデータ構造として、入力しないパイプラインとしてサポートされています。

データセットの使い方

TensorFlowデータセットパッケージ( tfdsように)ローディング事前定義データセットのためのユーティリティが含まtf.data.Datasetオブジェクト。

この例では、使用して、MNISTdatasetをロードする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方法をお勧めします。これらの方法には関係なく、実装(順次、機能、またはサブ分類)のモデルを訓練する均一なインタフェースを提供します。

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

  • 彼らは、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.5323 - accuracy: 0.5063
Epoch 2/5
5/5 [==============================] - 0s 6ms/step - loss: 0.4105 - accuracy: 0.9219
Epoch 3/5
5/5 [==============================] - 0s 7ms/step - loss: 0.2495 - accuracy: 0.9531
Epoch 4/5
5/5 [==============================] - 0s 6ms/step - loss: 0.1806 - accuracy: 0.9875
Epoch 5/5
5/5 [==============================] - 0s 6ms/step - loss: 0.1416 - accuracy: 0.9937
5/5 [==============================] - 0s 4ms/step - loss: 1.5655 - accuracy: 0.6469
Loss 1.565544605255127, Accuracy 0.6468750238418579

独自のループを書きます

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.122 accuracy: 0.984
train:  loss: 0.133 accuracy: 0.984
train:  loss: 0.164 accuracy: 0.969
train:  loss: 0.167 accuracy: 0.969
train:  loss: 0.161 accuracy: 0.984

eval:  loss: 1.583 accuracy: 0.669
train:  loss: 0.074 accuracy: 1.000
train:  loss: 0.090 accuracy: 1.000
train:  loss: 0.089 accuracy: 1.000
train:  loss: 0.095 accuracy: 1.000
train:  loss: 0.090 accuracy: 1.000

eval:  loss: 1.567 accuracy: 0.747
train:  loss: 0.065 accuracy: 1.000
train:  loss: 0.068 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000
train:  loss: 0.069 accuracy: 1.000
train:  loss: 0.067 accuracy: 1.000

eval:  loss: 1.545 accuracy: 0.772
train:  loss: 0.053 accuracy: 1.000
train:  loss: 0.063 accuracy: 0.984
train:  loss: 0.050 accuracy: 1.000
train:  loss: 0.051 accuracy: 1.000
train:  loss: 0.049 accuracy: 1.000

eval:  loss: 1.520 accuracy: 0.778
train:  loss: 0.049 accuracy: 1.000
train:  loss: 0.046 accuracy: 1.000
train:  loss: 0.044 accuracy: 1.000
train:  loss: 0.045 accuracy: 1.000
train:  loss: 0.044 accuracy: 1.000

eval:  loss: 1.494 accuracy: 0.791

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

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

  1. Pythonのジェネレータ以上反復tf.data.Dataset例のバッチを取得します。
  2. 使用tf.GradientTapeコレクト勾配に。
  3. いずれかを使用tf.keras.optimizersモデルの変数に重みの更新を適用します。

覚えておいてください:

  • 必ず含めるtrainingの引数callサブクラス化層とモデルの方法を。
  • でモデルを呼び出していることを確認してくださいtraining正しく設定引数。
  • モデルは、データのバッチ上で実行されるまで、用途に応じて、モデル変数が存在しない場合があります。
  • 手動でモデルの正則損失のようなものを処理する必要があります。

V1に比べ簡素化の点に注意してください。

  • 変数初期化子を実行する必要はありません。変数は、作成時に初期化されます。
  • 手動制御依存関係を追加する必要はありません。でも中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秒。

損失オブジェクトは呼び出し可能であり、引数として(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.175
  accuracy: 0.994
Epoch:  1
  loss:     0.149
  accuracy: 0.991
Epoch:  2
  loss:     0.133
  accuracy: 0.991
Epoch:  3
  loss:     0.113
  accuracy: 0.997
Epoch:  4
  loss:     0.101
  accuracy: 0.997

Kerasメトリック名

TensorFlowで2.0 kerasモデルは、メトリック名の取り扱いについて詳しくは一貫しています。

今、あなたは、正確な文字列は、メトリックのに使用されていることを、メトリックのリスト内の文字列を渡すときname 。これらの名前はで返さ履歴オブジェクトに表示され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.1076 - acc: 0.9969 - accuracy: 0.9969 - my_accuracy: 0.9969

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

通過前のバージョンから、この異なるmetrics=["accuracy"]をもたらすdict_keys(['loss', 'acc'])

Kerasオプティマイザ

中オプティマイザv1.trainように、 v1.train.AdamOptimizerv1.train.GradientDescentOptimizer 、中に相当していtf.keras.optimizers

変換v1.trainkeras.optimizers

ここにあなたのオプティマイザを変換する際に心に留めておくべきものは以下のとおりです。

いくつかのための新しいデフォルトtf.keras.optimizers

以下のための変更はありませんoptimizers.SGDoptimizers.Adam 、またはoptimizers.RMSprop

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

TensorBoard

TensorFlow 2はへの重要な変更が含まtf.summary TensorBoardで可視化するためのライト要約データに使用するAPIを。新への一般的な概要についてはtf.summary 、ある利用可能ないくつかのチュートリアル TF 2 APIを使用します。これには、 TensorBoard TF 2移行ガイドを

節約&ロード

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

TensorFlow 2.0用途のオブジェクトベースのチェックポイント

あなたが注意している場合、古いスタイルの名前ベースのチェックポイントはやはり、ロードすることができます。コード変換処理は、変数名の変更をもたらす可能性が、回避策があります。

最も簡単なのは、それはチェックポイント内の名前を持つ新しいモデルの名前を並べるへのアプローチ:

  • 変数は、まだすべて持っているnameユーザーが設定できる引数を。
  • Kerasモデルも取るname彼らは、変数の接頭辞として設定されているとして、引数を。
  • v1.name_scope関数は、変数名の接頭辞を設定するために使用することができます。これは非常に異なっているtf.variable_scope 。それは名前だけに影響し、変数&再利用を追跡することはありません。

それはあなたのユースケースのために動作しない場合は、してみてくださいv1.train.init_from_checkpoint機能を。それはとりassignment_map新しい名前に古い名前からのマッピングを指定する引数を、。

TensorFlow推定リポジトリが含ま変換ツール TensorFlow 1.xから2.0に既成の推定のためのチェックポイントをアップグレードするために。これは、類似したユースケースのためのツールを構築する方法の一例として機能することができます。

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

保存されたモデルのための有意な互換性の心配はありません。

  • TensorFlow 2.xではTensorFlow 1.xのsaved_models仕事
  • すべてのオペレーションがサポートされている1.1-場合TensorFlowでTensorFlow 2.xのsaved_models作品。

A Graph.pbまたはGraph.pbtxt

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

あなたは「冷凍グラフ」(持っている場合でも、 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年からインセプションv1のfrozedグラフ、次のとおりです。

 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

 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])

推定量

推定量とトレーニング

推定器はTensorFlow 2.0でサポートされています。

あなたは推定量を使用するときは、使用することができますinput_fn() tf.estimator.TrainSpec 、およびtf.estimator.EvalSpec TensorFlow 1.xのから

ここで使用した例であるinput_fnスペックを評価し、電車で。

input_fnや電車/ 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モデル定義を使用して

TensorFlow 2.0であなたの推定量を構築する方法にはいくつかの違いがあります。

私たちは、あなたがKerasを使用してモデルを定義することをお勧めします、その後、使用tf.keras.estimator.model_to_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/tmpb3_a632k

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

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/python/ops/resource_variable_ops.py:1666: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:1666: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpb3_a632k', '_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/tmpb3_a632k', '_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/tmpb3_a632k/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/tmpb3_a632k/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/tmpb3_a632k/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting from: /tmp/tmpb3_a632k/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/tmpb3_a632k/model.ckpt.

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

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

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

INFO:tensorflow:loss = 2.270717, step = 0

INFO:tensorflow:loss = 2.270717, 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/tmpb3_a632k/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpb3_a632k/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-07-23T01:32:32Z

INFO:tensorflow:Starting evaluation at 2020-07-23T01:32:32Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

INFO:tensorflow:Restoring parameters from /tmp/tmpb3_a632k/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 : 1.01619s

INFO:tensorflow:Inference Time : 1.01619s

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:33

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:33

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.671875, global_step = 25, loss = 1.5162958

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.671875, global_step = 25, loss = 1.5162958

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

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

INFO:tensorflow:Loss for final step: 0.39261085.

INFO:tensorflow:Loss for final step: 0.39261085.

({'accuracy': 0.671875, 'loss': 1.5162958, 'global_step': 25}, [])

カスタム使用model_fn

既存のカスタム推定している場合model_fnあなたは維持する必要があることを、あなたは変換できmodel_fn Kerasモデルを使用します。

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

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

カスタム作成するにmodel_fn既存コードに最小限の変更を好む場合は、TF 2.0での作業を、 tf.compat.v1ような記号optimizersmetrics使用することができます。

カスタムでKerasモデルを使用model_fn 、カスタムトレーニングループでそれを使用するようになります。

  • 設定しtrainingに基づいて、適切な位相をmode引数。
  • 明示的にモデルの合格trainable_variablesオプティマイザに。

しかしに対する重要な違いがあるカスタムループ

  • 代わりに使用するのでは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/tmpjb2yik9a

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

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpjb2yik9a', '_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/tmpjb2yik9a', '_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/tmpjb2yik9a/model.ckpt.

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

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

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

INFO:tensorflow:loss = 2.6231384, step = 0

INFO:tensorflow:loss = 2.6231384, 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/tmpjb2yik9a/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpjb2yik9a/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-07-23T01:32:36Z

INFO:tensorflow:Starting evaluation at 2020-07-23T01:32:36Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

INFO:tensorflow:Restoring parameters from /tmp/tmpjb2yik9a/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 : 1.09900s

INFO:tensorflow:Inference Time : 1.09900s

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:37

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:37

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.621875, global_step = 25, loss = 1.6634324

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.621875, global_step = 25, loss = 1.6634324

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

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

INFO:tensorflow:Loss for final step: 0.56862533.

INFO:tensorflow:Loss for final step: 0.56862533.

({'accuracy': 0.621875, 'loss': 1.6634324, 'global_step': 25}, [])

カスタムmodel_fn TF 2.0シンボルと

あなたはすべてのTF 1.xのシンボルを取り除くと、カスタムアップグレードする場合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/tmppkb1q1hq

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

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmppkb1q1hq', '_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/tmppkb1q1hq', '_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/tmppkb1q1hq/model.ckpt.

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

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

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

INFO:tensorflow:loss = 2.6947184, step = 0

INFO:tensorflow:loss = 2.6947184, 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/tmppkb1q1hq/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmppkb1q1hq/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-07-23T01:32:40Z

INFO:tensorflow:Starting evaluation at 2020-07-23T01:32:40Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

INFO:tensorflow:Restoring parameters from /tmp/tmppkb1q1hq/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 : 1.05743s

INFO:tensorflow:Inference Time : 1.05743s

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:41

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:41

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.784375, global_step = 25, loss = 1.4717665

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.784375, global_step = 25, loss = 1.4717665

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

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

INFO:tensorflow:Loss for final step: 0.5751184.

INFO:tensorflow:Loss for final step: 0.5751184.

({'Accuracy': 0.784375, 'loss': 1.4717665, 'global_step': 25}, [])

既成の推定量

既成の推定量の家族の中でtf.estimator.DNN*tf.estimator.Linear*tf.estimator.DNNLinearCombined*まだ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
  3. optimizerdnn_optimizerlinear_optimizer :このargはに更新されましたtf.keras.optimizersの代わりにtf.compat.v1.train.Optimizer

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

  1. 何のために移行は必要ありませんinput_layer_partitionerので、 Distribution Strategy TF 2.0で自動的に処理します。
  2. loss_reduction 、チェックtf.keras.losses.Reductionサポートオプションについて。
  3. optimizer引数、あなたが通過しない場合optimizerdnn_optimizerまたはlinear_optimizer指定した場合は引数、またはoptimizerとして引数を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 15157  100 15157    0     0  63684      0 --:--:-- --:--:-- --:--:-- 63684

このツールは、ヘルプを組み込みました。

 python checkpoint_converter.py -h
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

このクラスは、保留に簡略化されたintの代わりに、S tf.compat.v1.Dimensionオブジェクト。だから、呼び出す必要はありません.value()取得するint

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

以下はTensorFlow 1.xとTensorFlow 2.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
 

そして、TF 2.0でこれを実行します。

 value = shape[i]
value
 
16

あなたはTF 1.xの中でこれを持っていた場合:

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

そして、TF 2.0でこれを実行します。

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

あなたはTF 1.xの中でこれを持っていた場合(または任意の他の次元のメソッドを使用しました):

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

そして、TF 2.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のデバイスの配置アルゴリズムが大幅に向上しました。これはもはや必要ではないはずです。それを削除すると、パフォーマンスdegredationが発生した場合はバグを報告してください

  • 置き換えv1.ConfigProtoから同等の機能と使用方法をtf.config

結論

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

  1. アップグレードスクリプトを実行します。
  2. contribのシンボルを削除します。
  3. オブジェクト指向型(Keras)にあなたのモデルを切り替えます。
  4. 使用tf.kerasまたはtf.estimator訓練と評価ループどこすることができます。
  5. そうでない場合は、使用するカスタムループを、しかし、セッション&コレクションを避けるようにしてください。

これは、慣用的なTensorFlow 2.0への変換コードにはほとんどの作業がかかりますが、すべての変更の結果で:

  • 少ないコード行。
  • 明快さとシンプルさを増加しました。
  • より簡単なデバッグ。