TensorFlow を使用して画像分類モデルをトレーニングするためのガイド

PHPz
リリース: 2023-04-13 17:13:03
転載
1213 人が閲覧しました

翻訳者 | チェン・ジュン

レビュアー|孫樹娟

ご存知のとおり、人間は幼い頃から見たものを識別し、ラベルを付けることを学びます。現在、機械学習と深層学習アルゴリズムの継続的な反復により、コンピューターはキャプチャされた画像を大規模かつ非常に高い精度で分類できるようになりました。現在、このような高度なアルゴリズムのアプリケーション シナリオには、肺スキャン画像を解釈して健康かどうかを判断すること、モバイル デバイスを介して顔認識を実行すること、小売業者向けにさまざまなタイプの消費者オブジェクトを区別することが含まれます。

以下では、コンピューター ビジョンのアプリケーションである画像分類について説明し、TensorFlow を使用して小さな画像データ セットでモデルをトレーニングする方法を徐々に示します。

1. データセットとターゲット

この例では、0 から 9 までの数字画像の MNIST データセットを使用します。その形状は次の図に示されているとおりです。

TensorFlow を使用して画像分類モデルをトレーニングするためのガイド

このモデルをトレーニングする目的は、画像をそれぞれのラベルに分類することです。つまり、画像は互いに対応しています。 Numbers オフィスの上の図。通常、ディープ ニューラル ネットワーク アーキテクチャは、モデルをトレーニングするための入力、出力、2 つの隠れ層 (隠れ層)、およびドロップアウト層を提供します。 CNN (畳み込みニューラル ネットワーク) は、大きな画像を識別するための最初の選択肢であり、入力量を減らしながら関連情報を取得できます。

2. 準備作業

まず、TensorFlow、to_categorical (数値クラス値を他のカテゴリに変換するために使用)、Sequential、Flatten、Dense、およびビルドに使用する関数を渡します。関連するすべてのコード ライブラリをインポートするためのアーキテクチャのニューラル ネットワーク ドロップアウト。ここで説明したコード ライブラリの中には、少し馴染みのないものもあります。以下で詳しく説明します。

3. ハイパーパラメータ

  • 次の側面から正しいハイパーパラメータのセットを選択します:

  • まず、定義しましょう開始点としていくつかのハイパーパラメータを使用します。後で、さまざまなニーズに合わせて調整できます。ここでは、小さいバッチ サイズとして 128 を選択しました。実際、バッチ サイズには任意の値を指定できますが、多くの場合、2 の累乗サイズを使用するとメモリ効率が向上するため、これを最初に選択する必要があります。適切なバッチ サイズを決定する主な根拠は、バッチ サイズが小さすぎると収束が非常に面倒になり、バッチ サイズが大きすぎるとコンピューターのメモリに収まらない可能性があることに注意してください。
  • モデルの高速トレーニングを実現するために、エポック数 (トレーニング セット内の各サンプルが 1 つのトレーニングに参加する) を 50 に維持しましょう。エポック値が低いほど、小さくて単純なデータ セットに適しています。
  • 次に、非表示レイヤーを追加する必要があります。ここでは、各隠れ層に 128 個のニューロンを予約しました。もちろん、64 個と 32 個のニューロンを使用してテストすることもできます。この例では、MINST のような単純なデータ セットにこれより高い値を使用することはお勧めしません。
  • 0.01、0.05、0.1 など、さまざまな学習率を試すことができます。この場合は 0.01 のままにします。
  • 他のハイパーパラメータについては、減衰ステップと減衰率をそれぞれ 2000 と 0.9 に選択しました。そして、トレーニングが進むにつれて、学習率を下げるために使用される可能性があります。
  • ここでは、オプティマイザーとして Adamax を選択します。もちろん、Adam、RMSProp、SGD などの他のオプティマイザーを選択することもできます。
import tensorflow as tf
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense, Dropout
params = {
'dropout': 0.25,
'batch-size': 128,
'epochs': 50,
'layer-1-size': 128,
'layer-2-size': 128,
'initial-lr': 0.01,
'decay-steps': 2000,
'decay-rate': 0.9,
'optimizer': 'adamax'
}
mnist = tf.keras.datasets.mnist
num_class = 10
# split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# reshape and normalize the data
x_train = x_train.reshape(60000, 784).astype("float32")/255
x_test = x_test.reshape(10000, 784).astype("float32")/255
# convert class vectors to binary class matrices
y_train = to_categorical(y_train, num_class)
y_test = to_categorical(y_test, num_class)
ログイン後にコピー

