Keras でニューラル ネットワーク モデルを開発および構築する 3 つの主流の方法 (シーケンス モデル、関数モデル、サブクラス モデル) を要約して記録します。

Keras は、Python 言語に基づいて開発された、使いやすく強力なニューラル ネットワーク モデリング ライブラリです。Keras は、分類、回帰、その他のタスクのいずれであっても、ユーザーがニューラル ネットワーク モデルを簡単に定義してトレーニングできるようにする高レベルの API を提供します。

Keras の主な機能は次のとおりです。

  1. シンプルで使いやすい: Keras の設計コンセプトはユーザーフレンドリーで、シンプルで一貫した API を提供するため、モデルの構築、トレーニング、評価、デプロイメントが非常に簡単になります。低レベルのコードを大量に記述する必要はなく、モデルをすぐに実装できます。

  2. 複数のバックエンドのサポート: Keras は、TensorFlow、Theano、CNTK などの複数の深層学習バックエンドをサポートします。ユーザーは、モデル開発のニーズに応じて適切なバックエンドを選択できます。Keras は TensorFlow バージョン 2.0 に組み込まれ、その公式の高レベル API になりました。

  3. 複数のモデリング メソッド: Keras は、シーケンス モデル (Sequential Model)、関数モデル (Functional Model)、サブクラス化モデル (Subclassing Model) など、さまざまなモデリング メソッドを提供します。単純な線形モデルから複雑な非線形モデルまで、ニーズに応じて適切なモデリング手法を選択できます。

  4. 多数の事前定義された層とモデル: Keras は豊富な事前定義された層 (たとえば、全結合層、畳み込み層、プーリング層など) とモデル (たとえば、VGG、ResNet など) を提供します。直接使用して、モデル開発をスピードアップします。

  5. カスタム層と損失関数のサポート: Keras はユーザー定義の層と損失関数をサポートしており、ユーザーは自分のニーズに応じて特定の層や損失関数をカスタマイズし、他の事前定義された層や損失関数と組み合わせることができます。

以前に私のブログ投稿を参照したことがある場合は、基本的に私のプロジェクトの 90% が keras+Tensorflow に基づいて構築されており、PyTorch に基づいた関連プロジェクトの開発実践はそれほど多くないことを知っているはずです。これは、私が最初にディープ ラーニングに興味を持ったためです。若い頃に Tensorflow に触れたので、体系的に整理して比較してみたいと思います。

この記事では、最もよく知られている keras から始めて、keras を使用してモデルを構築する主流の方法を体系的にまとめ、レビューします。Keras は、シーケンス モデル、関数モデル、サブクラス モデルという 3 つの主要なモデリング メソッドを提供します。それぞれの方法については、以下で詳しく説明します。

1. シーケンシャル モデル:
   シーケンス モデルは、Keras で最も単純なモデリング手法であり、レイヤーを順番に積み重ねることによってニューラル ネットワーク モデルを構築します。各層間には入力と出力が 1 つだけあります。この方法は、単純な線形スタッキング モデルまたは入力/出力が 1 つだけのモデルに適しています。
   シーケンス モデルのモデリング手順は次のとおりです。
   - `Sequential` クラスと使用するレイヤー (たとえば、`Dense`、`Conv2D`、`MaxPooling2D` など) をインポートします。
   - `Sequential` クラスを使用してモデル インスタンスを作成します。
   - モデル インスタンスの `add` メソッドを呼び出して、モデルにレイヤーを段階的に追加します。
   - `compile` メソッドを使用して、モデルのオプティマイザー、損失関数、および評価メトリクスを構成します。
   - `fit` メソッドを使用してモデルをトレーニングします。
   - `evaluate` メソッドを使用してモデルを評価します。

残留接続やマルチブランチ構造などの特別なネットワーク リンクを持たない比較的基本的なモデルを構築する場合、この方法は間違いなく最初の選択肢となるでしょう。非常にシンプルで理解しやすいです。今までは、keras は非常に優れていると思います。ここでは、Mnist データセットを例として、実装例を示します。

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 数据预处理
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)

