書籍「実装 ディープラーニング」のご紹介

●書籍「実装ディープラーニング」のFAQ を作成しました。

こんにちは。今回は、書籍「実装 ディープラーニング」について、内容を少しご紹介したいと思います。

以下は、「はじめに」から抜粋した内容です。

車の自動運転。この夢のような話も、数年後には普通のことになっているかもしれません。
車の自動運転には、いくつかの高いレベルの技術が必要といわれています。その一つが、正確なセンサーとしての役割を担う画像認識です。もう一つは、人に近い、より高度な推測を可能とする強化学習です。本書はこの二つに焦点をあてて、ディープラーニングを使用したサンプルプログラムを示しながら、より実践的な手法を紹介します。

~ 途中略 ~

 画像のクラス分類では、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.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として公開させていただきました。(更新日 2017年6月1日)


<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/0/image_0004.jpg

 もし上記のディレクトリに 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に以下のように記載させていただきました。

 一方、データを小分けにして学習する方法もあります。例えばトレーニングデータセットを8行単位に区切って学習する方法で、8×17の小さな行列を使って学習し、この学習(重みの更新)を1,250回繰り返すことで、10,000サンプルの学習を行います。このような学習方法はミニバッチ学習と呼ばれています。一回の学習で利用するサンプル数をバッチサイズといいます。8行単位に区切って学習する場合は、バッチサイズは8になります。
 行例計算は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」でも動作に
問題はありません。