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

モジュール、レイヤー、モデルの紹介

TensorFlow.orgで見る Google Colabで実行 GitHubでソースを表示する ノートブックをダウンロード

TensorFlowを機械学習するには、モデルを定義、保存、復元する必要がある場合があります。

モデルは抽象的に:

  • テンソルで何かを計算する関数( フォワードパス
  • トレーニングに応じて更新できるいくつかの変数

このガイドでは、Kerasの表面の下に行き、TensorFlowモデルがどのように定義されているかを確認します。これは、TensorFlowが変数とモデルを収集する方法と、それらがどのように保存および復元されるかを調べます。

セットアップ

import tensorflow as tf
from datetime import datetime

%load_ext tensorboard

TensorFlowでのモデルとレイヤーの定義

ほとんどのモデルはレイヤーで構成されています。レイヤーは、再利用可能で、トレーニング可能な変数を持つ、既知の数学構造を持つ関数です。 TensorFlowでは、KerasやSonnetなどのレイヤーとモデルのほとんどの高レベル実装は、同じ基本クラスであるtf.Moduleて構築されています。

以下は、スカラーテンソルで動作する非常に単純なtf.Module例です。

class SimpleModule(tf.Module):
  def __init__(self, name=None):
    super().__init__(name=name)
    self.a_variable = tf.Variable(5.0, name="train_me")
    self.non_trainable_variable = tf.Variable(5.0, trainable=False, name="do_not_train_me")
  def __call__(self, x):
    return self.a_variable * x + self.non_trainable_variable

simple_module = SimpleModule(name="simple")

simple_module(tf.constant(5.0))
<tf.Tensor: shape=(), dtype=float32, numpy=30.0>

モジュールと、ひいてはレイヤーは、「オブジェクト」のディープラーニング用語です。これらには、内部状態と、その状態を使用するメソッドがあります。

Python callableのように動作することを除いて、 __ __call__について特別なことは何もありません。好きな機能でモデルを呼び出すことができます。

微調整中のレイヤーと変数のフリーズなど、何らかの理由で変数のトレーニング可能性をオンまたはオフに設定できます。

tf.Moduleサブクラスtf.Moduleことにより、このオブジェクトのプロパティに割り当てられたtf.Variableまたはtf.Moduleインスタンスが自動的に収集されます。これにより、変数を保存およびロードしたり、 tf.Moduleのコレクションを作成したりできます。

# All trainable variables
print("trainable variables:", simple_module.trainable_variables)
# Every variable
print("all variables:", simple_module.variables)
trainable variables: (<tf.Variable 'train_me:0' shape=() dtype=float32, numpy=5.0>,)
all variables: (<tf.Variable 'train_me:0' shape=() dtype=float32, numpy=5.0>, <tf.Variable 'do_not_train_me:0' shape=() dtype=float32, numpy=5.0>)

これは、モジュールで作成された2層線形層モデルの例です。

まず、密な(線形)レイヤー:

class Dense(tf.Module):
  def __init__(self, in_features, out_features, name=None):
    super().__init__(name=name)
    self.w = tf.Variable(
      tf.random.normal([in_features, out_features]), name='w')
    self.b = tf.Variable(tf.zeros([out_features]), name='b')
  def __call__(self, x):
    y = tf.matmul(x, self.w) + self.b
    return tf.nn.relu(y)

次に、2つのレイヤーインスタンスを作成して適用する完全なモデル。

class SequentialModule(tf.Module):
  def __init__(self, name=None):
    super().__init__(name=name)

    self.dense_1 = Dense(in_features=3, out_features=3)
    self.dense_2 = Dense(in_features=3, out_features=2)

  def __call__(self, x):
    x = self.dense_1(x)
    return self.dense_2(x)

# You have made a model!
my_model = SequentialModule(name="the_model")

# Call it, with random results
print("Model results:", my_model(tf.constant([[2.0, 2.0, 2.0]])))
Model results: tf.Tensor([[0.        0.4145088]], shape=(1, 2), dtype=float32)

tf.Moduleインスタンスは自動的に収集、recusively、あらゆるますtf.Variableまたはtf.Moduleインスタンスは、それに割り当てられています。これにより、単一のモデルインスタンスでtf.Moduleのコレクションを管理し、モデル全体を保存およびロードできます。

print("Submodules:", my_model.submodules)

Submodules: (<__main__.Dense object at 0x7fbf9e6919b0>, <__main__.Dense object at 0x7fbfb1f266a0>)

for var in my_model.variables:
  print(var, "\n")
<tf.Variable 'b:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)> 

<tf.Variable 'w:0' shape=(3, 3) dtype=float32, numpy=
array([[ 1.8794332 ,  0.25367785, -1.5451777 ],
       [-0.7285093 ,  0.4250832 , -0.90914494],
       [-0.35409355, -1.463105  ,  0.27016956]], dtype=float32)> 

<tf.Variable 'b:0' shape=(2,) dtype=float32, numpy=array([0., 0.], dtype=float32)> 

<tf.Variable 'w:0' shape=(3, 2) dtype=float32, numpy=
array([[-0.20271134,  0.26009855],
       [ 0.49689794, -2.9020948 ],
       [-0.91616786, -0.7842423 ]], dtype=float32)> 


変数の作成を待機しています

レイヤーの入力サイズと出力サイズの両方を定義する必要があることに気づいたかもしれません。これは、 w変数が既知の形状を持ち、割り当てることができるようにするためです。

変数の作成を特定の入力形状でモジュールが初めて呼び出されるまで延期することにより、事前に入力サイズを指定する必要がありません。

class FlexibleDenseModule(tf.Module):
  # Note: No need for `in+features`
  def __init__(self, out_features, name=None):
    super().__init__(name=name)
    self.is_built = False
    self.out_features = out_features

  def __call__(self, x):
    # Create variables on first call.
    if not self.is_built:
      self.w = tf.Variable(
        tf.random.normal([x.shape[-1], self.out_features]), name='w')
      self.b = tf.Variable(tf.zeros([self.out_features]), name='b')
      self.is_built = True

    y = tf.matmul(x, self.w) + self.b
    return tf.nn.relu(y)
# Used in a module
class MySequentialModule(tf.Module):
  def __init__(self, name=None):
    super().__init__(name=name)

    self.dense_1 = FlexibleDenseModule(out_features=3)
    self.dense_2 = FlexibleDenseModule(out_features=2)

  def __call__(self, x):
    x = self.dense_1(x)
    return self.dense_2(x)

my_model = MySequentialModule(name="the_model")
print("Model results:", my_model(tf.constant([[2.0, 2.0, 2.0]])))
Model results: tf.Tensor([[0. 0.]], shape=(1, 2), dtype=float32)

この柔軟性により、TensorFlowレイヤーは、入力サイズと出力サイズの両方ではなく、出力の形状( tf.keras.layers.Denseなど)のみを指定する必要があることがよくあります。

重量の節約

tf.ModuleチェックポイントSavedModelの両方として保存できます。

チェックポイントは単なる重み(つまり、モジュールとそのサブモジュール内の変数のセットの値)です。

chkp_path = "my_checkpoint"
checkpoint = tf.train.Checkpoint(model=my_model)
checkpoint.write(chkp_path)
checkpoint.write(chkp_path)
'my_checkpoint'

チェックポイントは、2種類のファイル、つまりデータ自体と、メタデータのインデックスファイルで構成されます。インデックスファイルは実際に保存されているものとチェックポイントの番号を追跡しますが、チェックポイントデータには変数値とその属性ルックアップパスが含まれます。

ls my_checkpoint*
my_checkpoint.data-00000-of-00001  my_checkpoint.index

チェックポイントの内部を調べて、変数のコレクション全体が保存されていることを確認し、それらを含むPythonオブジェクトでソートできます。

tf.train.list_variables(chkp_path)
[('_CHECKPOINTABLE_OBJECT_GRAPH', []),
 ('model/dense_1/b/.ATTRIBUTES/VARIABLE_VALUE', [3]),
 ('model/dense_1/w/.ATTRIBUTES/VARIABLE_VALUE', [3, 3]),
 ('model/dense_2/b/.ATTRIBUTES/VARIABLE_VALUE', [2]),
 ('model/dense_2/w/.ATTRIBUTES/VARIABLE_VALUE', [3, 2])]

分散(マルチマシン)トレーニング中にそれらをシャーディングすることができるため、番号が付けられます(例: '00000-of-00001')。ただし、この場合、シャードは1つしかありません。

モデルを再度読み込むと、Pythonオブジェクトの値が上書きされます。

new_model = MySequentialModule()
new_checkpoint = tf.train.Checkpoint(model=new_model)
new_checkpoint.restore("my_checkpoint")

# Should be the same result as above
new_model(tf.constant([[2.0, 2.0, 2.0]]))
<tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[0., 0.]], dtype=float32)>

