Rescale で Keras を使用したニューラル ネットワーク

マークブログ
Rescale は、Theano ベースの Keras を含む、多数のニューラル ネットワーク ソフトウェア パッケージの実行をサポートするようになりました。 Keras は、ユーザーがニューラル ネットワークをレイヤーごとに定義し、トレーニング、検証し、それを使用して新しい画像にラベルを付けることができる Python パッケージです。 この投稿では、 畳み込みニューラル ネットワーク (CNN) に基づいて画像を分類するには CIFAR10 データセット。 次に、このトレーニング済みモデルを使用して新しい画像を分類します。

の修正バージョンを使用します。 Keras CIFAR10 CNN トレーニングの例 まず、トレーニング スクリプトの修正バージョンを段階的に確認していきます。

CIFAR10 データセット

CIFAR10画像分類データセットをダウンロードできます こちら。 これは約 60000 枚の 32×32 ピクセル画像で構成されており、それぞれに 10 のカテゴリの XNUMX つが与えられます。 データセットの Python バージョンを直接ダウンロードすることも、Keras の組み込みデータセット ダウンローダーを使用することもできます (これについては後で詳しく説明します)。

次のコードを使用してこのデータセットを読み込みます。

from keras.datasets import cifar10 from keras.utils import np_utils nb_classes = 10 def load_dataset(): # データ、シャッフルされ、トレーニング セットとテスト セットに分割 (X_train, y_train), (X_test, y_test) = cifar10.load_data() print ('X_train Shape:', X_train.shape) print(X_train.shape[0], 'train tables') print(X_test.shape[0], 'test tables') # クラスベクトルをバイナリクラス行列に変換 Y_train = np_utils .to_categorical(y_train, nb_classes) Y_test = np_utils.to_categorical(y_test, nb_classes) X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train /= 255 X_test /= 255 return X_train, Y_train, X_テスト、Y_テスト

私たちは使用しています シファール10 ここではデータ ローダーを使用して、カテゴリ ラベルをワンホット エンコーディングに変換し、8 ビット RGB 値を 0 ~ 1.0 の範囲にスケーリングします。
  X_電車 および X_テスト 出力は、トレーニング セットとテスト セット内のすべての画像の RGB ピクセル値の numpy 行列です。 50000 個のトレーニング画像と 10000 個のテスト画像があり、各画像は 32 つのカラー チャネルを持つ 32 × 3 ピクセルであるため、各行列の形状は次のようになります。

X_電車(50000、3、32、32)
Y_train(50000)
X_テスト(10000、3、32、32)
Y_テスト(10000)

Y 行列は、10 および 50000 の画像グループの 10000 の画像クラスの XNUMX つを表す順序値に対応します。

飛行機0
自動車1
2
cat3
鹿4
5
カエル6
うま7
8
トラック9

簡単にするために、この例では、正しいサイズの画像に対してそれ以上の前処理は行いません。 実際の画像認識問題では、ある種の正規化を行うことになります。 ZCAホワイトニング、および/またはジッタリング。 Keras は、この前処理の一部を 画像データジェネレーター とに提供されます。
ネットワークの定義
次のステップは、トレーニングしたいニューラル ネットワーク アーキテクチャを定義することです。

