Keras チュートリアル: Keras とは何ですか? Pythonでのインストール方法【例】

ケラスとは何ですか?

ケラス は、Python で書かれたオープンソースのニューラル ネットワーク ライブラリで、Theano または Tensorflow 上で実行されます。 モジュール式で高速かつ使いやすいように設計されています。 開発したのは、Google エンジニアのフランソワ・ショレ氏です。 Keras は低レベルの計算を処理しません。 代わりに、「バックエンド」と呼ばれる別のライブラリを使用してそれを実行します。

Keras は、低レベル API の高レベル API ラッパーであり、TensorFlow、CNTK、または Theano 上で実行できます。 Keras ハイレベル API は、モデルの作成、レイヤーの定義、または複数の入出力モデルのセットアップ方法を処理します。 このレベルでは、Keras は損失関数とオプティマイザー関数、フィット関数を使用したトレーニング プロセスを使用してモデルをコンパイルします。 Python の Keras は、計算グラフの作成、テンソルやその他の変数の作成などの低レベル API を処理しません。これは、「バックエンド」エンジンによって処理されているためです。

バックエンドとは何ですか?

バックエンドは、Tensorflow や Theano などの他のライブラリの助けを借りて、テンソル積、畳み込み、その他多くのものなど、すべての低レベルの計算を実行する Keras の用語です。 したがって、「バックエンド エンジン」がモデルの計算と開発を実行します。 Tensorflow はデフォルトの「バックエンド エンジン」ですが、設定で変更できます。

Theano、Tensorflow、CNTK バックエンド

Theano のバックエンド

Theano は、カナダのケベック州モントリオール大学の MILA グループによって開発されたオープンソース プロジェクトです。 これは、広く使用された最初のフレームワークでした。 これは、Numpy または Scipy を使用した数学的演算のための多次元配列に役立つ Python ライブラリです。 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

計測パラメータ ケラス テンソルフロー
高レベル API ラッパー 低レベル API
とplexITY 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
  • Tensorflow Android を搭載した Android、
  • .js をサポートする Web ブラウザ
  • クラウドエンジン
  • ラズベリーパイ

マルチ GPU のサポート

Keras を単一の GPU でトレーニングすることも、複数の GPU を同時に使用することもできます。 Keras にはデータ並列処理のサポートが組み込まれているため、大量のデータを処理し、トレーニングに必要な時間を短縮できます。

ケラスの欠点

低レベルの API を処理できない

Keras は、Tensorflow、Theano、CNTK などの他のフレームワークまたはバックエンド エンジン上で実行される高レベル API のみを処理します。 したがって、Keras にはすでに事前設定されたレイヤーがあるため、研究目的で独自の抽象レイヤーを作成したい場合にはあまり役に立ちません。

Keras のインストール

このセクションでは、Keras をインストールするために利用できるさまざまな方法を検討します。

直接インストールまたは仮想環境

どちらがいいですか? 現在の Python に直接インストールしますか、それとも仮想環境を使用しますか? プロジェクトが多い場合は、仮想環境を使用することをお勧めします。 その理由を知りたいですか? これは、プロジェクトごとに異なるバージョンの keras ライブラリが使用される可能性があるためです。

たとえば、古い Keras-Theano バックエンドで OpenCV 3.5 を使用する Python 3.3 が必要なプロジェクトがありますが、他のプロジェクトでは、最新バージョンの Keras と、Python 3.6.6 をサポートするバックエンドとして Tensorflow を使用する必要があります。

Keras ライブラリが互いに競合することは望ましくありません。したがって、仮想環境を使用して特定のタイプのライブラリでプロジェクトをローカライズするか、クラウド サービスなどの別のプラットフォームを使用して次のような計算を行うことができます。 Amazon ウェブサービス。

Keras のインストール Amazon ウェブサービス(AWS)

Amazon Web サービスは、研究者やその他の目的にクラウド コンピューティング サービスと製品を提供するプラットフォームです。 AWS はハードウェア、ネットワーク、データベースなどをレンタルして、インターネットから直接使用できるようにしています。深層学習目的で人気のある AWS サービスの XNUMX つは、 Amazon マシンイメージディープラーニングサービスまたはDL

AWS の使用方法の詳細については、こちらを参照してください。 チュートリアル

AMI に関する注意: 次のようになります。wing 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) de を入力します。tails

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

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

Note: 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.
>>> 

Windows に Keras をインストールする方法

インストールする前に テンソルフロー Keras の場合は、Python、pip、virtualenv をインストールする必要があります。 これらのライブラリをすでにインストールしている場合は、次のステップに進む必要があります。それ以外の場合は、次の手順を実行します。

ここからダウンロードして Python 3 をインストールします

実行して pip をインストールします この

このコマンドで virtualenv をインストールします

pip3 install –U pip virtualenv

インストールを開始する Microsoft Visual 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.畳み込み層

これは、入力層として畳み込み層を使用し、入力形状が 320x320x3、サイズが 48x3 の 3 個のフィルターがあり、活性化関数として ReLU を使用する Keras Python の例です。

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. MaxPooling 層

入力表現をダウンサンプリングするには、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 モデルのアーキテクチャ

ネットワークモデル

VGGフェイスとは何ですか? これは、Parkhi、Omkar M. らによって導入された Deep Face Recognition の Keras 実装です。 「深層顔認識」。 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 は、次の助けを借りてプロセスを視覚化することもできます。 テンソルボード および専用のデバッガ ツール。

したがって、それほど多くのコストを必要とせずにディープラーニングの作業を開始したい場合は、plexKeras を使用してください。 Keras は Tensorflow よりもシンプルで使いやすく、実装も簡単だからです。 ただし、深層学習プロジェクトや研究で独自のアルゴリズムを作成したい場合は、代わりに Tensorflow を使用する必要があります。

まとめ

このチュートリアルで説明し実行したことをすべてまとめてみましょう。

  • バックエンド エンジンの助けを借りて深層学習ネットワークを容易にするために使用される高レベル API の Keras。
  • Keras は Python サポートにより使いやすく理解しやすいため、これまでよりも自然に感じられます。 ディープラーニングについて学びたい初心者や、使いやすいAPIを求める研究者に最適です。
  • インストールプロセスは簡単で、仮想環境や外部プラットフォームを使用できます。 AWS.
  • Keras にはさまざまな種類のネットワーク モデルも付属しているため、利用可能なモデルを事前トレーニングおよび独自のネットワーク モデルの微調整に簡単に使用できます。
  • また、深層学習を目的とした世界中のコミュニティのコードから Keras の使用に関するチュートリアルや記事がたくさんあります。