関数の保存

TensorFlow ServingTensorFlow Liteに見られるように、 TensorFlow Hubからトレーニング済みモデルをダウンロードする場合でも、 TensorFlowは元のPythonオブジェクトなしでモデルを実行できます。

TensorFlowは、Pythonで記述された計算を行う方法を知っている必要がありますが、元のコードは必要ありません。これを行うには、前のガイドで説明したグラフを作成します

このグラフには、関数を実装する操作またはopsが含まれています。

上記のモデルでグラフを定義するには、 @tf.functionデコレーターを追加して、このコードをグラフとして実行する必要があることを示します。

class MySequentialModule(tf.Module):
  def __init__(self, name=None):
    super().__init__(name=name)

    self.dense_1 = Dense(in_features=3, out_features=3)
    self.dense_2 = Dense(in_features=3, out_features=2)

  @tf.function
  def __call__(self, x):
    x = self.dense_1(x)
    return self.dense_2(x)

# You have made a model with a graph!
my_model = MySequentialModule(name="the_model")

作成したモジュールは、以前とまったく同じように機能します。関数に渡される一意のシグネチャごとに、個別のグラフが作成されます。詳細については、グラフガイドを参照してください。

print(my_model([[2.0, 2.0, 2.0]]))
print(my_model([[[2.0, 2.0, 2.0], [2.0, 2.0, 2.0]]]))
tf.Tensor([[0.        0.3236845]], shape=(1, 2), dtype=float32)
tf.Tensor(
[[[0.        0.3236845]
  [0.        0.3236845]]], shape=(1, 2, 2), dtype=float32)