4. トレーニング セットとテスト セットを作成する

TensorFlow ライブラリには MNIST データセットも含まれているため、オブジェクトに対して datasets.mnist を呼び出してから、load_data() メソッドを呼び出して、トレーニング データ セット (60,000 サンプル) とテスト データ セット (10,000 サンプル) をそれぞれ取得します。

次に、トレーニング画像とテスト画像を再形成して正規化する必要があります。このうち、正規化により画像のピクセル強度が 0 ~ 1 の間に制限されます。

最後に、以前にインポートした to_categorical メソッドを使用して、トレーニング ラベルとテスト ラベルを分類されたラベルに変換します。これは、出力ラベル (つまり、0 ~ 9) が数値型ではなくクラスであることを TensorFlow フレームワークに伝えるために非常に重要です。

5. ニューラル ネットワーク アーキテクチャを設計する

次に、ニューラル ネットワーク アーキテクチャの設計方法を詳しく理解しましょう。

Flatten を追加して 2D 画像行列をベクトルに変換し、DNN (ディープ ニューラル ネットワーク) の構造を定義します。ここで、入力ニューロンはベクトル内の数値に対応します。

次に、Dense() メソッドを使用して 2 つの隠れた密層を追加し、前に定義した「params」ディクショナリから各ハイパーパラメータを抽出します。これらの層の活性化関数として「relu」(Rectified Linear Unit)を使用できます。これは、ニューラル ネットワークの隠れ層で最も一般的に使用される活性化関数の 1 つです。

次に、Dropout メソッドを使用して Dropout レイヤーを追加します。これは、ニューラル ネットワークをトレーニングする際の過学習を避けるために使用されます。結局のところ、過学習モデルはトレーニング セットを正確に記憶し、目に見えないデータ セットを一般化できない傾向があります。

输出层是我们网络中的最后一层,它是使用Dense() 方法来定义的。需要注意的是,输出层有10个神经元,这对应于类(数字)的数量。

# Model Definition
# Get parameters from logged hyperparameters
model = Sequential([
Flatten(input_shape=(784, )),
Dense(params('layer-1-size'), activatinotallow='relu'),
Dense(params('layer-2-size'), activatinotallow='relu'),
Dropout(params('dropout')),
Dense(10)
])
lr_schedule =
tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate=experiment.get_parameter('initial-lr'),
decay_steps=experiment.get_parameter('decay-steps'),
decay_rate=experiment.get_parameter('decay-rate')
)
loss_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
model.compile(optimizer='adamax',
loss=loss_fn,
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=experiment.get_parameter('batch-size'),
epochs=experiment.get_parameter('epochs'),
validation_data=(x_test, y_test),)
score = model.evaluate(x_test, y_test)
# Log Model
model.save('tf-mnist-comet.h5')
ログイン後にコピー

6、训练

至此,我们已经定义好了架构。下面让我们用给定的训练数据,来编译和训练神经网络。

首先,我们以初始学习率、衰减步骤和衰减率作为参数,使用ExponentialDecay(指数衰减学习率)来定义学习率计划。

其次,将损失函数定义为CategoricalCrossentropy(用于多类式分类)。

接着,通过将优化器 (即:adamax)、损失函数、以及各项指标(由于所有类都同等重要、且均匀分布,因此我选择了准确性)作为参数,来编译模型。

然后,我们通过使用x_train、y_train、batch_size、epochs和validation_data去调用一个拟合方法,并拟合出模型。

同时,我们调用模型对象的评估方法,以获得模型在不可见数据集上的表现分数。

最后,您可以使用在模型对象上调用的save方法,保存要在生产环境中部署的模型对象。

7、小结

综上所述,我们讨论了为图像分类任务,训练深度神经网络的一些入门级的知识。您可以将其作为熟悉使用神经网络,进行图像分类的一个起点。据此,您可了解到该如何选择正确的参数集、以及架构背后的思考逻辑。

原文链接:https://www.kdnuggets.com/2022/12/guide-train-image-classification-model-tensorflow.html

以上がTensorFlow を使用して画像分類モデルをトレーニングするためのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:51cto.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート