Keras-model-compilation

提供:Dev Guides
移動先:案内検索

Keras-モデルのコンパイル

以前は、シーケンシャルAPIと機能APIを使用してモデルを作成する方法の基本を学びました。 この章では、モデルのコンパイル方法について説明します。 コンパイルは、モデル作成の最後のステップです。 コンパイルが完了したら、トレーニングフェーズに進むことができます。

コンパイルプロセスをよりよく理解するために必要ないくつかの概念を学びましょう。

Loss

機械学習では、 Loss 関数を使用して、学習プロセスのエラーまたは偏差を検出します。 Kerasはモデルのコンパイルプロセス中に損失関数を必要とします。

Kerasは losses モジュールでかなりの数の損失関数を提供し、それらは次のとおりです-

  • mean_squared_error
  • mean_absolute_error
  • mean_absolute_percentage_error
  • mean_squared_logarithmic_error
  • squared_hinge
  • ヒンジ
  • categorical_hinge
  • Logcosh
  • huber_loss
  • categorical_crossentropy
  • sparse_categorical_crossentropy
  • binary_crossentropy
  • kullback_leibler_divergence
  • ポアソン
  • cosine_proximity
  • is_categorical_crossentropy

上記のすべての損失関数は2つの引数を受け入れます-

  • y_true -テンソルとしての真のラベル
  • y_pred - y_true と同じ形状の予測

以下に指定されている損失関数を使用する前に損失モジュールをインポートします-

from keras import losses

オプティマイザ

機械学習では、*最適化*は予測と損失関数を比較することによって入力重みを最適化する重要なプロセスです。 Kerasはかなりの数のオプティマイザをモジュール_optimizers_として提供しており、それらは次のとおりです。

*SGD* -確率的勾配降下オプティマイザ。
keras.optimizers.SGD(learning_rate = 0.01, momentum = 0.0, nesterov = False)
*RMSprop* -RMSPropオプティマイザ。
keras.optimizers.RMSprop(learning_rate = 0.001, rho = 0.9)
*Adagrad* -Adagradオプティマイザ。
keras.optimizers.Adagrad(learning_rate = 0.01)
*Adadelta* -Adadeltaオプティマイザ。
keras.optimizers.Adadelta(learning_rate = 1.0, rho = 0.95)
*Adam* -Adamオプティマイザ。
keras.optimizers.Adam(
   learning_rate = 0.001, beta_1 = 0.9, beta_2 = 0.999, amsgrad = False
)
*Adamax* -AdamのAdamaxオプティマイザー。
keras.optimizers.Adamax(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)
*Nadam* -Nesterov Adamオプティマイザ。
keras.optimizers.Nadam(learning_rate = 0.002, beta_1 = 0.9, beta_2 = 0.999)

以下に指定されているようにオプティマイザを使用する前にオプティマイザモジュールをインポートします-

from keras import optimizers

測定基準

機械学習では、 Metrics を使用してモデルのパフォーマンスを評価します。 これは損失関数に似ていますが、トレーニングプロセスでは使用されません。 Kerasはかなりの数のメトリックをモジュールとして提供します metrics そしてそれらは以下の通りです

  • 正確さ
  • binary_accuracy
  • categorical_accuracy
  • sparse_categorical_accuracy
  • top_k_categorical_accuracy
  • sparse_top_k_categorical_accuracy
  • cosine_proximity
  • clone_metric

損失関数と同様に、メトリックは以下の2つの引数も受け入れます-

  • y_true -テンソルとしての真のラベル
  • y_pred - y_true と同じ形状の予測

以下で指定されているようにメトリックを使用する前にメトリックモジュールをインポートします-

from keras import metrics

モデルをコンパイルする

Kerasモデルは、モデルをコンパイルする* compile()*メソッドを提供します。 * compile()*メソッドの引数とデフォルト値は次のとおりです。

compile(
   optimizer,
   loss = None,
   metrics = None,
   loss_weights = None,
   sample_weight_mode = None,
   weighted_metrics = None,
   target_tensors = None
)

重要な引数は次のとおりです-

  • 損失関数
  • オプティマイザ
  • 指標

モードをコンパイルするためのサンプルコードは次のとおりです-

from keras import losses
from keras import optimizers
from keras import metrics

model.compile(loss = 'mean_squared_error',
   optimizer = 'sgd', metrics = [metrics.categorical_accuracy])

どこで、

  • 損失関数は mean_squared_error として設定されます
  • オプティマイザは sgd として設定されます
  • メトリックは metrics.categorical_accuracy として設定されます

モデルトレーニング

モデルは、 _ fit()_ を使用してNumPy配列によってトレーニングされます。 このフィット関数の主な目的は、トレーニングでモデルを評価するために使用されます。 これは、モデルのパフォーマンスをグラフ化するためにも使用できます。 次の構文があります-