from keras.models import Sequential from keras.layers.core import Dense、Dropout、Activation、Flatten from keras.layers.convolutional import Convolution2D, MaxPooling2D def make_network(): model = Sequential() model.add(Convolution2D(32, 3, 3、border_mode='same'、input_shape=(img_channels, img_rows, img_cols))) model.add(Activation('relu')) model.add(Convolution2D(32, 3, 3)) model.add(Activation(' relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.25))model.add(Convolution2D(64,border_mode='same'))model.add (Activation('relu'))model.add(Convolution3D(3, 2, 64))model.add(Activation('relu'))model.add(MaxPooling3D(pool_size=(3, 2)))model.add (Dropout(2))model.add(Flatten())model.add(Dense(2))model.add(Activation('relu'))model.add(Dropout(0.25))model.add(Dense(nb_classes) )) model.add(Activation('softmax')) モデルを返します

このネットワークには 4 つの畳み込み層と、その後に続く 2 つの密な層があります。 追加のレイヤーを追加したり、レイヤーを削除または変更したりできますが、最初のレイヤーは入力イメージと同じサイズ (3、32、32) を持つ必要があり、最後の高密度レイヤーはクラスの数と同じ数の出力を持つ必要があります。ラベルとして使用しています (10)。 最後の緻密層が完成した後、 ソフトマックス 出力を合計が 0 になる (1, 1) 範囲に圧縮するレイヤー。

トレーニングとテスト
次に、ネットワークをトレーニングしてテストします。

def train_model(model, X_train, Y_train, X_test, Y_test): sgd = SGD(lr=0.01、decay=1e-6、momentum=0.9、nesterov=True) model.compile(loss='categorical_crossentropy'、optimizer=sgd) model.fit(X_train, Y_train, nb_epoch=nb_epoch,batch_size=バッチサイズ, validation_split=0.1, show_accuracy=True,verbose=1) print('テスト中...') res = model.evaluate(X_test, Y_test,batch_size=batch_size) 、verbose=1、show_accuracy=True) print('テスト精度: {0}'.format(res[1]))

ここで私たちが選んだのは、 確率的勾配降下法 最適化手法として クロスエントロピー損失。 次に、次を使用してモデルをトレーニングします。 フィット() 方法。 トレーニング エポックの数 (データを反復処理する回数) とバッチのサイズ (ネットワーク上で一度に評価する入力の数) を指定します。 バッチ サイズが大きくなると、トレーニング中のメモリ使用量が増加します。 ネットワークがトレーニングされた後、テスト データ セットに対してモデルを評価し、精度を出力します。

モデルの保存
最後に、後で再利用できるように、トレーニングされたモデルをファイルに保存します。

def save_model(model):model_json = model.to_json() open('cifar10_architecture.json', 'w').write(model_json) model.save_weights('cifar10_weights.h5', overwrite=True)

Keras は、モデル アーキテクチャ (私たちの場合、出力内容) を保存することを区別します。 make_network()) とトレーニングされた重み。 重みは HDF5 形式で保存されます。
Keras は、保存されたモデルが Keras と Theano の異なるバージョン間で互換性があることを保証しないことに注意してください。 可能であれば、同じバージョンの Keras と Theano で保存されたモデルをロードすることをお勧めします。

トレーニング ジョブを再スケールする
さて、内容を説明してきましたが、 cifar10_cnn.py 実行するトレーニング スクリプトでは、実行するようにすでに最適化されている GPU ノードでトレーニングするための Rescale ジョブを作成します。 NVIDIA GPU。 この仕事は Rescaleで一般公開されています。 まず、トレーニング スクリプトと CIFAR10 データセットをアップロードします。
トレーニング入力ファイル
ここでは、ジョブが実行されるたびに CIFAR サイトからデータセットを再ダウンロードすることを避けるために、Keras によってダウンロードされた CIFAR10 イメージの前処理バージョンをアップロードしています。 このステップはオプションであり、代わりに単にアップロードすることもできます。 cifar10_cnn.py スクリプト。
次に、Keras を選択し、コマンド ラインを指定します。
トレーニングソフトウェア
ソフトウェア ピッカーから Keras を選択し、次に Theano がサポートする K520 GPU バージョンの Keras を選択します。 コマンド ラインは、アップロードしたデータセットを再パックし、アーカイブをデフォルトの Keras データセットの場所に移動します。 ~/.keras/datasets。 次に、トレーニング スクリプトを呼び出します。 CIFAR10 セットを自分でアップロードしないことを選択した場合は、すべてのアーカイブ操作コマンドを省略して、トレーニング スクリプトを実行するだけで済みます。 データセットはジョブ クラスターに自動的にダウンロードされます。
最後のステップでは、実行する GPU ハードウェアを選択します。
トレーニングハードウェア
ここで私たちが選択したのは、 ジェイド コアの種類と最小値 4 色 このタイプの場合。 最後に、ジョブを送信します。
トレーニングを開始する前に、クラスターをプロビジョニングしてネットワークをコンパイルするのに約 15 分かかります。 開始したら、選択して進行状況を確認できます。 process_output.log.
トレーニングの進捗状況
ジョブが完了すると、トレーニングされたモデル ファイルを使用できるようになります。 これらはジョブ結果ページからダウンロードすることも、これから示すように新しいジョブで使用することもできます。