# -----------------------------
# 使用序列模型建立模型
model = Sequential([
    Dense(64, activation='relu', input_shape=(784,)),
    Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))

# 模型评估
test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test Accuracy:', test_acc)


2. 機能モデル:
   機能モデルは、複数の入力と複数の出力を備えたモデルや、レイヤー共有やスキップ接続を含む複雑なモデルの構築を可能にする、より柔軟なモデリング方法です。非線形モデル構造は、レイヤー間に明示的なデータ フロー グラフを作成することで構築できます。
   関数モデルのモデリング手順は次のとおりです。
   - `Model` クラスと使用するレイヤー (たとえば、`Input`、`Conv2D`、`MaxPooling2D` など) をインポートします。
   - モデルの入力テンソル (`Input`) を作成し、その入力に接続する必要がある層にそれを渡します。
   - 各層の出力を次の層の入力に接続してモデルを構築します。
   - `Model` クラスを使用してモデルの入力と出力を指定し、モデル インスタンスを作成します。
   - `compile` メソッドを使用して、モデルのオプティマイザー、損失関数、および評価メトリクスを構成します。
   - `fit` メソッドを使用してモデルをトレーニングします。
   - `evaluate` メソッドを使用してモデルを評価します。

私は普段この方法をよく使いますが、簡単にまとめると、 シーケンスモデルで完成できる関数モデルは完成する 関数モデルで完成できるシーケンスモデルは完成しないかもしれない ということになります。主流をマスターしたい場合は、関数モデルを直接選択できます。古典的な残差ネットワーク、マルチブランチ ネットワーク構造などはすべて関数モデルに基づいて構築されます。ここでは、Mnist データセットを例としてコード例を示します。

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 数据预处理
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)


# 使用函数式模型建立模型
inputs = tf.keras.Input(shape=(784,))
x = Dense(64, activation='relu')(inputs)
outputs = Dense(10, activation='softmax')(x)

model = tf.keras.Model(inputs=inputs, outputs=outputs)

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))

test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test Accuracy:', test_acc)


3. サブクラス化モデル:
   サブクラス化モデルは、Python の継承メカニズムを使用してモデルを構築する方法であり、非常に高い柔軟性を提供し、必要に応じて順伝播ロジックと逆伝播ロジックをカスタマイズできます。モデル構築プロセスは、`Model` クラスから継承するサブクラスを作成することで完全にカスタマイズできます。
   サブクラス モデルのモデリング手順は次のとおりです。
   - `Model` クラスと使用するレイヤー (たとえば、`Dense`、`Conv2D`、`MaxPooling2D` など) をインポートします。
   - `Model` クラスを継承するサブクラスを作成し、クラスの `__init__` メソッドを定義し、モデル層と変数をインスタンス化します。
   - モデルの順伝播ロジックを実装するために、サブクラスで `call` メソッドを定義します。
   - モデルのインスタンスを作成します。
   - `compile` メソッドを使用して、モデルのオプティマイザー、損失関数、および評価メトリクスを構成します。
   - `fit` メソッドを使用してモデルをトレーニングします。
   - `evaluate` メソッドを使用してモデルを評価します。

この方法の使用頻度の主な理由は、実装が比較的複雑であることと、モデルの保存にまだ問題があるため、私にとってこのサブクラス モデル構築方法自体の使用頻度は 2 です。ここでは、Mnist データ セットを例としてコード例を示します。

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 数据预处理
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)


# 使用子类模型建立模型
class MyModel(tf.keras.Model):
    def __init__(self):
        super(MyModel, self).__init__()
        self.dense1 = Dense(64, activation='relu')
        self.dense2 = Dense(10, activation='softmax')

    def call(self, inputs):
        x = self.dense1(inputs)
        outputs = self.dense2(x)
        return outputs

model = MyModel()

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))

test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test Accuracy:', test_acc)

おすすめ

転載: blog.csdn.net/Together_CZ/article/details/132426338