model.fit(X, y, epochs = , batch_size = )

ここに、

  • X、y -データを評価するタプルです。
  • エポック-トレーニング中にモデルを評価する必要がある回数はありません。
  • batch_size -トレーニングインスタンス。

この概念を使用するために、単純なランダムデータの簡単な例を見てみましょう。

データを作成する

以下のコマンドの助けを借りて、xとyにnumpyを使用してランダムデータを作成しましょう-

import numpy as np

x_train = np.random.random((100,4,8))
y_train = np.random.random((100,10))

次に、ランダムな検証データを作成し、

x_val = np.random.random((100,4,8))
y_val = np.random.random((100,10))

モデルを作成

単純な順次モデルを作成しましょう-

from keras.models import Sequential model = Sequential()

レイヤーを追加する

モデルを追加するレイヤーを作成します-

from keras.layers import LSTM, Dense

# add a sequence of vectors of dimension 16
model.add(LSTM(16, return_sequences = True))
model.add(Dense(10, activation = 'softmax'))

モデルをコンパイルする

これでモデルが定義されました。 以下のコマンドを使用してコンパイルできます-

model.compile(
   loss = 'categorical_crossentropy', optimizer = 'sgd', metrics = ['accuracy']
)

fit()を適用する

次に、_fit()_関数を適用してデータをトレーニングします-

model.fit(x_train, y_train, batch_size = 32, epochs = 5, validation_data = (x_val, y_val))

多層パーセプトロンANNを作成する

Kerasモデルを作成、コンパイル、トレーニングする方法を学びました。

私たちの学習を適用して、シンプルなMPLベースのANNを作成しましょう。

データセットモジュール

モデルを作成する前に、問題を選択し、必要なデータを収集して、データをNumPy配列に変換する必要があります。 データが収集されたら、モデルを準備し、収集したデータを使用してモデルをトレーニングできます。 データ収集は、機械学習の最も難しいフェーズの1つです。 Kerasは特別なモジュール、トレーニング用のオンライン機械学習データをダウンロードするためのデータセットを提供します。 オンラインサーバーからデータをフェッチし、データを処理して、トレーニングおよびテストセットとしてデータを返します。 Kerasデータセットモジュールによって提供されるデータを確認してみましょう。 モジュールで利用可能なデータは次のとおりです。

  • CIFAR10の小さい画像の分類
  • CIFAR100小さい画像の分類
  • IMDB Movieは感情分類をレビューします
  • ロイターニュースワイヤーのトピック分類
  • 手書き数字のMNISTデータベース
  • ファッション記事のFashion-MNISTデータベース
  • ボストンの住宅価格回帰データセット

入力として MNIST手書き数字のデータベース (またはminst)を使用します。 minstは、60,000、28x28のグレースケールイメージのコレクションです。 10桁です。 また、10,000枚のテスト画像も含まれています。

以下のコードは、データセットをロードするために使用できます-

from keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

どこで

  • 行1 *は、kerasデータセットモジュールから *minst をインポートします。
  • * 3行目*は、 load_data 関数を呼び出します。この関数は、オンラインサーバーからデータをフェッチし、データを2つのタプルとして返します。最初のタプル、(x_train、y_train)*は、形状を持つトレーニングデータを表します(number_sample、28、 28)と形状を持つ数字ラベル(number_samples、)。 2番目のタプル(x_test、y_test)*は、同じ形状のテストデータを表します。

他のデータセットも同様のAPIを使用してフェッチでき、すべてのAPIはデータの形状を除いて同様のデータを返します。 データの形状は、データのタイプによって異なります。

モデルを作成する

以下に示すような単純な多層パーセプトロン(MLP)を選択して、Kerasを使用してモデルを作成してみましょう。

モデルの作成

モデルのコア機能は次のとおりです-

  • 入力レイヤーは784個の値で構成されます(28 x 28 = 784)。
  • 最初の非表示層である Dense は、512個のニューロンと「relu」アクティベーション機能で構成されています。
  • 2番目の非表示レイヤーである*ドロップアウト*の値は0.2です。
  • 3番目の隠れ層、ここでもDenseは512のニューロンと「relu」アクティベーション機能で構成されています。
  • 4番目の非表示レイヤーである*ドロップアウト*の値は0.2です。
  • 5番目と最後の層は、10個のニューロンと「ソフトマックス」活性化関数で構成されています。
  • categorical_crossentropy を損失関数として使用します。
  • オプティマイザーとして* RMSprop()*を使用します。
  • *精度*を指標として使用します。
  • バッチサイズとして128を使用します。
  • エポックとして20を使用します。

ステップ1-モジュールをインポートする

必要なモジュールをインポートしましょう。

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
import numpy as np

ステップ2-データの読み込み

mnistデータセットをインポートしましょう。