TensorBoardサマリー内でトレースすることにより、グラフを視覚化できます。

# Set up logging.
stamp = datetime.now().strftime("%Y%m%d-%H%M%S")
logdir = "logs/func/%s" % stamp
writer = tf.summary.create_file_writer(logdir)

# Create a new model to get a fresh trace
# Otherwise the summary will not see the graph.
new_model = MySequentialModule()

# Bracket the function call with
# tf.summary.trace_on() and tf.summary.trace_export().
tf.summary.trace_on(graph=True, profiler=True)
# Call only one tf.function when tracing.
z = print(new_model(tf.constant([[2.0, 2.0, 2.0]])))
with writer.as_default():
  tf.summary.trace_export(
      name="my_func_trace",
      step=0,
      profiler_outdir=logdir)
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/summary_ops_v2.py:1203: start (from tensorflow.python.eager.profiler) is deprecated and will be removed after 2020-07-01.
Instructions for updating:
use `tf.profiler.experimental.start` instead.
tf.Tensor([[0. 0.]], shape=(1, 2), dtype=float32)
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/summary_ops_v2.py:1259: stop (from tensorflow.python.eager.profiler) is deprecated and will be removed after 2020-07-01.
Instructions for updating:
use `tf.profiler.experimental.stop` instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/summary_ops_v2.py:1259: save (from tensorflow.python.eager.profiler) is deprecated and will be removed after 2020-07-01.
Instructions for updating:
`tf.python.eager.profiler` has deprecated, use `tf.profiler` instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/eager/profiler.py:151: maybe_create_event_file (from tensorflow.python.eager.profiler) is deprecated and will be removed after 2020-07-01.
Instructions for updating:
`tf.python.eager.profiler` has deprecated, use `tf.profiler` instead.

