tensorflow2.x: tf.keras.Model インスタンスを構築するいくつかの方法

説明する

私は tensorflow1.x のユーザーでしたが、当時は tensorflow がまだ keras とマージされておらず、比較的原始的なインターフェイスが多く、セッションやネープスコープなどの概念がありました。最近 tf2.9 に触れて、書き方が変わっていることに気づきましたので、tf2.x の初心者として、最初の経験をいくつか記録します。

tf2.9 のインターフェイスは pytorch に非常に近いことがわかりますが、それでも pytorch ほど使いやすくはありません。チュートリアルでモデルを構築するのは、主に tf.keras.Model をインスタンス化し、それにさまざまな設定を行うことであることがわかりました。tf.keras.Model オブジェクトを同時にインスタンス化するには複数の方法があります。これは「柔軟」ではありません「たったひとつのコツ」を実現するための使いやすい方法はまだないようですが、複数の方法が混在しているのは設計が単純ではないからかもしれません。

tf.keras.Sequential を使用する

tf.keras.models.Sequential は tf.keras.Model を継承しているため、Sequential オブジェクトをインスタンス化することも可能です。Sequential は主に単純な構造の階層型ネットワークに使用され、名前からもわかるように複雑な構造のネットワークを構築することはできません。

インターフェース定義:

tf.keras.Sequential(
    layers=None, name=None
)

初期化中に 2 つのパラメータを渡すことができます。1 つ目はネットワーク層のリストで、2 つ目は名前です。
同時に tf.keras.models.Sequential はそのエイリアスでもあります。

方法 1: パラメータの初期化を構築する

チュートリアルの例:

import tensorflow as tf

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

モデルを形成するために、複数のレイヤー オブジェクトがここに渡されます。これは比較的簡単な方法です。

方法 2: add() を使用してレイヤーを増やす

構築中にパラメータは渡されず、構築後に追加インターフェイスを使用してレイヤーを追加できます。

model = tf.keras.Sequential()
model.add(tf.keras.Input(shape=(16,)))
model.add(tf.keras.layers.Dense(8))
model.add(tf.keras.layers.Dense(4))

ここでは2層の完全接続ネットワークが構築されます。

tf.keras.Model インスタンスを構築する

Sequential では単純なネットワークしか構築できないため、内部に複雑な構造がある場合は tf.keras.Model 構造体を直接使用する必要があります。

方法 3: tf.keras.Model クラスを継承する

これは最も pytorch らしい方法でもあります。主なことは、call() 関数、そのプロトタイプを実装することです。

call(
    inputs, training=None, mask=None
)

チュートリアルの例:

class MyModel(tf.keras.Model):
  def __init__(self):
    super(MyModel, self).__init__()
    self.conv1 = Conv2D(32, 3, activation='relu')
    self.flatten = Flatten()
    self.d1 = Dense(128, activation='relu')
    self.d2 = Dense(10, activation='softmax')

  def call(self, x):
    x = self.conv1(x)
    x = self.flatten(x)
    x = self.d1(x)
    return self.d2(x)
model = MyModel()

複数の入出力の場合、[inoput1, input2] で入力を渡し、[out1, out2] で出力を返すことができます。

方法 4: tf.keras.Model インスタンスを直接構築する

単一入出力ネットワークを構築する最も簡単な方法は次のとおりです。

inputs = tf.keras.layers.Input(shape=(3,))
outputs = tf.keras.layers.Dense(2)(inputs)
model = tf.keras.models.Model(inputs=inputs, outputs=outputs)

複数の入出力を持つネットワークも構築できます。以下に 2 つの出力の例を示します。

inputs = tf.keras.layers.Input(shape=(3,))
d = tf.keras.layers.Dense(2, name='out')
output_1 = d(inputs)
output_2 = d(inputs)
model = tf.keras.models.Model(
   inputs=inputs, outputs=[output_1, output_2])

参考文献

TensorFlow 公式中国語チュートリアル

Tensorflow2 クラスの複数入力演算

Tensorflow2.0 keras 機能の複数入力複数出力

おすすめ

転載: blog.csdn.net/yuanlulu/article/details/126500997