新しい画像の分類
トレーニング ジョブには、前処理された numpy 形式のデータセットを使用しました。 では、実際の画像をインターネットから取り出したい場合はどうすればよいでしょうか そしてそれらを分類しますか? 以来 および cat の 2 クラスのうちの 10 つです CIFAR10 で表される画像では、犬と猫の画像を選択します。 インターネットにアクセスして分類してみてください。
立っている猫        犬顔
まず、画像をロードして縮小します。

import numpy as np import scipy.misc defload_and_scale_imgs(): img_names = ['standing-cat.jpg', 'dog-face.jpg'] imgs = [np.transpose(scipy.misc.imresize(scipy.misc.imread) (img_name), (32, 32)), (2, 0, 1)).astype('float32') for img_name in img_names] return np.array(imgs) / 255

うちはscipyを使ってます 未読 JPG をロードし、画像のサイズを 32×32 ピクセルに変更します。 結果として得られるイメージ テンソルの次元は (32, 32, 3) であり、色の次元を最後ではなく最初にしたいので、転置を行います。 最後に、イメージ テンソルのリストを 0 つのテンソルに結合し、以前と同様にレベルが 1.0 ~ XNUMX の間に正規化されます。 処理後の画像は小さくなります。
立っている猫-小さい    犬の顔が小さい
ここでは、元の画像のアスペクト比さえ維持しない最も単純なサイズ変更を実行したことに注意してください。 トレーニング画像に正規化を行った場合は、これらの変換をこれらの画像にも適用したいと思うでしょう。

モデルのロードとラベル付け
保存したモデルの組み立ては、次に示す 2 段階のプロセスです。

keras.modelsからインポートmodel_from_json defload_model(model_def_fname,model_weight_fname):model = model_from_json(open(model_def_fname).read())model.load_weights(model_weight_fname) returnモデル

それをまとめると、ロードしたモデルを取得して呼び出します。 予測クラス 2 つのイメージのクラス序数値を取得します。

if __name__ == '__main__': imgs =load_and_scale_imgs() model =load_model('cifar10_architecture.json', 'cifar10_weights.h5') 予測 =model.predict_classes(imgs) print(predictions)

ラベル付けジョブの再スケール
次に、ラベル付けスクリプトをジョブに組み込み、サンプル画像にラベルを付けます。 この仕事は Rescaleで一般公開されています。 作成したトレーニング済みモデルの選択を開始します。 「クラウド ストレージのファイルを使用する」をクリックし、トレーニング ジョブによって作成された JSON および HDF5 モデル ファイルを選択します。
ラベル入力モデル
次に、新しいラベル付けスクリプトをアップロードします 犬猫.py そして犬と猫の画像。
ラベル入力残り
Keras GPU ソフトウェアを選択し、ラベル付けスクリプトを実行します。 この場合、犬と猫の画像はジョブの実行元の現在のディレクトリからロードされるため、ファイルを移動する必要はありません。
ラベルソフトウェア
ラベルは次のように表示されます。 process_output.log ジョブが完了したとき。
ラベル出力
ラベルの結果
出力は [3、5] これに対応します cat および 上記の画像クラス表から。
これでこのチュートリアルは終了です。 Rescale で画像認識畳み込みニューラル ネットワークのトレーニングに成功し、そのネットワークを使用して追加の画像にラベルを付けました。 近々別の投稿で、より複雑な Rescale ワークフローを使用してネットワーク トレーニングを最適化する方法について説明します。

著者

  • マーク·ホイットニー

    Mark Whitney は、Rescale のエンジニアリング ディレクターです。 彼の専門分野には、ハイ パフォーマンス コンピューティング アーキテクチャ、量子情報研究、クラウド コンピューティングが含まれます。 彼はカリフォルニア大学バークレー校でコンピューター サイエンスの博士号を取得しています。

類似の投稿