#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""
Explanation: Copyright 2019 The TensorFlow Authors.
End of explanation
"""


import tensorflow as tf

import numpy as np
import tensorflow_datasets as tfds

"""
Explanation: Keras モデルから Estimator を作成する
<table class="tfo-notebook-buttons" align="left">
  <td><a target="_blank" href="https://www.tensorflow.org/tutorials/estimator/keras_model_to_estimator"><img src="https://www.tensorflow.org/images/tf_logo_32px.png">TensorFlow.org で表示</a></td>
  <td><a target="_blank" href="https://colab.research.google.com/github/tensorflow/docs-l10n/blob/master/site/ja/tutorials/estimator/keras_model_to_estimator.ipynb"><img src="https://www.tensorflow.org/images/colab_logo_32px.png">Google Colab で実行</a></td>
  <td><a target="_blank" href="https://github.com/tensorflow/docs-l10n/blob/master/site/ja/tutorials/estimator/keras_model_to_estimator.ipynb"><img src="https://www.tensorflow.org/images/GitHub-Mark-32px.png">GitHub でソースを表示</a></td>
  <td><a href="https://storage.googleapis.com/tensorflow_docs/docs-l10n/site/ja/tutorials/estimator/keras_model_to_estimator.ipynb"><img src="https://www.tensorflow.org/images/download_logo_32px.png">ノートブックをダウンロード</a></td>
</table>


警告: 新しいコードには Estimators は推奨されません。Estimators は v1.Session スタイルのコードを実行しますが、これは正しく記述するのはより難しく、特に TF 2 コードと組み合わせると予期しない動作をする可能性があります。Estimators は、互換性保証の対象となりますが、セキュリティの脆弱性以外の修正は行われません。詳細については、移行ガイドを参照してください。

概要
TensorFlow Estimator は、TensorFlow でサポートされており、新規または既存の tf.keras モデルから作成することができます。このチュートリアルには、このプロセスの完全な最小限の例が含まれます。
注意: Keras モデルがある場合は、Estimator に変換せずに、直接 tf.distribute ストラテジーで使用することができます。したがって、model_to_estimator は推奨されなくなりました。
セットアップ
End of explanation
"""


model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(16, activation='relu', input_shape=(4,)),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(3)
])

"""
Explanation: 単純な Keras モデルを作成する。
Keras では、レイヤーを組み合わせてモデルを構築します。モデルは（通常）レイヤーのグラフです。最も一般的なモデルのタイプはレイヤーのスタックである tf.keras.Sequential モデルです。
単純で完全に接続されたネットワーク（多層パーセプトロン）を構築するには、以下を実行します。
End of explanation
"""


model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              optimizer='adam')
model.summary()

"""
Explanation: モデルをコンパイルして要約を取得します。
End of explanation
"""


def input_fn():
  split = tfds.Split.TRAIN
  dataset = tfds.load('iris', split=split, as_supervised=True)
  dataset = dataset.map(lambda features, labels: ({'dense_input':features}, labels))
  dataset = dataset.batch(32).repeat()
  return dataset

"""
Explanation: 入力関数を作成する
Datasets API を使用して、大規模なデータセットまたはマルチデバイストレーニングにスケーリングします。
Estimator には、いつどのように入力パイプラインが構築されるのかを制御する必要があります。これを行えるようにするには、"入力関数" または input_fn が必要です。Estimator は引数なしでこの関数を呼び出します。input_fn は、tf.data.Dataset を返す必要があります。
End of explanation
"""


for features_batch, labels_batch in input_fn().take(1):
  print(features_batch)
  print(labels_batch)

"""
Explanation: input_fn をテストします。
End of explanation
"""


import tempfile
model_dir = tempfile.mkdtemp()
keras_estimator = tf.keras.estimator.model_to_estimator(
    keras_model=model, model_dir=model_dir)

"""
Explanation: tf.keras モデルから Estimator を作成する。
tf.keras.Model は、tf.estimator API を使って、tf.keras.estimator.model_to_estimator を持つ tf.estimator.Estimator オブジェクトにモデルを変換することで、トレーニングすることができます。
End of explanation
"""


keras_estimator.train(input_fn=input_fn, steps=500)
eval_result = keras_estimator.evaluate(input_fn=input_fn, steps=10)
print('Eval result: {}'.format(eval_result))

"""
Explanation: Estimator をトレーニングして評価します。
End of explanation
"""


