Kerasチュートリアル: Kerasとは何か?インストール方法 Python [例]
ケラスとは何ですか?
ケラス オープンソースのニューラルネットワークライブラリです。 Python Theano または Tensorflow 上で実行される Keras です。モジュール式で高速かつ使いやすいように設計されています。Google エンジニアの François Chollet によって開発されました。Keras は低レベルの計算は処理しません。代わりに、「バックエンド」と呼ばれる別のライブラリを使用して低レベルの計算を行います。
Kerasは低レベルAPIの高レベルAPIラッパーであり、TensorFlow、CNTK、Theano上で実行できます。Keras高レベルAPIは、モデルの作成方法、レイヤーの定義、複数の入出力モデルの設定を処理します。このレベルでは、Kerasは損失関数と最適化関数を使用してモデルをコンパイルし、フィット関数を使用してトレーニングプロセスを実行します。Kerasは Python 計算グラフの作成、テンソルやその他の変数の作成などの低レベル API は、「バックエンド」エンジンによって処理されるため、処理されません。
バックエンドとは何ですか?
バックエンドは、Tensorflow や Theano などの他のライブラリの助けを借りて、テンソル積、畳み込み、その他多くのものなど、すべての低レベルの計算を実行する Keras の用語です。 したがって、「バックエンド エンジン」がモデルの計算と開発を実行します。 Tensorflow はデフォルトの「バックエンド エンジン」ですが、設定で変更できます。
Theano、Tensorflow、CNTK バックエンド
Theanoは、カナダのケベック州モントリオール大学のMILAグループによって開発されたオープンソースプロジェクトです。これは、最初に広く使用されたフレームワークです。 Python Numpy または Scipy を使用した数学演算の多次元配列に役立つライブラリ。Theano は GPU を使用して計算を高速化できるほか、勾配を計算するためのシンボリック グラフを自動的に構築することもできます。Theano の Web サイトでは、数値的に不安定な式を認識し、より安定したアルゴリズムで計算できると説明されており、これは不安定な式に非常に役立ちます。
一方、Tensorflow はディープラーニング フレームワークの新星です。 Google の Brain チームによって開発された、最も人気のある深層学習ツールです。 多くの機能を備えており、研究者は深層学習を目的としたこのフレームワークの開発に貢献しています。
Keras のもう XNUMX つのバックエンド エンジンは、 Microsoft コグニティブ ツールキットまたは CNTK。によって開発されたオープンソースの深層学習フレームワークです。 Microsoft チーム。マルチ GPU またはマルチマシン上で実行して、大規模な深層学習モデルをトレーニングできます。場合によっては、CNTK が Tensorflow や Theano などの他のフレームワークよりも早く報告されることがありました。次に、この Keras CNN チュートリアルでは、Theano、TensorFlow、CNTK のバックエンドを比較します。
バックエンドの比較
これら XNUMX つのバックエンドの比較を知るために、ベンチマークを実行する必要があります。 ご覧のとおり、 Jeong-Yoon Lee のベンチマークでは、異なるハードウェア上の 3 つの異なるバックエンドのパフォーマンスが比較されます。 その結果、Theano は他のバックエンドよりも遅いと報告されています 50回 速度は遅くなりますが、精度はほぼ同じです。
別の ベンチマークテスト によって実行されます ジャスミート・バティア。 彼は、あるテストでは Theano が Tensorflow よりも遅いと報告しました。 ただし、全体的な精度は、テストしたすべてのネットワークでほぼ同じです。
したがって、Theano、Tensorflow、CTK の間では、TensorFlow が Theano よりも優れていることは明らかです。 TensorFlow を使用すると、計算時間が大幅に短くなり、CNN は他のものよりも優れています。
このKerasの次は Python このチュートリアルでは、KerasとTensorFlowの違いについて学びます(Keras 対 Tensorflow).
Keras 対 Tensorflow
Parameters | ケラス | テンソルフロー |
---|---|---|
種類 | 高レベル API ラッパー | 低レベル API |
複雑 | 簡単に使える Python 言語 | Tensorflow 関数の一部を使用する構文を学習する必要があります |
目的 | 標準レイヤーでモデルを作成するための迅速な展開 | 任意の計算グラフまたはモデル層を作成できます。 |
ツール | TFDBG などの他の API デバッグ ツールを使用する | Tensorboard 視覚化ツールを使用できます |
コミュニティ | 大規模なアクティブなコミュニティ | 大規模なアクティブなコミュニティと広く共有されるリソース |
ケラスの利点
迅速な導入と分かりやすさ
Kerasはネットワークモデルを非常に素早く作成できます。数行の簡単なネットワークモデルを作成したい場合は、 Python Keras はそれに役立ちます。以下の Keras の例をご覧ください。
from keras.models import Sequential from keras.layers import Dense, Activation model = Sequential() model.add(Dense(64, activation='relu', input_dim=50)) #input shape of 50 model.add(Dense(28, activation='relu')) #input shape of 50 model.add(Dense(10, activation='softmax'))
API がフレンドリーなので、プロセスが簡単に理解できます。 シンプルな関数を使用してコードを記述し、複数のパラメーターを設定する必要はありません。
大規模なコミュニティ サポート
深層学習フレームワークに Keras を使用する AI コミュニティは数多くあります。 彼らの多くはコードとチュートリアルを一般向けに公開しています。
複数のバックエンドがある
Keras のバックエンドとして Tensorflow、CNTK、Theano を選択できます。 ニーズに応じて、プロジェクトごとに異なるバックエンドを選択できます。 各バックエンドには独自の利点があります。
クロスプラットフォームで簡単なモデル展開
さまざまなデバイスとプラットフォームがサポートされているため、次のような任意のデバイスに Keras をデプロイできます。
- CoreMLを搭載したiOS
- Android Tensorflow を使用した場合 Android,
- .js をサポートする Web ブラウザ
- クラウドエンジン
- ラズベリーパイ
マルチ GPU のサポート
Keras を単一の GPU でトレーニングすることも、複数の GPU を同時に使用することもできます。 Keras にはデータ並列処理のサポートが組み込まれているため、大量のデータを処理し、トレーニングに必要な時間を短縮できます。
ケラスの欠点
低レベルの API を処理できない
Keras は、Tensorflow、Theano、CNTK などの他のフレームワークまたはバックエンド エンジン上で実行される高レベル API のみを処理します。 したがって、Keras にはすでに事前設定されたレイヤーがあるため、研究目的で独自の抽象レイヤーを作成したい場合にはあまり役に立ちません。
Keras のインストール
このセクションでは、Keras をインストールするために利用できるさまざまな方法を検討します。
直接インストールまたは仮想環境
どちらがいいですか? 現在の Python に直接インストールしますか、それとも仮想環境を使用しますか? プロジェクトが多い場合は、仮想環境を使用することをお勧めします。 その理由を知りたいですか? これは、プロジェクトごとに異なるバージョンの keras ライブラリが使用される可能性があるためです。
例えば、私は次のようなプロジェクトを必要としています Python 3.5ではOpenCV 3.3を古いKeras-Theanoバックエンドで使用していますが、他のプロジェクトでは最新バージョンのKerasとTensorflowをバックエンドとして使用する必要があります。 Python 3.6.6のサポート
Keras ライブラリが互いに競合することは望ましくありません。したがって、仮想環境を使用して特定のタイプのライブラリでプロジェクトをローカライズするか、クラウド サービスなどの別のプラットフォームを使用して次のような計算を行うことができます。 Amazon ウェブサービス。
Keras のインストール Amazon ウェブサービス(AWS)
Amazon Web サービスは、研究者やその他の目的にクラウド コンピューティング サービスと製品を提供するプラットフォームです。 AWS はハードウェア、ネットワーク、データベースなどをレンタルして、インターネットから直接使用できるようにしています。深層学習目的で人気のある AWS サービスの XNUMX つは、 Amazon マシンイメージディープラーニングサービスまたはDL
AWS の使用方法の詳細については、こちらを参照してください。 チュートリアル
AMIに関する注意: 以下のAMIが利用可能になります
AWS Deep Learning AMI は、研究者や実践者が Deep Learning を使用するのに役立つ AWS EC2 サービスの仮想環境です。 DLAMI は、小型 CPU エンジンから、事前構成された CUDA、cuDNN を備えた高性能マルチ GPU エンジンまでを提供し、さまざまな深層学習フレームワークが付属しています。
すぐに使用したい場合は、一般的な深層学習フレームワークがプリインストールされている Deep Learning AMI を選択する必要があります。
ただし、研究用にカスタムのディープ ラーニング フレームワークを試したい場合は、ディープ ラーニング ベース AMI をインストールする必要があります。ディープ ラーニング ベース AMI には、CUDA、cuDNN、GPU ドライバーなどの基本ライブラリや、ディープ ラーニング環境で実行するために必要なその他のライブラリが付属しているためです。
Keras をインストールする方法 Amazon セージメーカー
Amazon SageMaker は、最適なアルゴリズムを備えたディープ ラーニング ネットワークのトレーニングとデプロイを支援するディープ ラーニング プラットフォームです。
初心者にとって、これは Keras を使用する最も簡単な方法です。以下は Keras をインストールする方法のプロセスです。 Amazon セージメーカー:
ステップ1) 開く Amazon セージメーカー
最初のステップでは、 Amazon セージメーカー コンソールを開き、「ノートブックインスタンスの作成」をクリックします。
ステップ2) 詳細を入力する
- ノートブックの名前を入力します。
- IAM ロールを作成します。 AMI ロールが作成されます Amazon 次の形式の IAM ロール AmazonSageMaker-Executionrole-YYYYMMDD|HHmmSS。
- 最後に、[ノートブック インスタンスの作成] を選択します。しばらくすると、 Amazon Sagemaker はノートブック インスタンスを起動します。
注意: VPC からリソースにアクセスする場合は、直接インターネットアクセスを有効に設定してください。そうしないと、このノートブックインスタンスはインターネットにアクセスできないため、モデルのトレーニングやホスティングができなくなります。
ステップ 3) インスタンスを起動する
「開く」をクリックしてインスタンスを起動します
ステップ 4) コーディングを開始する
In Jupyter, [新規] > [conda_tensorflow_p36] をクリックすると、コーディングの準備が整います。
Linux に Keras をインストールする
バックエンド エンジンとして Tensorflow を使用して Keras を有効にするには、最初に Tensorflow をインストールする必要があります。 このコマンドを実行して、CPU (GPU なし) で tensorflow をインストールします。
pip install --upgrade tensorflow
tensorflow の GPU サポートを有効にしたい場合は、このコマンドを使用できます
pip install --upgrade tensorflow-gpu
チェックインしましょう Python インストールが成功したかどうかを確認するには、次のように入力します。
user@user:~$ python Python 3.6.4 (default, Mar 20 2018, 11:10:20) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import tensorflow >>>
エラー メッセージが表示されなければ、インストール プロセスは成功しています。
Keras をインストールする
Tensorflow をインストールしたら、keras のインストールを開始しましょう。 ターミナルにこのコマンドを入力します
pip install keras
Keras とそのすべての依存関係のインストールが開始されます。次のようなものが表示されるはずです。
これで、システムに Keras がインストールされました。
検証中
Keras の使用を開始する前に、構成ファイルを開いて、Keras がバックエンドとして Tensorflow を使用しているかどうかを確認する必要があります。
gedit ~/.keras/keras.json
このようなものが表示されるはずです
{ "floatx": "float32", "epsilon": 1e-07, "backend": "tensorflow", "image_data_format": "channels_last" }
ご覧のとおり、「バックエンド」は tensorflow を使用します。 これは、keras が予想どおりバックエンドとして Tensorflow を使用していることを意味します。
次に、ターミナル上で次のように入力して実行します。
user@user:~$ python3 Python 3.6.4 (default, Mar 20 2018, 11:10:20) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import keras Using TensorFlow backend. >>>
Keras をインストールする方法 Windows
インストールする前に テンソルフロー Kerasをインストールする必要があります Python、pip、virtualenv です。これらのライブラリがすでにインストールされている場合は次の手順に進みます。そうでない場合は、次の操作を行います。
インストールを開始する Python 3ここからダウンロードして
実行して pip をインストールします この
このコマンドで virtualenv をインストールします
pip3 install –U pip virtualenv
インストールを開始する Microsoft ビジュアル C++ 2015 再頒布可能アップデート 3
- Visual Studioのダウンロードサイトへアクセス https://www.microsoft.com/en-us/download/details.aspx?id=53587
- 再頒布可能ファイルとビルドツールを選択します
- ダウンロードしてインストール Microsoft ビジュアル C++ 2015 再頒布可能アップデート 3
次に、このスクリプトを実行します
pip3 install virtualenv
仮想環境のセットアップ
これは、稼働中のシステムをメイン システムから分離するために使用されます。
virtualenv –-system-site-packages –p python3 ./venv
環境を活性化する
.\venv\Scripts\activate
環境を準備した後、Tensorflow と Keras のインストールは Linux と同じままになります。 次に、Keras を使用したディープ ラーニングのチュートリアルでは、ディープ ラーニングの Keras の基礎について学びます。
深層学習のための Keras の基礎
Keras の主な構造は、ネットワークの完全なグラフを定義するモデルです。 既存のモデルにさらにレイヤーを追加して、プロジェクトに必要なカスタム モデルを構築できます。
ここでは、シーケンシャル モデルとディープ ラーニングで一般的に使用されるいくつかのレイヤーを作成する方法を示します。
1. シーケンシャルモデル
from keras.models import Sequential from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout model = Sequential()
2.畳み込み層
これはケラスです Python 入力形状が 320x320x3、サイズが 48×3 のフィルターが 3 個あり、ReLU を活性化関数として使用する入力層としての畳み込み層の例。
input_shape=(320,320,3) #this is the input shape of an image 320x320x3 model.add(Conv2D(48, (3, 3), activation='relu', input_shape= input_shape))
別のタイプは
model.add(Conv2D(48, (3, 3), activation='relu'))
3。 マックスPooling レイヤー
入力表現をダウンサンプリングするには、MaxPool2d を使用してカーネル サイズを指定します
model.add(MaxPooling2D(pool_size=(2, 2)))
4. 緻密な層
出力サイズを指定するだけで完全に接続されたレイヤーを追加する
model.add(Dense(256, activation='relu'))
5. ドロップアウトレイヤー
50%の確率でドロップアウト層を追加
model.add(Dropout(0.5))
コンパイル、トレーニング、評価
モデルを定義したら、モデルのトレーニングを開始しましょう。 最初に損失関数とオプティマイザ関数を使用してネットワークをコンパイルする必要があります。 これにより、ネットワークの重みを変更できるようになり、損失が最小限に抑えられます。
model.compile(loss='mean_squared_error', optimizer='adam')
ここでトレーニングを開始するには、fit を使用してトレーニング データと検証データをモデルに供給します。 これにより、ネットワークをバッチでトレーニングし、エポックを設定できるようになります。
model.fit(X_train, X_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))
最後のステップは、テスト データを使用してモデルを評価することです。
score = model.evaluate(x_test, y_test, batch_size=32)
単純な線形回帰を使ってみましょう
import keras from keras.models import Sequential from keras.layers import Dense, Activation import numpy as np import matplotlib.pyplot as plt x = data = np.linspace(1,2,200) y = x*4 + np.random.randn(*x.shape) * 0.3 model = Sequential() model.add(Dense(1, input_dim=1, activation='linear')) model.compile(optimizer='sgd', loss='mse', metrics=['mse']) weights = model.layers[0].get_weights() w_init = weights[0][0][0] b_init = weights[1][0] print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init)) model.fit(x,y, batch_size=1, epochs=30, shuffle=False) weights = model.layers[0].get_weights() w_final = weights[0][0][0] b_final = weights[1][0] print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final)) predict = model.predict(data) plt.plot(data, predict, 'b', data , y, 'k.') plt.show()
データをトレーニングすると、出力は次のようになります。
初期重量で
Linear regression model is initialized with weights w: 0.37, b: 0.00
そして最終的な体重
Linear regression model is trained to have weight w: 3.70, b: 0.61
Keras での事前トレーニング済みモデルの微調整とその使用方法
Fine Tune Model を使用する理由といつ使用するか
微調整は、パラメーターが新しいモデルに適応するように、事前トレーニングされたモデルを微調整するタスクです。 新しいモデルでゼロからトレーニングしたい場合、ネットワークがすべてのパラメーターを見つけることができるように、大量のデータが必要です。 ただし、この場合、パラメータはすでに学習されており、重みを持っているため、事前トレーニングされたモデルを使用します。
たとえば、分類問題を解決するために独自の Keras モデルをトレーニングしたいが、データが少量しかない場合は、 転移学習 + 微調整方法。
事前にトレーニングされたネットワークと重みを使用すると、ネットワーク全体をトレーニングする必要がありません。 微調整メソッドと呼ばれる、タスクを解決するために使用される最後の層をトレーニングする必要があるだけです。
ネットワークモデルの準備
事前トレーニングされたモデルの場合、Keras のライブラリに既にある次のようなさまざまなモデルをロードできます。
- VGG16
- インセプションV3
- レスネット
- モバイルネット
- Xception
- インセプションResNetV2
ただし、このプロセスでは、VGG16 ネットワーク モデルと、モデルの重みとして imageNet を使用します。 からの画像を使用して 8 つの異なるタイプのクラスを分類するようにネットワークを微調整します。 Kaggle 自然画像データセット
VGG16 モデルアーキテクチャ
データを AWS S3 バケットにアップロードする
トレーニング プロセスでは、飛行機、車、猫、犬、花、果物、バイク、人物など 8 つの異なるクラスの自然画像の写真を使用します。まず、データをアップロードする必要があります Amazon S3バケット。
Amazon S3バケット
ステップ1) S3アカウントにログインしたら、クロックを設定してバケットを作成しましょう バケットを作成します。
ステップ2) 次に、アカウントに応じてバケット名とリージョンを選択します。 バケット名が使用可能であることを確認してください。 その後クリックしてください 作成します。
ステップ3) ご覧のとおり、バケットを使用する準備ができています。 ただし、ご覧のとおり、アクセスは公開されていないため、自分だけのプライベートに保ちたい場合に適しています。 バケットのプロパティでこのバケットをパブリック アクセス用に変更できます。
ステップ4) ここで、トレーニング データをバケットにアップロードし始めます。 ここでは、トレーニングとテストのプロセス用の画像で構成される tar.gz ファイルをアップロードします。
ステップ5) ファイルをクリックして、 リンク ダウンロードできるようにします。
データの準備
Keras ImageData を使用してトレーニング データを生成する必要があります。Generator.
まず、wget を使用して、S3 バケットからファイルへのリンクをダウンロードする必要があります。
!wget https://s3.us-east-2.amazonaws.com/naturalimages02/images.tar.gz !tar -xzf images.tar.gz
データをダウンロードしたら、トレーニング プロセスを開始しましょう。
from keras.preprocessing.image import ImageDataGenerator import numpy as np import matplotlib.pyplot as plt train_path = 'images/train/' test_path = 'images/test/' batch_size = 16 image_size = 224 num_class = 8 train_datagen = ImageDataGenerator(validation_split=0.3, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) train_generator = train_datagen.flow_from_directory( directory=train_path, target_size=(image_size,image_size), batch_size=batch_size, class_mode='categorical', color_mode='rgb', shuffle=True)
画像データGenerator ディレクトリから X_training データを作成します。 そのディレクトリ内のサブディレクトリは、各オブジェクトのクラスとして使用されます。 画像は、RGB カラー モード、Y_training データのカテゴリカル クラス モード、バッチ サイズ 16 でロードされます。最後に、データをシャッフルします。
matplotlib で画像をプロットしてランダムに画像を見てみましょう
x_batch, y_batch = train_generator.next() fig=plt.figure() columns = 4 rows = 4 for i in range(1, columns*rows): num = np.random.randint(batch_size) image = x_batch[num].astype(np.int) fig.add_subplot(rows, columns, i) plt.imshow(image) plt.show()
その後、imageNet で事前にトレーニングされた重みを使用して VGG16 からネットワーク モデルを作成しましょう。 計算時間を短縮するために、これらのレイヤーをトレーニングできないようにフリーズします。
VGG16 からモデルを作成する
import keras from keras.models import Model, load_model from keras.layers import Activation, Dropout, Flatten, Dense from keras.preprocessing.image import ImageDataGenerator from keras.applications.vgg16 import VGG16 #Load the VGG model base_model = VGG16(weights='imagenet', include_top=False, input_shape=(image_size, image_size, 3)) print(base_model.summary()) # Freeze the layers for layer in base_model.layers: layer.trainable = False # # Create the model model = keras.models.Sequential() # # Add the vgg convolutional base model model.add(base_model) # # Add new layers model.add(Flatten()) model.add(Dense(1024, activation='relu')) model.add(Dense(1024, activation='relu')) model.add(Dense(num_class, activation='softmax')) # # Show a summary of the model. Check the number of trainable parameters print(model.summary())
以下に示すように、ネットワーク モデルの概要を示します。 VGG16 レイヤーからの入力から、2 個の特徴を抽出する 1024 つの完全接続レイヤーと、ソフトマックス アクティベーションで 8 つのクラスを計算する出力レイヤーを追加します。
Layer (type) Output Shape Param # ================================================================= vgg16 (Model) (None, 7, 7, 512) 14714688 _________________________________________________________________ flatten_1 (Flatten) (None, 25088) 0 _________________________________________________________________ dense_1 (Dense) (None, 1024) 25691136 _________________________________________________________________ dense_2 (Dense) (None, 1024) 1049600 _________________________________________________________________ dense_3 (Dense) (None, 8) 8200 ================================================================= Total params: 41,463,624 Trainable params: 26,748,936 Non-trainable params: 14,714,688
トレーニング
# # Compile the model from keras.optimizers import SGD model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=1e-3), metrics=['accuracy']) # # Start the training process # model.fit(x_train, y_train, validation_split=0.30, batch_size=32, epochs=50, verbose=2) # # #save the model # model.save('catdog.h5') history = model.fit_generator( train_generator, steps_per_epoch=train_generator.n/batch_size, epochs=10) model.save('fine_tune.h5') # summarize history for accuracy import matplotlib.pyplot as plt plt.plot(history.history['loss']) plt.title('loss') plt.ylabel('loss') plt.xlabel('epoch') plt.legend(['loss'], loc='upper left') plt.show()
革 新 的 な 最 新 車 両 の 設 計 ・ 開 発 に 焦 点 を 合 わ せ 、 デ ジ タ ル ・ト ラ ン ス フ ォ ー メ ー シ ョ ン を実現する業界最高のエンジニアリングと IT のベストプラクティス
Epoch 1/10 432/431 [==============================] - 53s 123ms/step - loss: 0.5524 - acc: 0.9474 Epoch 2/10 432/431 [==============================] - 52s 119ms/step - loss: 0.1571 - acc: 0.9831 Epoch 3/10 432/431 [==============================] - 51s 119ms/step - loss: 0.1087 - acc: 0.9871 Epoch 4/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0624 - acc: 0.9926 Epoch 5/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0591 - acc: 0.9938 Epoch 6/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0498 - acc: 0.9936 Epoch 7/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0403 - acc: 0.9958 Epoch 8/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0248 - acc: 0.9959 Epoch 9/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0466 - acc: 0.9942 Epoch 10/10 432/431 [==============================] - 52s 120ms/step - loss: 0.0338 - acc: 0.9947
ご覧のとおり、損失は大幅に減少し、精度はほぼ 100% です。 モデルをテストするために、インターネット上で画像をランダムに選択し、それをテストするために別のクラスのテスト フォルダーに置きました。
モデルをテストする
model = load_model('fine_tune.h5') test_datagen = ImageDataGenerator() train_generator = train_datagen.flow_from_directory( directory=train_path, target_size=(image_size,image_size), batch_size=batch_size, class_mode='categorical', color_mode='rgb', shuffle=True) test_generator = test_datagen.flow_from_directory( directory=test_path, target_size=(image_size, image_size), color_mode='rgb', shuffle=False, class_mode='categorical', batch_size=1) filenames = test_generator.filenames nb_samples = len(filenames) fig=plt.figure() columns = 4 rows = 4 for i in range(1, columns*rows -1): x_batch, y_batch = test_generator.next() name = model.predict(x_batch) name = np.argmax(name, axis=-1) true_name = y_batch true_name = np.argmax(true_name, axis=-1) label_map = (test_generator.class_indices) label_map = dict((v,k) for k,v in label_map.items()) #flip k,v predictions = [label_map[k] for k in name] true_value = [label_map[k] for k in true_name] image = x_batch[0].astype(np.int) fig.add_subplot(rows, columns, i) plt.title(str(predictions[0]) + ':' + str(true_value[0])) plt.imshow(image) plt.show()
そして、私たちのテストは以下の通りです! 1 枚の画像のテストで、予測が間違ったのは 14 枚だけです。
Keras を使用した顔認識ニューラル ネットワーク
なぜ承認が必要なのか
人の顔、物の種類、顔から推定される年齢を簡単に認識または識別したり、その人の顔の表情を知ることを容易にするためには、認識が必要です。
おそらく、写真に友達の顔をマークしようとするたびに、Facebook の機能が自動的にそれを行ってくれる、つまり、あなたが最初にマークする必要がなくても、友達の顔をマークしていることに気づいているかもしれません。 これは、友達のタグ付けを簡単にするために Facebook によって適用された顔認識です。
では、どのように機能するのでしょうか? 私たちが友人の顔をマークするたびに、Facebook の AI がそれを学習し、正しい結果が得られるまで予測しようとします。 独自の顔認識を作成するために使用するシステムと同じです。 ディープラーニングを使用して独自の顔認識を作成してみましょう
ネットワークモデル
VGG16 ネットワーク モデルを使用しますが、VGGFace ウェイトを使用します。
VGG16 モデルアーキテクチャ
VGGFace とは何ですか? Parkhi、Omkar M. らが導入した Deep Face Recognition の Keras 実装です。「Deep Face Recognition」。BMVC (2015)。このフレームワークは、ネットワーク アーキテクチャとして VGG16 を使用します。
VGGFace は次からダウンロードできます。 githubの
from keras.applications.vgg16 import VGG16 from keras_vggface.vggface import VGGFace face_model = VGGFace(model='vgg16', weights='vggface', input_shape=(224,224,3)) face_model.summary()
ご覧のとおり、ネットワークの概要
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 224, 224, 3) 0 _________________________________________________________________ conv1_1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ conv1_2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ pool1 (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ conv2_1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ conv2_2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ pool2 (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ conv3_1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ conv3_2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ conv3_3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ pool3 (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ conv4_1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ conv4_2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ conv4_3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ pool4 (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ conv5_1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ pool5 (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc6 (Dense) (None, 4096) 102764544 _________________________________________________________________ fc6/relu (Activation) (None, 4096) 0 _________________________________________________________________ fc7 (Dense) (None, 4096) 16781312 _________________________________________________________________ fc7/relu (Activation) (None, 4096) 0 _________________________________________________________________ fc8 (Dense) (None, 2622) 10742334 _________________________________________________________________ fc8/softmax (Activation) (None, 2622) 0 ================================================================= Total params: 145,002,878 Trainable params: 145,002,878 Non-trainable params: 0 _________________________________________________________________ Traceback (most recent call last):
私たちはやります 転移学習 + 微調整により、小さなデータセットでのトレーニングを迅速化します。 まず、ベース レイヤをフリーズして、レイヤがトレーニングできないようにします。
for layer in face_model.layers: layer.trainable = False
次に、テストの顔を認識するために独自のレイヤーを追加します。 完全に接続された 2 つのレイヤーと、検出する 5 人の出力レイヤーを追加します。
from keras.models import Model, Sequential from keras.layers import Input, Convolution2D, ZeroPadding2D, MaxPooling2D, Flatten, Dense, Dropout, Activation person_count = 5 last_layer = face_model.get_layer('pool5').output x = Flatten(name='flatten')(last_layer) x = Dense(1024, activation='relu', name='fc6')(x) x = Dense(1024, activation='relu', name='fc7')(x) out = Dense(person_count, activation='softmax', name='fc8')(x) custom_face = Model(face_model.input, out)
ネットワークの概要を見てみましょう
Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 224, 224, 3) 0 _________________________________________________________________ conv1_1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ conv1_2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ pool1 (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ conv2_1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ conv2_2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ pool2 (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ conv3_1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ conv3_2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ conv3_3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ pool3 (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ conv4_1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ conv4_2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ conv4_3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ pool4 (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ conv5_1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ pool5 (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc6 (Dense) (None, 1024) 25691136 _________________________________________________________________ fc7 (Dense) (None, 1024) 1049600 _________________________________________________________________ fc8 (Dense) (None, 5) 5125 ================================================================= Total params: 41,460,549 Trainable params: 26,745,861 Non-trainable params: 14,714,688
上でわかるように、pool5 層の後は、最終的な認識のために密層によって使用される単一の特徴ベクトルに平坦化されます。
顔を準備する
さあ、顔を準備しましょう。 有名人5人の名鑑を作りました
- ジャック·マー
- ジェイソン·ステイサム
- ジョニーデップ
- ロバート・ダウニー・ジュニア
- ローワン·アトキンソン
各フォルダーには、トレーニングおよび評価プロセスごとに 10 枚の画像が含まれています。 非常に少量のデータですが、それが課題ですよね?
データの準備には Keras ツールを利用します。 この関数はデータセット フォルダー内で反復処理され、トレーニングで使用できるように準備されます。
from keras.preprocessing.image import ImageDataGenerator batch_size = 5 train_path = 'data/' eval_path = 'eval/' train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) valid_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) train_generator = train_datagen.flow_from_directory( train_path, target_size=(image_size,image_size), batch_size=batch_size, class_mode='sparse', color_mode='rgb') valid_generator = valid_datagen.flow_from_directory( directory=eval_path, target_size=(224, 224), color_mode='rgb', batch_size=batch_size, class_mode='sparse', shuffle=True, )
モデルのトレーニング
損失関数とオプティマイザーを使用してネットワークをコンパイルすることから、トレーニング プロセスを開始しましょう。 ここでは、学習オプティマイザーとして SGD の助けを借りて、sparse_categorical_crossentropy を損失関数として使用します。
from keras.optimizers import SGD custom_face.compile(loss='sparse_categorical_crossentropy', optimizer=SGD(lr=1e-4, momentum=0.9), metrics=['accuracy']) history = custom_face.fit_generator( train_generator, validation_data=valid_generator, steps_per_epoch=49/batch_size, validation_steps=valid_generator.n, epochs=50) custom_face.evaluate_generator(generator=valid_generator) custom_face.save('vgg_face.h5') Epoch 25/50 10/9 [==============================] - 60s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5659 - val_acc: 0.5851 Epoch 26/50 10/9 [==============================] - 59s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5638 - val_acc: 0.5809 Epoch 27/50 10/9 [==============================] - 60s 6s/step - loss: 1.4779 - acc: 0.8597 - val_loss: 1.5613 - val_acc: 0.5477 Epoch 28/50 10/9 [==============================] - 60s 6s/step - loss: 1.4755 - acc: 0.9199 - val_loss: 1.5576 - val_acc: 0.5809 Epoch 29/50 10/9 [==============================] - 60s 6s/step - loss: 1.4794 - acc: 0.9153 - val_loss: 1.5531 - val_acc: 0.5892 Epoch 30/50 10/9 [==============================] - 60s 6s/step - loss: 1.4714 - acc: 0.8953 - val_loss: 1.5510 - val_acc: 0.6017 Epoch 31/50 10/9 [==============================] - 60s 6s/step - loss: 1.4552 - acc: 0.9199 - val_loss: 1.5509 - val_acc: 0.5809 Epoch 32/50 10/9 [==============================] - 60s 6s/step - loss: 1.4504 - acc: 0.9199 - val_loss: 1.5492 - val_acc: 0.5975 Epoch 33/50 10/9 [==============================] - 60s 6s/step - loss: 1.4497 - acc: 0.8998 - val_loss: 1.5490 - val_acc: 0.5851 Epoch 34/50 10/9 [==============================] - 60s 6s/step - loss: 1.4453 - acc: 0.9399 - val_loss: 1.5529 - val_acc: 0.5643 Epoch 35/50 10/9 [==============================] - 60s 6s/step - loss: 1.4399 - acc: 0.9599 - val_loss: 1.5451 - val_acc: 0.5768 Epoch 36/50 10/9 [==============================] - 60s 6s/step - loss: 1.4373 - acc: 0.8998 - val_loss: 1.5424 - val_acc: 0.5768 Epoch 37/50 10/9 [==============================] - 60s 6s/step - loss: 1.4231 - acc: 0.9199 - val_loss: 1.5389 - val_acc: 0.6183 Epoch 38/50 10/9 [==============================] - 59s 6s/step - loss: 1.4247 - acc: 0.9199 - val_loss: 1.5372 - val_acc: 0.5934 Epoch 39/50 10/9 [==============================] - 60s 6s/step - loss: 1.4153 - acc: 0.9399 - val_loss: 1.5406 - val_acc: 0.5560 Epoch 40/50 10/9 [==============================] - 60s 6s/step - loss: 1.4074 - acc: 0.9800 - val_loss: 1.5327 - val_acc: 0.6224 Epoch 41/50 10/9 [==============================] - 60s 6s/step - loss: 1.4023 - acc: 0.9800 - val_loss: 1.5305 - val_acc: 0.6100 Epoch 42/50 10/9 [==============================] - 59s 6s/step - loss: 1.3938 - acc: 0.9800 - val_loss: 1.5269 - val_acc: 0.5975 Epoch 43/50 10/9 [==============================] - 60s 6s/step - loss: 1.3897 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.6432 Epoch 44/50 10/9 [==============================] - 60s 6s/step - loss: 1.3828 - acc: 0.9800 - val_loss: 1.5210 - val_acc: 0.6556 Epoch 45/50 10/9 [==============================] - 59s 6s/step - loss: 1.3848 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.5975 Epoch 46/50 10/9 [==============================] - 60s 6s/step - loss: 1.3716 - acc: 0.9800 - val_loss: 1.5216 - val_acc: 0.6432 Epoch 47/50 10/9 [==============================] - 60s 6s/step - loss: 1.3721 - acc: 0.9800 - val_loss: 1.5195 - val_acc: 0.6266 Epoch 48/50 10/9 [==============================] - 60s 6s/step - loss: 1.3622 - acc: 0.9599 - val_loss: 1.5108 - val_acc: 0.6141 Epoch 49/50 10/9 [==============================] - 60s 6s/step - loss: 1.3452 - acc: 0.9399 - val_loss: 1.5140 - val_acc: 0.6432 Epoch 50/50 10/9 [==============================] - 60s 6s/step - loss: 1.3387 - acc: 0.9599 - val_loss: 1.5100 - val_acc: 0.6266
ご覧のとおり、検証精度は最大 64% であり、これは少量のトレーニング データでは良好な結果です。 これを改善するには、レイヤーを追加したり、トレーニング画像を追加したりして、モデルが顔についてさらに学習し、より高い精度を達成できるようにします。
テスト画像を使用してモデルをテストしてみましょう
from keras.models import load_model from keras.preprocessing.image import load_img, save_img, img_to_array from keras_vggface.utils import preprocess_input test_img = image.load_img('test.jpg', target_size=(224, 224)) img_test = image.img_to_array(test_img) img_test = np.expand_dims(img_test, axis=0) img_test = utils.preprocess_input(img_test) predictions = model.predict(img_test) predicted_class=np.argmax(predictions,axis=1) labels = (train_generator.class_indices) labels = dict((v,k) for k,v in labels.items()) predictions = [labels[k] for k in predicted_class] print(predictions) ['RobertDJr']
ロバート ダウニー Jr. の写真をテスト写真として使用すると、予測された顔が真実であることがわかります。
ライブカメラを使って予想!
ウェブカメラからの入力を使用して実装してスキルをテストしてみてはどうでしょうか? OpenCV と Haar Face カスケードを使用して顔を検索し、ネットワーク モデルの助けを借りてその人を認識できます。
最初のステップは、あなたとあなたの友人の顔を準備することです。 データが多ければ多いほど、より良い結果が得られます。
前のステップと同様にネットワークを準備してトレーニングします。トレーニングが完了したら、次の行を追加してカムから入力画像を取得します。
#Load trained model from keras.models import load_model from keras_vggface import utils import cv2 image_size = 224 device_id = 0 #camera_device id model = load_model('my faces.h5') #make labels according to your dataset folder labels = dict(fisrtname=0,secondname=1) #and so on print(labels) cascade_classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') camera = cv2.VideoCapture(device_id) while camera.isOpened(): ok, cam_frame = camera.read() if not ok: break gray_img=cv2.cvtColor(cam_frame, cv2.COLOR_BGR2GRAY) faces= cascade_classifier.detectMultiScale(gray_img, minNeighbors=5) for (x,y,w,h) in faces: cv2.rectangle(cam_frame,(x,y),(x+w,y+h),(255,255,0),2) roi_color = cam_frame [y:y+h, x:x+w] roi color = cv2.cvtColor(roi_color, cv2.COLOR_BGR2RGB) roi_color = cv2.resize(roi_color, (image_size, image_size)) image = roi_color.astype(np.float32, copy=False) image = np.expand_dims(image, axis=0) image = preprocess_input(image, version=1) # or version=2 preds = model.predict(image) predicted_class=np.argmax(preds,axis=1) labels = dict((v,k) for k,v in labels.items()) name = [labels[k] for k in predicted_class] cv2.putText(cam_frame,str(name), (x + 10, y + 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,255), 2) cv2.imshow('video image', cam_frame) key = cv2.waitKey(30) if key == 27: # press 'ESC' to quit break camera.release() cv2.destroyAllWindows()
どちらがいいですか? Keras または Tensorflow
Keras を使用すると、スクリプトを簡単に作成できます。 Keras はそれほど難しくないので、Keras を使って直接書き始めて理解することができます。 よりユーザーフレンドリーで実装が簡単で、モデルを実行するために多くの変数を作成する必要がありません。 したがって、バックエンド プロセスの詳細をすべて理解する必要はありません。
一方、Tensorflowは、任意の計算グラフやモデルを作成したい場合に柔軟性と高度な操作を提供する低レベルの操作です。Tensorflowは、次の助けを借りてプロセスを視覚化することもできます。 テンソルボード および専用のデバッガ ツール。
したがって、それほど複雑ではないディープラーニングの作業を開始したい場合は、Keras を使用してください。Keras は、Tensorflow よりもシンプルで使いやすく、実装も簡単です。ただし、ディープラーニングのプロジェクトや研究で独自のアルゴリズムを記述したい場合は、代わりに Tensorflow を使用する必要があります。
まとめ
それでは、このチュートリアルで説明して実行したすべてのことを要約しましょう。
- バックエンド エンジンの助けを借りて深層学習ネットワークを容易にするために使用される高レベル API の Keras。
- Keras は Python サポートにより使いやすく理解しやすいため、これまでよりも自然に感じられます。 ディープラーニングについて学びたい初心者や、使いやすいAPIを求める研究者に最適です。
- インストールプロセスは簡単で、仮想環境や外部プラットフォームを使用できます。 AWS.
- Keras にはさまざまな種類のネットワーク モデルも付属しているため、利用可能なモデルを事前トレーニングおよび独自のネットワーク モデルの微調整に簡単に使用できます。
- また、深層学習を目的とした世界中のコミュニティのコードから Keras の使用に関するチュートリアルや記事がたくさんあります。