●書籍「実装ディープラーニング」のFAQ を作成しました。
こんにちは。今回は、書籍「実装 ディープラーニング」について、内容を少しご紹介したいと思います。
※「実装 ディープラーニング」の韓国語版です。「딥러닝 부트캠프 with 케라스」
以下は、「はじめに」から抜粋した内容です。
車の自動運転には、いくつかの高いレベルの技術が必要といわれています。その一つが、正確なセンサーとしての役割を担う画像認識です。もう一つは、人に近い、より高度な推測を可能とする強化学習です。本書はこの二つに焦点をあてて、ディープラーニングを使用したサンプルプログラムを示しながら、より実践的な手法を紹介します。
~ 途中略 ~
画像のクラス分類では、1,000層からなるディープラーニングのネットワークも発表されています。最近の主流は、公開されている VGG-16(16層)、ResNet-152(152層)といった学習済みモデル(pre-trained model)を利用し、最後にFine-tuningする方法です。学習済みモデルを利用すると、高い性能を容易に発揮できることが示されています。
本書では、「画像のクラス分類」で、VGG-16、ResNet-152を具体的にどのように利用するかをサンプルプログラムとともに説明し、「物体検出」では、26層のネットワークを利用したYoloや、医療系画像の物体検出にも有効と思われるU字型の23層ネットワークモデルを紹介します。
さらに、より高い推測精度をあげる手法についても紹介します。これは2015年3月に行われた、海中のプランクトンを分類するKaggleの競技で優勝した、ゲント大学やGoogle DeepMind社に所属するメンバーの合同チームが採用した方法です。
~ 途中略 ~
「強化学習」の事例はChainerを利用して紹介しています。約6分ほどで、三目並べに強いコンピュータが出来上がります。
~ 途中略 ~
ディープラーニングではパラメータ計算に行列を利用するため、GPU(Graphics Processing Unit)の使用が事実上必須となります。本書では、ゲーム用パソコンをディープラーニング用機材に転用し、その使用方法についても説明します。
~ 途中略 ~
本書で使用する実践的なサンプルプログラムは、オーム社のホームページからダウンロードし、そのまま実行することができます。
~ 途中略 ~
ディープラーニングというと、理論や数式が難しいというイメージがありますが、恐るるに足らず。まずは手を動かして、実践から始めることを本書は目指しています。
プログラムの知識は必要ですが、本書をなぞっていけば、ディープラーニングを利用した画像認識や
強化学習を体感できると思います。データ量が多いため、GPU付きPCの利用を前提としています。
目次は次のとおりです。
1.1 本書の概要
1.1.1 ディープラーニングの成果
1.1.2 本書で学習する内容―画像のクラス分類、物体検出、強化学習
1.1.3 本書で扱う手法―学習済みモデルの利用
1.2 使用するデータセット
1.3 使用する機材とソフトウェア
1.3.1 使用するフレームワーク
1.3.2 GPU の利用
1.3.3 使用機材―ゲーム用パソコンを転用
1.3.4 OS およびミドルウェア
1.4 ソフトウェアのインストール
1.4.1 OS のインストール
1.4.2 ミドルウェアのインストール
1.5 プログラムのダウンロード
1.5.1 ダウンロードファイル
1.5.2 ダウンロードファイルの解凍
第2章 ネットワークの構成
2.1 順伝播型ネットワーク
2.1.1 全結合ニューラルネットワーク
2.1.2 畳み込みニューラルネットワーク
2.2 畳み込みニューラルネットワーク
2.2.1 畳み込み層
2.2.2 プーリング層
2.2.3 アップサンプリング層
2.3 本書で使用するネットワークのパターン
第3章 基本用語
3.1 ディープラーニングの処理概要
3.2 活性化関数
3.3 損失関数
3.4 確率的勾配降下法
3.4.1 重み更新の計算例
3.4.2 モメンタム
3.5 誤差逆伝播法
3.6 過学習
3.6.1 バリデーションデータセットを使ったエポック数の決定
3.6.2 正則化
3.6.3 ドロップアウト
3.7 データ拡張と前処理
3.8 学習済みモデル
3.9 学習係数の調整
第4章 画像のクラス分類
4.1 概要
4.2 共通データの作成
4.2.1 画像データセットのダウンロード
4.2.2 データの抽出と基本データセットの作成
4.2.3 データ拡張と共通データセットの作成
4.3 9 層のネットワークでクラス分類
4.3.1 ネットワークの概要
4.3.2 学習とモデルの作成
4.3.3 モデルの読み込みと推測の実行
4.3.4 実行例
4.4 VGG-16 でクラス分類―16 層の学習済みモデル
4.4.1 VGG-16 の概要
4.4.2 プログラムの概要.
4.4.3 実行例
4.5 ResNet-152 でクラス分類―152 層の学習済みモデル
4.5.1 ResNet の概要
4.5.2 実行環境のインストール
4.5.3 プログラムの概要
4.5.4 実行例
4.6 推測精度のさらなる向上
4.6.1 概要
4.6.2 複数モデルの利用
4.6.3 Stacked Generalization
4.6.4 Self Training
第5章 物体検出
5.1 物体の位置を検出―26 層のネットワーク
5.1.1 物体の位置・大きさ・種類の推測
5.1.2 使用するソフトウェアとその特徴
5.1.3 実行環境のインストール
5.1.4 学習済みモデルを用いて物体検出
5.1.5 オブジェクトを学習して物体検出
5.2 物体の形状を検出―23 層のネットワーク
5.2.1 物体の位置・大きさ・形状の推測
5.2.2 使用するモデルとその特徴
5.2.3 プログラムの概要
5.2.4 実行例
第6章 強化学習―三目並べに強いコンピュータを育てる
6.1 強化学習
6.1.1 強化学習とは
6.1.2 Q 学習
6.1.3 DQN
6.2 基本的な枠組み
6.2.1 環境とエージェント
6.2.2 処理の概要
6.2.3 環境内のルール
6.3 実行環境のインストール
6.4 Q 学習とディープラーニング
6.5 実行例
付 録
付録A Yolo 用「オブジェクトの位置情報」の作成方法
A.1 BBox-Label-Tool のインストール
A.2 「オブジェクトの位置情報」の作成
付録B ソースリスト
COLUMN(コラム)
・全結合層と畳み込み層の違い
・勾配消失問題とReLU
・VGG-16 の作成経緯
・ベイズと半教師あり学習
第1章は本の内容説明、2章、3章は、本書で実践するディープラーニングの基本用語について説明しています。はじめに第4章から読み始めてプログラムを実行し、わからない用語について、2章、3章にかえって確認するという方法もお勧めです。
書籍「実装 ディープラーニング」は、オーム社の書籍紹介ページ、本の通信販売サイト、および全国の書店等からご購入いただくことができます。
書籍「実装ディープラーニング」 FAQ
このFAQは、書籍「実装ディープラーニング」(2016、オーム社)に対し、読者からいただいた「お問い合わせ」の内容を基に作成しました。
いくつかの「お問い合わせ」の内容は、他の読者の皆様にも有益だと思いますので、FAQとして公開させていただきました。(更新日 2018年9月26日)
<お問合せリスト>
<No.1>
9_Layer_CNN.py(p.106、9層の学習)を実行すると、read_train_data関数で、「ValueError: axes don’t match array」と表示されて、エラーが発生する。
<回答>
プログラム「9_Layer_CNN.py」を実行時、学習データ(共通データ)がない場合に、上記のメッセージが表示されるようです。一旦、/home/taro/data/Caltech101 のCaltech101ディレクトリ自体を削除し、P87のコマンド4.3 の実行から、再度行ってみることをお薦めします。
migration_data_caltech101.pyを実行後、共通データが無事作成されると、例えば image_0004.jpg 画像が下記の場所に作成されます。
~/data/Caltech-101/train/0/0/image_0004.jpg
※data_augmentation.pyの実行後は、
~/data/Caltech-101/train/0/0/0/image_0004.jpg
に画像が配置されます。(data_augmentation.pyの実行は数分かかります)
もし上記のディレクトリに image_0004.jpg が存在しない場合は、「共通データの作成」時に、何か失敗、あるいは操作手順が抜けている可能性がありますので、ご確認をお願いできればと思います。
また、migration_data_caltech101.py、data_augmentation.pyを複数回実行すると、os.rename関数でエラーが生じる場合があります。この場合も、一旦、/home/taro/data/Caltech101 のCaltech101ディレクトリ自体を削除し、P87のコマンド4.3 の実行から、再度行ってみることをお薦めします。
<No.2>
「MacBookPro+Virtualbox+ubuntu」(CPUのみでの実行)の環境で、9_Layer_CNN.pyを実行すると、「g++ not detected」というエラーが発生する。
<回答>
MacBookPro+Virtualboxの環境ですと、GPUの利用は本書の設定ではうまくいかない可能性があります。(おそらくGPUを使用しない、CPUのみでの実行となります)
「g++ not detected」というエラーは、g++がうまく動いていない、あるいはインストールされていない場合に表示されるようです。
KerasはバックでTheanoを使用していますが、Theanoがg++ を使用しているようです。ちなみに、(書籍の)システム環境でg++ のバージョンを表示させると、次のようになります。
taro@taro-desktop:~$ g++ –version ←打ち込んだコマンドです。
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
一度、ご利用の環境について、g++のバージョン等のご確認をお願いできればと思います。
g++ への対処については、以下のコマンドを実行することで対応可能です。
(このコマンドは読者の方から教えていただきました。CPUでの実行の場合、BLASが別途必要とのことです。ありがとうございました。)
sudo apt-get install -y g++ libblas-dev
source activate main
export THEANO_FLAGS=blas.ldflags=-lblas,mode=FAST_RUN,device=cpu,floatX=float32,optimizer_excluding=conv_dnn
python ./9_Layer_CNN.py train
<No.3>
GPUに「GeForce GTX750Ti」を使用し、9_Layer_CNN.pyを実行すると、「out of memory」というエラーが発生する。
<回答>
書籍「実装ディープラーニング」で使用しているGTX1070(GPU)はメモリ8GB、GTX750Ti(GPU)は2GBです。メモリ容量が1/4となります。GTX750Ti(GPU)の環境での動作検証は、残念ながら本書では行っておりません。
パソコンのメモリは十分搭載してあるということであれば、Train画像のメモリへのロードなどの問題ではなく、GTX750Ti(GPU)のメモリの不足が原因で、「out of memory」エラーが表示されている可能性があるように思います。
書籍のp49に以下のように記載させていただきました。
行例計算はGPUを使用します。GPUのメモリ容量が大きければ、大きな行列を取り扱うことができます。すなわちバッチサイズを大きくすることができるので、学習が速く進みます。バッチサイズは、GPUのメモリ容量等を考慮し調整することになります。
上記の例では、8×17の大きさのデータがGPUに渡され、ミニバッチが実行され(行列計算)、ミニバッチ学習実行ごとに、ニューラルネットワークの重み(パラメータ)が更新されます。1エポックで、1,250回重みが更新されることになります。
書籍には記載しなかったのですが、使用しているGPUのメモリ容量に対し、大きいバッチサイズで学習を実行しようとすると、「out of memory」でエラーとなってしまうようです。
9_Layer_CNN.py では、学習時のバッチサイズ(batch_size)を 64 として行っています。
( p102 ③batch_size をご参照ください)
この「64」を、順次、32, 16, 8 , 4 などの小さな値に修正し、9_Layer_CNN.pyの実行を試してみると、(おそらくバッチサイズが 16 か 8 あたりで)正常に稼働するのではないかと推察いたします。
(読者の方から、16 で正常動作したと教えていただきました。ありがとうございました。)
バッチサイズの値を小さくすると、GPUでの一回の計算量が減るので、学習に時間がかかるようになります。また、推測結果も書籍とは(おそらく若干)異なってしまいます。
4.4節のVGG-16 の利用では、パラメータ数が多いので、GTX750Ti(GPU)を利用する場合は、さらにバッチサイズを小さくする必要があるかもしれません。GPUの利用方法は、Torch、Chainer でも同様で、GPUのメモリが小さいと、それに応じてバッチサイズを小さくする必要があります。
例えば、書籍では以下のように設定しています。
・Torch の利用(p128) -batchSize 10
書籍ではバッチサイズを10にしています。
・Chainerの利用(p256) self.batch_size = 32
書籍ではバッチサイズを32にしています。
GTX750Ti(GPU)を利用する場合は、このバッチサイズを書籍の値よりさらに小さな値にする必要があるように思います。
(※メモリ2GBのGPUでは、VGG-16やResnet-152など多層ニューラルネットワークの実行は難しいかもしれません。)
補助電源が不要なGPUである、GeForce GTX1050(メモリ2GB)、GTX1050 Ti(メモリ4GB)などの利用においても、同様にバッチサイズを書籍の値より小さな値にする必要があります。
<No.4>
KerasのバックエンドにTensorFlowを指定すると、エラーが発生する。
<回答>
Kerasでは、バックエンドにTheanoやTensorflowを使用可能ですが、その関数には若干の差異や、あるいは一方ではうまく稼働しない、という関数(非互換)があります。すなわち、Theanoでは正常に動いたプログラムが、Tensorflowではエラーがでて動かないというケースもありますので、注意が必要です。
例えば、TheanoとTensorflowでは、2次元データ (例えば画像) の扱いが、
〇Theano : (channels, rows, cols)
〇Tensorflow : (rows, cols, channels)
のように、異なっています。
(参考 : https://keras.io/ja/backend/#kerasjson )
私たちも過去に「Deconvolution2D」がTheanoではうまく動かないという事象を経験しました。(Tensorflowでは正常に稼働しました。今は既に修正されているかもしれません。)
書籍ではKerasのバージョンは1.0.8を使用して説明しています(Pythonのバージョンは2.7)。バージョン1.0.8ではKerasのバックエンドはTheanoが初期設定でしたが、Kerasのバージョン1.1.0からはTensorflowが初期設定となりました。(最新バージョンのKerasもTensorflowが初期設定です)
書籍では、バックエンドにTheanoを使用する前提で、プログラムを作成しています。このため、最新のKerasをインストールした場合、初期設定ではTensorflowを使用するため、一部のプログラムでエラーが発生してしまいます。
Kerasを一度実行すると、~/.keras/keras.jsonという定義ファイルが作成されます。Theanoがバックエンドになっている場合、keras.jsonファイルの内容は次の通りです。
{
“image_dim_ordering”: “th”,
“epsilon”: 1e-07,
“floatx”: “float32″,
“backend”: “theano”
}
Theanoがバックエンドになっているか、~/.keras/keras.jsonファイルの内容をご確認ください。
(参考 : https://keras.io/ja/backend/ )
<No.5>
9_Layer_CNN.pyを実行するとワーニングがでる。
<回答>
9_Layer_CNN.pyを実行すると下記のワーニングがでるというお問合せです。
UserWarning: Your cuDNN version is more recent than the one Theano officially supports. If you see any problems, try updating Theano or downgrading cuDNN to version 5.
確認したところ、上記のワーニングはバックエンドとしてTheanoを使った場合に毎回でてしまうようです。
書籍では、Torch でcuDNNを使用するためにcuDNNをインストールしました。Keras(9_Layer_CNN.py)の実行では、cuDNNを未使用としたため、このワーニングはでていたものの、あまり問題視しておりませんでした。
しかしながら、ワーニングがでれば不安に思われることは当然のことですので、本来は書籍にも、このことについて触れるべきでした。
<No.6>
書籍とは異なるバージョンがダウンロードされる。
<回答>
書籍(p26)ではダウンロードのファイル名が
「cuda-repo-ubuntu1404-8-0-local_8.0.44-1_amd64.deb」
ですが、実際にダウンロードしたファイル名は
「cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64.deb」
となっており、動作に影響はないかというお問い合わせです。
「cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64.deb」を使用しても動作には影響がないようです。
実際、今年(2017年)の5月中旬に「cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64.deb」
を使用して、本書の内容を実行したところ、正常に動作いたしました。
このようにバージョンアップされたツールは、他にもあるようです。
P31の「Anacondaのインストール」では、
「Anaconda2-4.2.0-Linux-x86_64.sh」
となっていますが、現時点(2017年6月)では、
「Anaconda2-4.3.1-Linux-x86_64.sh」
がダウンロードされるようです。「Anaconda2-4.3.1-Linux-x86_64.sh」でも動作に
問題はありません。
<No.7>
書籍「実装ディープラーニング」に掲載されているPython2.7用プログラムは、Python3や最新バージョンのKeras でも動きますか?
<回答>
このお問い合わせは、いつかは、 いただくことになるだろうと思っていました。
書籍では、
OS : ubuntu-14.04.5
Python : バージョン2.7
Keras : バージョン1.0.8
を使用しています。
そこで、以下の3つのプログラムを対象に、次のようなシステム環境で実行するための、プログラムの修正ポイントについて記載します。
・データ拡張 ( data-augumentation.py 、第4章2節)
・Keras 9層のニューラルネットワーク ( 9_Layer_CNN.py 、第4章3節)
・Keras 16層(VGG-16を使用)のニューラルネットワーク ( VGG_16.py 、第4章4節)
【システム環境】
・Ubuntu16.04 (ubuntu-16.04.2-desktop-amd64.iso)
・python 3.4.5 (conda create –name main python=3.4.5 でインストール)
・keras 2.0.5 (バックエンドには Theano を使用)
・Anaconda 4.4.0 (Python 3.6 version)をインストール
(参考 https://www.continuum.io/downloads)
また、付随するツールのバージョンは以下の通りです。
(opencv以外はpip3コマンドでインストール)
pip3 (apt-get install python3-pip でインストール)
numpy 1.13.0
scipy 0.19.0
matplotlib 2.0.2
pandas 0.20.2
scikit-image 0.13.0
h5py 2.7.0
theano 0.9.0
opencv3 3.2.0 (conda install -c menpo opencv3=3.2.0 でインストール)
※OS Ubuntu16系は、PCの機材(マザーボードの種類等)によっては動かない場合が
ありますので注意が必要です。
※インストール手順は、書籍「実装ディープラーニング」の記載内容と同じです。
(1) データ拡張 ( data-augumentation.py )につて
〇修正点
関数xrange() を range() に変更 (Python3 対応)
(2) Keras 9層のニューラルネットワーク(9_Layer_CNN.py)について
〇修正点
実行時、kerasのバージョンの違いによるワーニングはでますが、変更箇所はありません。
なお、ホームディレクトリにあるkeras.jsonファイル(隠しファイル)の設定は、以下の通りです。
(keras2 用の形式です)
{
”image_data_format”: “channels_first”,
”epsilon”: 1e-07,
”backend”: “theano”,
”floatx”: “float32″
}
(3) Keras 16層(VGG-16を使用)のニューラルネットワーク(VGG_16.py)について
学習済みモデルVGG-16への対応が変わりましたので、修正が必要となります。
kerasには、次の5つの学習済みモデル(pre-trained model)が既に関数として用意されています。
(詳細については https://keras.io/ja/applications/#vgg16 を参照してください)
・Xception
・VGG16
・VGG19
・ResNet50
・InceptionV3
keras 2.0.5を利用するにあたり、ここでは上記のVGG16用の関数の使用例を記載します。
VGG16用の関数を使用すると、プログラムの実行とともに、VGG16用の重みデータが
自動的にダウンロードされます。
〇VGG_16.py の修正点
①インポートの追加
(追加)
from keras.applications.vgg16 import VGG16
from keras.layers import Input
from keras.models import Model
②モデル構築箇所を修正
関数 vgg16_model() を以下のように修正します。
def vgg16_model():
input_tensor = Input(shape=(3, 224, 224))
vgg16_model = VGG16(include_top=True, weights=’imagenet’,
input_tensor=input_tensor, input_shape=(3, 224, 224))
#16層の最後の層(fc 1000)を削除
vgg16_model.layers.pop()
# fine tune用に、各レイヤーの重みを固定にしないための処理
for layer in vgg16_model.layers:
layer.trainable = True
#新たに最後の層用に6クラス分類用の出力層を作成
last = vgg16_model.layers[-1].output
x = Dense(6, activation=’softmax’)(last)
# モデルを統合
model = Model(inputs=vgg16_model.input, outputs=x)
#model.summary()
# ロス計算や勾配計算に使用する式を定義する。
sgd = SGD(lr=1e-3, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd,
loss=’categorical_crossentropy’, metrics=[“accuracy”])
return model
※実行時、kerasのバージョンの違いによるワーニングが多少でます。
<No.8>
学習済みモデル「VGG-16」を使用すると、validation lossの値が下がらない(あるいは収束しない)。
<回答>
これは読者からのお問い合わせではありませんが、学習済みモデル「VGG-16」を使用する場合の一般的な注意点として記載いたします。
書籍「実装ディープラーニング」では、画像の前処理に「Global contrast normalization」を使用しています。(p96参照)
「モデルの違いによる推測精度の比較」という観点から、9 層のモデル(9_Layer_CNN.py)と16層のモデル(VGG-16、VGG_16.py)は、ともに「Global contrast normalization」を前処理として(書籍では)使用しています。
しかし、VGG-16モデルを作成したVGGチームは、トレーニングデータセットの画像のRGB値の平均値を求め、その平均値を個々の画像のRGB値から引くことで、画像の前処理を行っています。
(参照 Karen Simonyan & Andrew Zisserman, Very Deep Convolutional Networks for Large Scale Image Recognition, v6, 2015)
すなわち、以下の処理を各画像に対して行っています。
meanpix=[103.939,116.779,123.68] img = img.astype(np.float32, copy=False)
for c in range(3):
img[:,:,c] = img[:,:,c]-meanpix
書籍のプログラムVGG_16.pyに対して、「Global contrast normalization」から「RGB値の平均値を引く」という前処理に変更するためには、以下のようにプログラムを修正します。
<プログラム VGG_16.py>
# 正規化(GCN)実行
# img -= np.mean(img)
# img /= np.std(img)
↓
(追加)
#meanを引く。103.939,116.779,123.68の値はRGBの平均値
meanpix=[103.939,116.779,123.68]
img = img.astype(np.float32, copy=False)
for c in range(3):
img[:,:,c] = img[:,:,c]-meanpix
「Global contrast normalization」を使用した前処理と、「RGB値の平均値を引く」という前処理を比べると、後者のほうが収束は速い、すなわちエポック数が少なくてすむようです。
これは、書籍で使用した「Caltech 101」の画像以外でも同様です。
<No.9>
「CUDA Toolkit 8」(P25)、「Anaconda2-4.2.0」(P31)がダウンロードできない。
<回答>
CUDAやAnacondaは徐々にバージョンアップされています。
○書籍で使用している「CUDA Toolkit 8」は、
https://developer.nvidia.com/cuda-toolkit-archive
からダウンロードすることができます。
○書籍で使用している「Anaconda2-4.2.0-Linux-x86_64.sh」は、
https://repo.continuum.io/archive/
からダウンロードすることができます。