結果のトレースを表示するには、テンソルボードを起動します。

%tensorboard --logdir logs/func

テンソルボードのグラフのスクリーンショット

SavedModel作成

完全にトレーニングされたモデルを共有するための推奨される方法は、 SavedModelを使用することSavedModelSavedModelは、関数のコレクションと重みのコレクションの両方が含まれています。

作成したモデルを保存できます。

tf.saved_model.save(my_model, "the_saved_model")
INFO:tensorflow:Assets written to: the_saved_model/assets

# Inspect the in the directory
!ls -l the_saved_model
total 24
drwxr-sr-x 2 kbuilder kokoro  4096 Sep 10 01:35 assets
-rw-rw-r-- 1 kbuilder kokoro 12617 Sep 10 01:35 saved_model.pb
drwxr-sr-x 2 kbuilder kokoro  4096 Sep 10 01:35 variables

# The variables/ directory contains a checkpoint of the variables 
!ls -l the_saved_model/variables
total 8
-rw-rw-r-- 1 kbuilder kokoro 408 Sep 10 01:35 variables.data-00000-of-00001
-rw-rw-r-- 1 kbuilder kokoro 356 Sep 10 01:35 variables.index

saved_model.pbファイルは、機能的なtf.Graphを記述するプロトコルバッファー tf.Graph

モデルとレイヤーは、実際にそれを作成したクラスのインスタンスを作成せずに、この表現からロードできます。これは、大規模なサービスやエッジデバイスでの提供など、Pythonインタープリターがない(または必要がない)状況、または元のPythonコードが利用できない、または実用的でない状況で必要になります。

モデルを新しいオブジェクトとしてロードできます。

new_model = tf.saved_model.load("the_saved_model")

new_model 、保存されたモデルをロードから作成され、内部TensorFlowユーザオブジェクトは、クラスの知識の任意なし、です。タイプSequentialModuleはありません。

isinstance(new_model, SequentialModule)
False

この新しいモデルは、定義済みの入力シグネチャで機能します。このように復元されたモデルに署名を追加することはできません。

print(my_model([[2.0, 2.0, 2.0]]))
print(my_model([[[2.0, 2.0, 2.0], [2.0, 2.0, 2.0]]]))
tf.Tensor([[0.        0.3236845]], shape=(1, 2), dtype=float32)
tf.Tensor(
[[[0.        0.3236845]
  [0.        0.3236845]]], shape=(1, 2, 2), dtype=float32)

したがって、 SavedModelを使用すると、 SavedModelを使用してTensorFlowの重みとグラフをtf.Module 、それらを再度読み込むことができます。

Kerasモデルとレイヤー

この時点まで、Kerasについての言及はありません。独自の高レベルAPIをtf.Module上に構築できます。

このセクションでは、 tf.Moduleをどのように使用するかを調べます。 Kerasモデルの完全なユーザーガイドは、 Kerasガイドにあります。

ケラス層

tf.keras.layers.Layerはすべてのtf.keras.layers.Layerの基本クラスであり、 tf.Moduleから継承しtf.Module

親を交換し、 __call__call変更するだけで、モジュールをKerasレイヤーに変換できcall

class MyDense(tf.keras.layers.Layer):
  # Adding **kwargs to support base Keras layer arguemnts
  def __init__(self, in_features, out_features, **kwargs):
    super().__init__(**kwargs)

    # This will soon move to the build step; see below
    self.w = tf.Variable(
      tf.random.normal([in_features, out_features]), name='w')
    self.b = tf.Variable(tf.zeros([out_features]), name='b')
  def call(self, x):
    y = tf.matmul(x, self.w) + self.b
    return tf.nn.relu(y)

simple_layer = MyDense(name="simple", in_features=3, out_features=3)

Kerasレイヤーには独自の__call__があり、次のセクションで説明する記帳を行い、次にcall()呼び出しcall() 。機能に変更はありません。

simple_layer([[2.0, 2.0, 2.0]])
<tf.Tensor: shape=(1, 3), dtype=float32, numpy=array([[1.8125846, 0.       , 0.       ]], dtype=float32)>