(x_train, y_train), (x_test, y_test) = mnist.load_data()

ステップ3-データを処理する

モデルに合わせてデータセットを変更して、モデルにフィードできるようにします。

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train/= 255
x_test/= 255

y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

どこで

  • reshape は、入力を(28、28)タプルから(784、)に再形成するために使用されます
  • to_categorical は、ベクトルをバイナリ行列に変換するために使用されます

ステップ4-モデルを作成する

実際のモデルを作成してみましょう。

model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation = 'relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation = 'softmax'))

ステップ5-モデルをコンパイルする

選択した損失関数、オプティマイザー、およびメトリックを使用してモデルをコンパイルしてみましょう。

model.compile(loss = 'categorical_crossentropy',
   optimizer = RMSprop(),
   metrics = ['accuracy'])

ステップ6-モデルのトレーニング

*_fit()_* メソッドを使用してモデルをトレーニングしてみましょう。
history = model.fit(
   x_train, y_train,
   batch_size = 128,
   epochs = 20,
   verbose = 1,
   validation_data = (x_test, y_test)
)

最終的な考え

モデルを作成し、データをロードして、モデルにデータをトレーニングしました。 モデルを評価し、未知の入力に対する出力を予測する必要があります。これについては、次の章で学習します。

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
import numpy as np

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train/= 255
x_test/= 255

y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

model = Sequential()
model.add(Dense(512, activation='relu', input_shape = (784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation = 'relu')) model.add(Dropout(0.2))
model.add(Dense(10, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy',
   optimizer = RMSprop(),
   metrics = ['accuracy'])

history = model.fit(x_train, y_train,
   batch_size = 128, epochs = 20, verbose = 1, validation_data = (x_test, y_test))

アプリケーションを実行すると、出力として以下のコンテンツが表示されます-

Train on 60000 samples, validate on 10000 samples Epoch 1/20
60000/60000 [==============================] - 7s 118us/step - loss: 0.2453
- acc: 0.9236 - val_loss: 0.1004 - val_acc: 0.9675 Epoch 2/20
60000/60000 [==============================] - 7s 110us/step - loss: 0.1023
- acc: 0.9693 - val_loss: 0.0797 - val_acc: 0.9761 Epoch 3/20
60000/60000 [==============================] - 7s 110us/step - loss: 0.0744
- acc: 0.9770 - val_loss: 0.0727 - val_acc: 0.9791 Epoch 4/20
60000/60000 [==============================] - 7s 110us/step - loss: 0.0599
- acc: 0.9823 - val_loss: 0.0704 - val_acc: 0.9801 Epoch 5/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0504
- acc: 0.9853 - val_loss: 0.0714 - val_acc: 0.9817 Epoch 6/20
60000/60000 [==============================] - 7s 111us/step - loss: 0.0438
- acc: 0.9868 - val_loss: 0.0845 - val_acc: 0.9809 Epoch 7/20
60000/60000 [==============================] - 7s 114us/step - loss: 0.0391
- acc: 0.9887 - val_loss: 0.0823 - val_acc: 0.9802 Epoch 8/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0364
- acc: 0.9892 - val_loss: 0.0818 - val_acc: 0.9830 Epoch 9/20
60000/60000 [==============================] - 7s 113us/step - loss: 0.0308
- acc: 0.9905 - val_loss: 0.0833 - val_acc: 0.9829 Epoch 10/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0289
- acc: 0.9917 - val_loss: 0.0947 - val_acc: 0.9815 Epoch 11/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0279
- acc: 0.9921 - val_loss: 0.0818 - val_acc: 0.9831 Epoch 12/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0260
- acc: 0.9927 - val_loss: 0.0945 - val_acc: 0.9819 Epoch 13/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0257
- acc: 0.9931 - val_loss: 0.0952 - val_acc: 0.9836 Epoch 14/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0229
- acc: 0.9937 - val_loss: 0.0924 - val_acc: 0.9832 Epoch 15/20
60000/60000 [==============================] - 7s 115us/step - loss: 0.0235
- acc: 0.9937 - val_loss: 0.1004 - val_acc: 0.9823 Epoch 16/20
60000/60000 [==============================] - 7s 113us/step - loss: 0.0214
- acc: 0.9941 - val_loss: 0.0991 - val_acc: 0.9847 Epoch 17/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0219
- acc: 0.9943 - val_loss: 0.1044 - val_acc: 0.9837 Epoch 18/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0190
- acc: 0.9952 - val_loss: 0.1129 - val_acc: 0.9836 Epoch 19/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0197
- acc: 0.9953 - val_loss: 0.0981 - val_acc: 0.9841 Epoch 20/20
60000/60000 [==============================] - 7s 112us/step - loss: 0.0198
- acc: 0.9950 - val_loss: 0.1215 - val_acc: 0.9828