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 のバックエンド

Theanoは、カナダのケベック州モントリオール大学のMILAグループによって開発されたオープンソースプロジェクトです。これは、最初に広く使用されたフレームワークです。 Python Numpy または Scipy を使用した数学演算の多次元配列に役立つライブラリ。Theano は GPU を使用して計算を高速化できるほか、勾配を計算するためのシンボリック グラフを自動的に構築することもできます。Theano の Web サイトでは、数値的に不安定な式を認識し、より安定したアルゴリズムで計算できると説明されており、これは不安定な式に非常に役立ちます。

TensorFlow のバックエンド

一方、Tensorflow はディープラーニング フレームワークの新星です。 Google の Brain チームによって開発された、最も人気のある深層学習ツールです。 多くの機能を備えており、研究者は深層学習を目的としたこのフレームワークの開発に貢献しています。

CNTKのバックエンド

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 への Keras のインストール

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 セージメーカー コンソールを開き、「ノートブックインスタンスの作成」をクリックします。

Keras をインストールする Amazon セージメーカー

ステップ2) 詳細を入力する

  1. ノートブックの名前を入力します。
  2. IAM ロールを作成します。 AMI ロールが作成されます Amazon 次の形式の IAM ロール AmazonSageMaker-Executionrole-YYYYMMDD|HHmmSS。
  3. 最後に、[ノートブック インスタンスの作成] を選択します。しばらくすると、 Amazon Sagemaker はノートブック インスタンスを起動します。

Keras をインストールする Amazon セージメーカー

注意: VPC からリソースにアクセスする場合は、直接インターネットアクセスを有効に設定してください。そうしないと、このノートブックインスタンスはインターネットにアクセスできないため、モデルのトレーニングやホスティングができなくなります。

ステップ 3) インスタンスを起動する

「開く」をクリックしてインスタンスを起動します

Keras をインストールする Amazon セージメーカー

ステップ 4) コーディングを開始する

In Jupyter, [新規] > [conda_tensorflow_p36] をクリックすると、コーディングの準備が整います。

Keras をインストールする Amazon セージメーカー

Linux に Keras をインストールする

バックエンド エンジンとして Tensorflow を使用して Keras を有効にするには、最初に Tensorflow をインストールする必要があります。 このコマンドを実行して、CPU (GPU なし) で tensorflow をインストールします。

pip install --upgrade tensorflow

tensorflow の GPU サポートを有効にしたい場合は、このコマンドを使用できます

pip install --upgrade tensorflow-gpu

Linux に Keras をインストールする

チェックインしましょう 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 の使用を開始する前に、構成ファイルを開いて、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

次に、このスクリプトを実行します

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 モデルアーキテクチャ

VGG16 モデルアーキテクチャ

source

データを AWS S3 バケットにアップロードする

トレーニング プロセスでは、飛行機、車、猫、犬、花、果物、バイク、人物など 8 つの異なるクラスの自然画像の写真を使用します。まず、データをアップロードする必要があります Amazon S3バケット。

Amazon S3バケット

ステップ1) S3アカウントにログインしたら、クロックを設定してバケットを作成しましょう バケットを作成します。

AWS S3 バケットへのデータのアップロード

ステップ2) 次に、アカウントに応じてバケット名とリージョンを選択します。 バケット名が使用可能であることを確認してください。 その後クリックしてください 作成します。

AWS S3 バケットへのデータのアップロード

ステップ3) ご覧のとおり、バケットを使用する準備ができています。 ただし、ご覧のとおり、アクセスは公開されていないため、自分だけのプライベートに保ちたい場合に適しています。 バケットのプロパティでこのバケットをパブリック アクセス用に変更できます。

AWS S3 バケットへのデータのアップロード

ステップ4) ここで、トレーニング データをバケットにアップロードし始めます。 ここでは、トレーニングとテストのプロセス用の画像で構成される tar.gz ファイルをアップロードします。

AWS S3 バケットへのデータのアップロード

ステップ5) ファイルをクリックして、 リンク ダウンロードできるようにします。

AWS S3 バケットへのデータのアップロード

データの準備

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 を使用した顔認識ニューラル ネットワーク

なぜ承認が必要なのか

人の顔、物の種類、顔から推定される年齢を簡単に認識または識別したり、その人の顔の表情を知ることを容易にするためには、認識が必要です。

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 の使用に関するチュートリアルや記事がたくさんあります。