buildステップ

前述のように、多くの場合、入力形状が確実になるまで変数の作成を待機するのが便利です。

Kerasレイヤーには追加のライフサイクル手順があり、レイヤーの定義方法をさらに柔軟にできます。これは、 build()関数で定義されています。

buildは1回だけ呼び出され、入力の形状とともに呼び出されます。通常、変数(重み)を作成するために使用されます。

上記のMyDenseレイヤーは、その入力のサイズに合わせて柔軟に書き換えることができます。

class FlexibleDense(tf.keras.layers.Layer):
  # Note the added `**kwargs`, as Keras supports many arguments
  def __init__(self, out_features, **kwargs):
    super().__init__(**kwargs)
    self.out_features = out_features

  def build(self, input_shape):  # Create the state of the layer (weights)
    self.w = tf.Variable(
      tf.random.normal([input_shape[-1], self.out_features]), name='w')
    self.b = tf.Variable(tf.zeros([self.out_features]), name='b')

  def call(self, inputs):  # Defines the computation from inputs to outputs
    return tf.matmul(inputs, self.w) + self.b

# Create the instance of the layer
flexible_dense = FlexibleDense(out_features=3)

この時点では、モデルは作成されていないため、変数はありません。

flexible_dense.variables
[]

関数を呼び出すと、適切なサイズの変数が割り当てられます。

# Call it, with predictably random results
print("Model results:", flexible_dense(tf.constant([[2.0, 2.0, 2.0], [3.0, 3.0, 3.0]])))
Model results: tf.Tensor(
[[  1.9751439   -0.52345586  -6.757321  ]
 [  2.962716    -0.78518367 -10.135981  ]], shape=(2, 3), dtype=float32)

flexible_dense.variables
[<tf.Variable 'flexible_dense/w:0' shape=(3, 3) dtype=float32, numpy=
 array([[-1.3283044 ,  0.4407923 , -1.0344194 ],
        [ 0.2887298 ,  0.7995425 , -3.0122824 ],
        [ 2.0271466 , -1.5020627 ,  0.66804147]], dtype=float32)>,
 <tf.Variable 'flexible_dense/b:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>]

buildは1回しか呼び出されないため、入力形状がレイヤーの変数と互換性がない場合、入力は拒否されます。

try:
  print("Model results:", flexible_dense(tf.constant([[2.0, 2.0, 2.0, 2.0]])))
except tf.errors.InvalidArgumentError as e:
  print("Failed:", e)
Failed: Matrix size-incompatible: In[0]: [1,4], In[1]: [3,3] [Op:MatMul]

Kerasレイヤーには、次のような追加機能があります。

  • オプションの損失
  • メトリックのサポート
  • トレーニングと推論の使用を区別するためのオプションのtraining引数の組み込みサポート
  • get_configメソッドとfrom_configメソッド。構成を正確に保存して、Pythonでモデルのクローンを作成できます。

カスタムレイヤーの完全ガイドでそれらについてお読みください。

Kerasモデル

ネストされたKerasレイヤーとしてモデルを定義できます。

ただし、 tf.keras.Modelと呼ばれるフル機能のモデルクラスも提供します。これはtf.keras.layers.Layer継承しているため、 tf.keras.layers.Layerモデルはtf.keras.layers.Layerレイヤーであり、同じ方法で使用、ネスト、保存できます。 Kerasモデルには、複数のマシンでのトレーニング、評価、ロード、保存、さらにはトレーニングを容易にする追加機能が付属しています。

上と同じコードでSequentialModuleを定義し、再び__call__call()変換して親を変更できます。

class MySequentialModel(tf.keras.Model):
  def __init__(self, name=None, **kwargs):
    super().__init__(**kwargs)

    self.dense_1 = FlexibleDense(out_features=3)
    self.dense_2 = FlexibleDense(out_features=2)
  def call(self, x):
    x = self.dense_1(x)
    return self.dense_2(x)

# You have made a Keras model!
my_sequential_model = MySequentialModel(name="the_model")

# Call it on a tensor, with random results
print("Model results:", my_sequential_model(tf.constant([[2.0, 2.0, 2.0]])))

Model results: tf.Tensor([[-3.680038   1.2085412]], shape=(1, 2), dtype=float32)

追跡変数やサブモジュールなど、同じ機能をすべて利用できます。

my_sequential_model.variables
[<tf.Variable 'my_sequential_model/flexible_dense_1/w:0' shape=(3, 3) dtype=float32, numpy=
 array([[ 0.5388254 , -2.268109  , -0.34042016],
        [-1.1464697 ,  0.04621376,  0.6316701 ],
        [ 0.22427997,  1.975861  , -1.3573155 ]], dtype=float32)>,
 <tf.Variable 'my_sequential_model/flexible_dense_1/b:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>,
 <tf.Variable 'my_sequential_model/flexible_dense_2/w:0' shape=(3, 2) dtype=float32, numpy=
 array([[-0.5662819 ,  1.154388  ],
        [ 2.1547215 , -0.71875423],
        [ 1.4323472 , -0.81606954]], dtype=float32)>,
 <tf.Variable 'my_sequential_model/flexible_dense_2/b:0' shape=(2,) dtype=float32, numpy=array([0., 0.], dtype=float32)>]
my_sequential_model.submodules
(<__main__.FlexibleDense at 0x7fbffc7c2cf8>,
 <__main__.FlexibleDense at 0x7fbffc7c2f98>)

tf.keras.Modelオーバーライドは、TensorFlowモデルを構築するための非常にPython的なアプローチです。他のフレームワークからモデルを移行する場合、これは非常に簡単です。

既存のレイヤーと入力の単純な組み合わせであるモデルを構築する場合は、モデルの再構築とアーキテクチャに関する追加機能を備えた機能APIを使用して時間とスペースを節約できます。

以下は、機能APIを使用した同じモデルです。

inputs = tf.keras.Input(shape=[3,])

x = FlexibleDense(3)(inputs)
x = FlexibleDense(2)(x)

my_functional_model = tf.keras.Model(inputs=inputs, outputs=x)

my_functional_model.summary()
Model: "functional_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 3)]               0         
_________________________________________________________________
flexible_dense_3 (FlexibleDe (None, 3)                 12        
_________________________________________________________________
flexible_dense_4 (FlexibleDe (None, 2)                 8         
=================================================================
Total params: 20
Trainable params: 20
Non-trainable params: 0
_________________________________________________________________

my_functional_model(tf.constant([[2.0, 2.0, 2.0]]))
<tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[-0.70818764, -4.2403307 ]], dtype=float32)>

ここでの主な違いは、入力形状が機能構築プロセスの一部として前もって指定されていることです。この場合のinput_shape引数は、完全に指定する必要はありません。一部のディメンションはNoneままにすることができます。

Kerasモデルの保存

Kerasモデルにはチェックポイントを設定でき、これはtf.Moduleと同じようにtf.Moduleます。

Kerasモデルはモジュールであるため、 tf.saved_models.save()でも保存できます。ただし、Kerasモデルには便利なメソッドやその他の機能があります。

my_sequential_model.save("exname_of_file")
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: 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/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) 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:Assets written to: exname_of_file/assets

簡単に、それらを元に戻すことができます。

reconstructed_model = tf.keras.models.load_model("exname_of_file")
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.

SavedModelsは、メトリック、損失、およびオプティマイザの状態も保存します。

この再構築されたモデルは使用でき、同じデータで呼び出されたときに同じ結果を生成します。

reconstructed_model(tf.constant([[2.0, 2.0, 2.0]]))
<tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[-3.680038 ,  1.2085412]], dtype=float32)>

機能をサポートするためのカスタムレイヤーの構成方法の提供など、Kerasモデルの保存とシリアル化については、他にも知っておくべきことがあります。 保存とシリアル化ガイドを確認してください

次は何ですか

Kerasの詳細を知りたい場合は、既存のKerasガイドに従ってください

tf.module上に構築された高レベルAPIのもう1つの例は、DeepMindのSonnetであり、 同社のサイトで取り上げられています