下丸子のコネクショニスト

機械学習、人工知能などの話題について触れます。

SSD: Single Shot MultiBox Detector Caffe Install Log on Ubuntu 14.04 LTS with GTX 1050Ti

f:id:yukisaito:20170529015409p:plain

(visualization results on the video streaming)

 

Single Shot MultiBox Detector (SSD)

[1512.02325] SSD: Single Shot MultiBox Detector

is faster than faster R-CNN, described in : page 42 of

www.slideshare.net

I tried to install SSD caffe on Ubuntu 14.04 LTS with GTX 1050Ti.

My CUDA version is 8.0 and cuDNN is 6.0.

 

First of all, install prerequired softwares of official BLVC caffe:

Caffe | Deep Learning Framework

and opencv with ffmpeg on python (cv2).

 

Following author's readme,

github.com

git clone https://github.com/weiliu89/caffe.git

mv caffe SSD

cd SSD

git checkout ssd

here, I define this SSD folder as $SSD.

Copy Makefile.config from your latest caffe folder to the $SSD.

mkdir $SSD/build

cd $SSD/build

cmake ..

make all -j8

then I got errors *1

 

For update the repo, I tried to merge newer caffe following by:

hirotaka-hachiya.hatenablog.com

cd $SSD

git remote add caffe https://github.com/BVLC/caffe.git

git fetch caffe

git merge -X theirs caffe/master

cd build

rm -rf *

# Note that following steps were not correct! It may cause errors while running sample codes.

cmake ..

make all -j8

make install -j8

make pycaffe -j8

make runtest -j8

 

Let's try to evaluate the trained model.

Downdload the model files:

models_VGGNet_VOC0712_SSD_300x300.tar.gz - Google ドライブ

export CAFFE_ROOT=$SSD

export PYTHONPATH=$SSD/python/:$PYTHONPATH

cd $SSD

tar xvf models_VGGNet_VOC0712_SSD_300x300.tar.gz(downloaded model files)

python examples/ssd/ssd_pascal_video.py

 However, I got errors *2

I think this error is caused by overwriting "$SSD/python/caffe/net_spec.py" with git merge. So I just replaced merged "$SSD/python/caffe/net_spec.py" with "https://github.com/weiliu89/caffe/blob/ssd/python/caffe/net_spec.py", and tried to build SSD caffe again.

cd $SSD/build

rm -rf *

cmake ..

make all -j8

make install -j8

make pycaffe -j8

make runtest -j8

cd $SSD

python examples/ssd/ssd_pascal_video.py

Then I got visualization of SSD results on the sample video!

f:id:yukisaito:20170529015409p:plain

 

For training/evaluation, follow "Preparation" and "Train/Eval"of

https://github.com/weiliu89/caffe/tree/ssd

 

 

*1:/home/caffe/SSD/include/caffe/util/cudnn.hpp(112): error: too few arguments in function call
/home/caffe/SSD/include/caffe/util/cudnn.hpp(112): error: too few arguments in function call
/home/caffe/SSD/include/caffe/util/cudnn.hpp(112): error: too few arguments in function call
/home/caffe/SSD/include/caffe/util/cudnn.hpp(112): error: too few arguments in function call
1 error detected in the compilation of "/tmp/tmpxft_00007bb9_00000000-5_rmsprop_solver.cpp4.ii".
/home/caffe/SSD/include/caffe/util/cudnn.hpp(112): error: too few arguments in function call
/home/caffe/SSD/include/caffe/util/cudnn.hpp(112): error: too few arguments in function call
1 error detected in the compilation of "/tmp/tmpxft_00007ba6_00000000-5_adagrad_solver.cpp4.ii".
CMake Error at cuda_compile_generated_rmsprop_solver.cu.o.cmake:264 (message):
  Error generating file
  /home/caffe/SSD/build/src/caffe/CMakeFiles/cuda_compile.dir/solvers/./cuda_compile_generated_rmsprop_solver.cu.o
make[2]: *** [src/caffe/CMakeFiles/cuda_compile.dir/solvers/cuda_compile_generated_rmsprop_solver.cu.o] Error 1
make[2]: *** Waiting for unfinished jobs....
1 error detected in the compilation of "/tmp/tmpxft_00007baa_00000000-5_nesterov_solver.cpp4.ii".
CMake Error at cuda_compile_generated_adagrad_solver.cu.o.cmake:264 (message):
  Error generating file
  /home/caffe/SSD/build/src/caffe/CMakeFiles/cuda_compile.dir/solvers/./cuda_compile_generated_adagrad_solver.cu.o
make[2]: *** [src/caffe/CMakeFiles/cuda_compile.dir/solvers/cuda_compile_generated_adagrad_solver.cu.o] Error 1
CMake Error at cuda_compile_generated_nesterov_solver.cu.o.cmake:264 (message):
  Error generating file
  /home/caffe/SSD/build/src/caffe/CMakeFiles/cuda_compile.dir/solvers/./cuda_compile_generated_nesterov_solver.cu.o
make[2]: *** [src/caffe/CMakeFiles/cuda_compile.dir/solvers/cuda_compile_generated_nesterov_solver.cu.o] Error 1
1 error detected in the compilation of "/tmp/tmpxft_00007bb8_00000000-5_adadelta_solver.cpp4.ii".
/home/caffe/SSD/include/caffe/util/cudnn.hpp(112): error: too few arguments in function call
CMake Error at cuda_compile_generated_adadelta_solver.cu.o.cmake:264 (message):
  Error generating file
  /home/caffe/SSD/build/src/caffe/CMakeFiles/cuda_compile.dir/solvers/./cuda_compile_generated_adadelta_solver.cu.o
make[2]: *** [src/caffe/CMakeFiles/cuda_compile.dir/solvers/cuda_compile_generated_adadelta_solver.cu.o] Error 1
1 error detected in the compilation of "/tmp/tmpxft_00007bb7_00000000-5_adam_solver.cpp4.ii".
1 error detected in the compilation of "/tmp/tmpxft_00007bcc_00000000-5_sgd_solver.cpp4.ii".
CMake Error at cuda_compile_generated_adam_solver.cu.o.cmake:264 (message):
  Error generating file
  /home/caffe/SSD/build/src/caffe/CMakeFiles/cuda_compile.dir/solvers/./cuda_compile_generated_adam_solver.cu.o
make[2]: *** [src/caffe/CMakeFiles/cuda_compile.dir/solvers/cuda_compile_generated_adam_solver.cu.o] Error 1
CMake Error at cuda_compile_generated_sgd_solver.cu.o.cmake:264 (message):
  Error generating file
  /home/caffe/SSD/build/src/caffe/CMakeFiles/cuda_compile.dir/solvers/./cuda_compile_generated_sgd_solver.cu.o
make[2]: *** [src/caffe/CMakeFiles/cuda_compile.dir/solvers/cuda_compile_generated_sgd_solver.cu.o] Error 1
1 error detected in the compilation of "/tmp/tmpxft_00007bd2_00000000-5_sigmoid_cross_entropy_loss_layer.cpp4.ii".
CMake Error at cuda_compile_generated_sigmoid_cross_entropy_loss_layer.cu.o.cmake:264 (message):
  Error generating file
  /home/caffe/SSD/build/src/caffe/CMakeFiles/cuda_compile.dir/layers/./cuda_compile_generated_sigmoid_cross_entropy_loss_layer.cu.o
make[2]: *** [src/caffe/CMakeFiles/cuda_compile.dir/layers/cuda_compile_generated_sigmoid_cross_entropy_loss_layer.cu.o] Error 1
/home/caffe/SSD/include/caffe/util/cudnn.hpp(112): error: too few arguments in function call
1 error detected in the compilation of "/tmp/tmpxft_00007bdc_00000000-5_math_functions.cpp4.ii".
CMake Error at cuda_compile_generated_math_functions.cu.o.cmake:264 (message):
  Error generating file
  /home/caffe/SSD/build/src/caffe/CMakeFiles/cuda_compile.dir/util/./cuda_compile_generated_math_functions.cu.o
make[2]: *** [src/caffe/CMakeFiles/cuda_compile.dir/util/cuda_compile_generated_math_functions.cu.o] Error 1
make[1]: *** [src/caffe/CMakeFiles/caffe.dir/all] Error 2
make: *** [all] Error 2

*2:python examples/ssd/ssd_pascal_video.py
Traceback (most recent call last):
  File "examples/ssd/ssd_pascal_video.py", line 87, in <module>
    conf_loss_type = P.MultiBoxLoss.SOFTMAX
  File "/home/caffe/SSD/python/caffe/net_spec.py", line 240, in __getattr__
    return getattr(getattr(caffe_pb2, name + 'Parameter'), param_name)
AttributeError: 'module' object has no attribute 'MultiBoxLossParameter'

CaffeでAutoEncoderを学習してみた

最近,Deep Auto Encoder界が盛り上がりを見せている.

このままでは流行に置いて行かれてしまうので,手始めにCaffeでAutoEncoderを学習してみた.

例によって下記で導入した環境を用いて実験を行う.

iamrobotandproud.hatenablog.com

 

なお,ここでいうAutoEncoderとは,入力を自己(auto)近似するニューラルネットワークのことを示している.

AutoEncoderは,「ある入力データを少数の基底で圧縮(エンコード)して,

それを解凍(デコード)したときに,

もとの入力データをどれだけ表現しているか?」

ということを指標として学習を行うという特徴がある.

 

実験には,標準で用意されているCaffeのプログラムとMNISTのデータセットをありがたく使うことにする.

MNISTに関しては,以下を参照していただきたい.

iamrobotandproud.hatenablog.com

 

なお,本記事で示すディレクトリ構成は,とくに記述が無ければCaffeのインストール先(CAFFE_ROOT)を基準にしているものとする.

 

今回の実験には,

/caffe/examples/mnist/train_mnist_autoencoder.sh

をというプログラムを用いる.

 

train_mnist_autoencoder.shは,

/caffe/examples/mnist/mnist_autoencoder_solver.prototxt

というAutoEncoderのネットワーク構造を記述したprototxtを読み込み,MNISTの学習データを教師なし学習するプログラムとなっている.

 

/caffe/examples/mnist/mnist_autoencoder_solver.prototxt

を読むと分かるが,今回用いるネットワーク構造は

Input Data -> encode1~4 layer -> decode1~4 layer -> Output Data

という砂時計型の構造になっていて,各encode・decode layerの後にはシグモイド関数が活性化関数としてついている.

4層目のencode layerは30個のニューロンしかなく,0~9の数字が書かれた画像データを,30個のニューロンのパタンで表現するようになっている.

なお,今回用いるdecoderは,encoderのパラメータとは独立になっているようだ.よく使われる方法であれば,encoderのパラメータを転置して,対応するdecoderのパラメータに用いるのだが,そうはなっていない.

また通常であれば,学習時,最初にLayerごとにpre-trainingして,最後に全体をfine-tuningするような手順を踏むと精度が上がるはずなのだが,今回はそのようになっていないらしい.

しかもこのAutoEncoder,入力をDenoisingしていないようだ...がっくし.

 

なお,すべてのINNER_PRODUCT layerのオプションに

weight_filler {
      type: "gaussian"
      std: 1
      sparse: 15
}

という記述があり,sparseなんてオプションを筆者は初めて見ました.

Layerカタログには載っていないので調べてみると,

caffe/src/caffe/proto/caffe.proto

に,

// The expected number of non-zero input weights for a given output in
// Gaussian filler -- the default -1 means don't perform sparsification.
optional int32 sparse = 7 [default = -1];

と書いてあった.なんのことだかさっぱりだが,ソースを深く辿っていくと,ほんとうにただの初期化処理を行っているらしい.

べつに,Sparsityを考慮して最適化を行っているわけではないようだ…

 

気を取り直して実験を続ける.

sh examples/mnist/train_mnist_autoencoder.sh

と実行するだけで,(Stacked) Auto Encoderの学習が始まる.

デフォルトでは,examples/mnist/に学習した重み等が保存され,学習処理は60000Iterationで終了する.

 

長くなってしまったので,学習結果に関しては次回報告する.

CaffeでMNISTを学習した経過をプロットしてみた

今回は

1. CaffeでMNISTを学習

2. 学習中に精度が上がっていく様子をプロット

することを目標にする。

 

実験で使う環境などについては、下記をご参照ください。

【メモ書き】Ubuntu 14.04 CUDA6.5 GTX970 Caffeインストール - 下丸子のコネクショニスト

 

MNISTの学習

以降はMNISTを学習する際の手順を示す。

進め方はCaffe | LeNet MNIST Tutorialを参考にした。

 

MNIST(http://yann.lecun.com/exdb/mnist/)はLeCunらが作成した手書き文字データセットで、様々な人間が書いた1~10の数字をコンピュータに分類させるタスクとして取り組まれている。

例えば0が書かれた画像を一覧にすると、以下のようになる。

一人一人が書く文字の見た目は多様なため、多様さを吸収するようなアルゴリズムが必要なタスクになっている。

f:id:yukisaito:20150316100113j:plain

(引用:http://www.cs.nyu.edu/~roweis/data.html)

 

まずはMINISTのデータを取得する。

Caffeのディレクトリに移動し、下記を実行した。

./data/mnist/get_mnist.sh

./examples/mnist/create_mnist.sh

 

今回はLeNetを用いることにする。

modelディレクトリにLeNetのprototxtをコピーした。

このあたりは筆者の好みになっている。

mkdir model/mnist

cp example/mnist/lenet_solver.prototxt model/mnist/

cp example/mnist/lenet_train_test.prototxt model/mnist/

ここでコピーしたlenet_solver.prototxtの二行目を下記のように変更した。

net: "models/mnist/lenet_train_test.prototxt"

 

あとはいつも通り、下記のコマンドを実行して学習を開始する。

./build/tools/caffe train --solver=models/mnist/lenet_solver.prototxt

 

精度のプロット

Caffeは学習時にログファイルを出力しており、今回はこのログファイルを使って精度のプロットを行う。

ログファイルは/tmp/フォルダに格納されている。

ファイル名は環境依存になっており、

/tmp/<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>

のようになるらしい。

(出典:https://groups.google.com/forum/#!msg/caffe-users/CqejrkmTOx0/3wqz7wnwCLkJ

 

例えば私の場合は

/tmp/caffe.<hostname>.<user name>.log.INFO.20150316-085258.3732

のような感じになっていた。

なお、ログファイルは順次消えてしまうようなので注意が必要である。

 

精度をプロットするのに、今回はあらかじめ用意されたプログラムを用いることにする。

下記のコマンドを実行した。

cd tools/extra

./parse_log.sh 上記のログファイルを引数として入力

これにより、tools/extraログファイル名.trainおよびログファイル名.testというファイルが出力される。

これらのファイルを、それぞれmnist.log.trainおよびmnist.log.testにリネームしておく。

 

以降の処理では、gnuplotが必要になる。

下記のようにインストールを行った。

sudo apt-get install gnuplot

 

まず、学習途中の精度をプロットしてみた。

事前に用意されたプログラムに誤植があるため、下記のように訂正した。

plot_log.gnuplot.exampleの42, 43行目を

set xlabel "Training loss"
set ylabel "Training iterations"

から

set ylabel "Training loss"
set xlabel "Training iterations"

に変更した。

下記のコマンドを実行すると、以下のyour_chart_name.pngが出力された。

gnuplot plot_log.gnuplot.example

f:id:yukisaito:20150316103914p:plain

x軸は学習のiteration数、y軸はlossである。

lossが一気に低減され、以降0に近づいていく様子が分かる。

 

次にテスト時の精度をプロットする。

実は、parse_log.shは現行バージョンのCaffeが出力するログ形式に完全に対応している訳ではなく、mnist.log.testにIterationのデータが出力されていない。

そこで今回は仕方なく、テスト時のプロットには学習時間を横軸に用いることにした。

 

plot_log.gnuplot.exampleの末尾に下記の行を加え、

# Test accuracy vs. training time
set ylabel "Test accuracy"
set xlabel "Training time"
plot "mnist.log.test" using 1:2 title "mnist"

さらに41~44行目をコメントアウトした(行頭に#をつける)。

先ほどと同等に下記のコマンドを実行すると、以下のyour_chart_name.pngが出力された。

gnuplot plot_log.gnuplot.example

f:id:yukisaito:20150316104803p:plain

学習のlossと同じように、テスト画像を用いて評価したaccuracyも急激に上昇していることが分かる。なんだこれ…。

 

おわりに

今回はLeNetを用いてMNISTを学習し、精度をプロットした。

プロットした結果、精度が急激に向上していることが分かった。

ぶっちゃけ異常な上昇である。

おそらく、LeNetのアーキテクチャおよび様々なパラメータがMNISTに適合していると考えられる。初期値依存性がどのようになっているか気になるところである。

 

今回はここまで。

Caffeのネットワーク(prototxt)を可視化

今回は、Caffeのprototxtに記されたニューラルネットワークの構造を可視化した。

なお、pycaffeがビルドされていることが前提になっている。

Caffeのインストール方法や実行環境については下記の記事を参照していただきたい。

 

【メモ書き】Ubuntu 14.04 CUDA6.5 GTX970 Caffeインストール - 下丸子のコネクショニスト

 

必要なものをインストール

まず、下記のようにpythonライブラリをインストールした。

sudo pip install graphviz

sudo pip install pydot

export PYTHONPATH=/usr/local/lib/python2.7/dist-packages/:$PYTHONPATH

 

pythonGraphVizのインタフェースはインストールされたが、GraphViz本体が存在しないため、このままでは動かなかった。

そこで下記のように本体のインストールを行った。

sudo apt-get install graphviz

 

試しにcaffeNetを可視化してみた

caffeのディレクトリに移動し、

python/draw_net.py models/bvlc_reference_caffenet/train_val.prototxt caffeNet.png

とコマンドを打つと、下記の画像が得られた。

tutorialではいつもこの画像が使われているけど、正直分かりにくいような…。

f:id:yukisaito:20150314194501p:plain

Caffe+AlexNetでImageNet2012を学習してみた (2)

前回は下記の記事でImageNetのデータを用意したので、今回は学習するところをレポートする。

Caffe+AlexNetでImageNet2012を学習してみた (1) - 下丸子のコネクショニスト

 

データの整形・変換

前回の続きに相当するが、データの整形・caffeで使う形式への変換を行う。

/caffe/examples/imagenet/create_imagenet.sh

の中にある項目を下記のように変更し、実行した。

ここではcaffeのディレクトリ、imagenetのディレクトリを指定している(この場合、caffeはホームディレクトリ直下にあることが前提)。

EXAMPLE=~/caffe/examples/imagenet
DATA=~/caffe/data/ilsvrc12
TOOLS=~/caffe/build/tools
TRAIN_DATA_ROOT=~/data/imagenet/train/
VAL_DATA_ROOT=~/data/imagenet/val/

(中略)

RESIZE=true

 

次に平均画像を計算する。

/caffe/examples/imagenet/make_imagenet_mean.sh

を開き、上記と同じくパスを変更するとともに、

ilsvrc12_train_leveldbをilsvrc12_train_lmdbに変更して実行した。

 

CaffeNetの学習

まずはAlexNetではなく、CaffeNetを学習してみる。

 

~/caffe

のディレクトリに移動し、下記のコマンドを実行。

./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt
(中略)
I0311 19:31:31.396245 4896 data_layer.cpp:195] Restarting data prefetching from start.
I0311 19:31:31.538151 3872 solver.cpp:315] Test net output #0: accuracy = 0.001
I0311 19:31:31.538208 3872 solver.cpp:315] Test net output #1: loss = 7.14724 (* 1 = 7.14724 loss)
I0311 19:31:32.839386 3872 solver.cpp:209] Iteration 0, loss = 7.43302
I0311 19:31:32.839438 3872 solver.cpp:224] Train net output #0: loss = 7.43302 (* 1 = 7.43302 loss)
I0311 19:31:32.839467 3872 solver.cpp:445] Iteration 0, lr = 0.01
I0311 19:31:59.389771 3872 solver.cpp:209] Iteration 20, loss = 7.15628
I0311 19:31:59.389821 3872 solver.cpp:224] Train net output #0: loss = 7.15628 (* 1 = 7.15628 loss)
I0311 19:31:59.389833 3872 solver.cpp:445] Iteration 20, lr = 0.01
I0311 19:32:25.964386 3872 solver.cpp:209] Iteration 40, loss = 6.95787
I0311 19:32:25.964555 3872 solver.cpp:224] Train net output #0: loss = 6.95787 (* 1 = 6.95787 loss)
I0311 19:32:25.964576 3872 solver.cpp:445] Iteration 40, lr = 0.01
(以下略)

 

無事に学習が始まった。

仕事用のグラボだとメモリが小さすぎてバッチサイズを変えないといけなかったが、

GTX 970ならパラメータを変えなくても学習はできることが分かった。

(GTX 970はメモリ上の問題をかかえているとのことなので、非常に心配していた…)

気になるのは学習速度だが、上記の通り20秒/20Ite.くらいのようだ。

これが果たして早いのか?遅いのか?

GTX 970特有のアクセス速度が遅いメモリ領域を使わざるを得ないなら、

学習速度が低下しているはずだ。

 

次回はCaffeNetの学習速度と精度に関して検証していく。

Caffe+AlexNetでImageNet2012を学習してみた (1)

今回は下記の記事で導入したCaffeを用いて、ImageNetを学習してみる。

【メモ書き】Ubuntu 14.04 CUDA6.5 GTX970 Caffeインストール - 下丸子のコネクショニスト

 

ImageNet(イメージネット)は大規模画像認識のコンペティションを毎年開催している組織で、

Stanford大のFei-Feiなどが監修している。

コンペの正式名称をLarge scale visual recognition challengeというのだが、

ここでは単にImageNetと呼ぶことにする。

 

トロント大のHintonらとともにAlexが提案し、

今ではDeep Convolutional Neural Networkのベースモデルとして扱われている通称AlexNetは、

2012年のImageNetにて発表されたものだ。

AlexNetはCaffeのZoo(様々なニューラルネットワークのモデルを収録したカタログ)にも入っており、学習済みのモデルも提供されている。

今回の一連の記事の目標は、Caffeを使ってAlexNetをイチから学習し、再現することになる。

 

データの入手

まずはデータがないと始まらない。

ImageNetでは非商用目的の研究者向けにのみ元データを配布しており、今回は元データを取得することができた。

公式ページの下記のフォームから登録すると、データをDownloadする許可を申請することができる。筆者は個人のメールアドレスを用いて当初申請していたが、いつまでたっても許可されなかった。公用のアドレスで申請したら一日程度で許可を得ることができた。

f:id:yukisaito:20150307130825p:plain

なお研究者でない人は、ImageNetから画像のURLを取得し、URLを通してダウンロードすることで画像を揃える必要がある。

 

今回はAlexNetをターゲットにするので、Download links to ILSVRC2012 image data.からリンク先に飛んでダウンロードする。

今回ダウンロードしたものは下記の通り。

  • Training images
  • Validation images
  • Test images
  • Development kit

ダウンロードが完了するのに一日程度かかった。

 

データの整理

Caffe | ImageNet tutorialによると、学習データなどのディレクトリ構成は

/path/to/imagenet/train/n01440764/n01440764_10026.JPEG

/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG

 といったようにするのが望ましいらしい。

これにならって今回は

~/data/imagenet/train/n01440764/n01440764_10026.JPEG

~/data/imagenet/test/ILSVRC2012_test_00074997.JPEG

~/data/imagenet/val/ILSVRC2012_val_00000001.JPEG

のような構成にする。

 

mkdir ~/data

mkdir ~/data/imagenet

mkdir ~/data/imagenet/train

mkdir ~/data/imagenet/test

mkdir ~/data/imagenet/val

としてフォルダを作っておき、.tarをダウンロードしたフォルダ上で

tar -xf ILSVRC2012_img_train.tar -C ~/data/imagenet/train

tar -xf ILSVRC2012_img_test.tar -C ~/data/imagenet/test

tar -xf ILSVRC2012_img_val.tar -C ~/data/imagenet/val

として解凍する。これには数時間かかる場合がある。

 

この時点でtest, valの画像はきちんと解凍されているのだが、

trainは学習クラスごとの画像がまとめられたtarファイルが生成されているので、

もう一度解凍する必要がある。

しかしtarコマンドをそのまま使うだけでは

~/data/imagenet/train/n01440764/n01440764_10026.JPEG

のような構成にはならず、trainフォルダにすべて解凍されてしまう。

そこで

~/data/imagenet/train/untarimage.sh

に.shファイルを作り、下記の内容を記述して実行した。

 #!/bin/sh

files="./n*.tar"

for filepath in ${files}
do
  filename=`basename ${filepath} .tar`
  mkdir ${filename}
  tar -xf ${filename}.tar -C ${filename}
done

 

 上記のshファイルを実行することで、画像がフォルダごとに分けて解凍される。

なおここでも数時間かかるので注意。

 

これでデータの準備は整った。

次回はcaffeを実行していく。

Long Short Term Memory(LSTM)を実際に動かしてみた (1)

今回は下記の記事で導入したLSTMを実際に動かしてみる。

Long Short Term Memory (LSTM) ライブラリ導入 - 下丸子のコネクショニスト

 

目標は

  1.  元のデータをLSTMの入力形式.rcに変換し、学習用・評価用データを作成
  2.  LSTMのパラメータを手動設定
  3.  手動設定したパラメータを用いて学習し、評価結果をプロット

上記の流れを実行できるようにすること。

 

データの種類によって手順や必要なことはかなり変わってくる。

今回は上手くいったかを検証することが重要なので、なるべく検証性を高めるために、

exampleとしてライブラリに添付されているタスクをモデルケースとして実験に用いる。

 

複数の回にまたがってレポートすることになるが、

この記事では概要を説明し、次回以降詳細な検討にうつっていく。

 

フォルダ・ファイル構成

以降では前回記事で導入したCURRENNTのインストール先フォルダを~/CURRENNTと呼ぶことにする。

CURRENNTに含まれているexampleは

  1.  speech_recognition_chime
  2.  speech_autoencoding_chime

上記二つのタスクである。~/CURRENNT/example以下にそれぞれのデータが格納されている。

 

speech_recognition_chimeは話者分類を行うタスク、speech_autoencoding_chimeは音声データのノイズ除去を行うタスクのようだ。

今回はspeech_autoencoding_chimeを用いることにする。

 

ファイル構成は以下のとおりになっている。

  • ~/CURRENNT/example/speech_autoencoding_chimeフォルダ

train_1_speaker.nc val_1_speaker.nc config.cfg network.jsn run.bat run.sh

 

なおそれぞれのファイルは下記の意味がある。

train_1_speaker.nc:学習データ

val_1_speaker.nc:学習時に用いるvalidationデータ

(評価時に用いるtestデータはexample内には存在しない)

config.cfg:学習パラメータ情報

network.jsn:LSTMのネットワーク構造情報

run.bat:Windows環境用の学習実行ファイル

run.sh:Linux環境用の学習実行ファイル

 

音声データのノイズ除去タスク

CURRENNTのREADMEにはspeech_autoencoding_chimeの参考文献として下記が引用されている。

Felix Weninger, Jürgen Geiger, Martin Wöllmer, Björn Schuller, Gerhard Rigoll:
"The Munich Feature Enhancement Approach to the 2013 CHiME Challenge Using
BLSTM Recurrent Neural Networks", Proc. 2nd CHiME Speech Separation and
Recognition Challenge held in conjunction with ICASSP 2013, IEEE, Vancouver,
Canada, 01.06.2013.

論文の中身を読むと、CHiME 2013というワークショップで題材にされたデータを使っていることが判明した。

ちなみにCHiMEというのはWorkshop on Machine Listening in Multisource Environmentsの略のようで、頭文字それでいいのか突っ込みたくなる。

どうやらexampleフォルダには容量の都合によりspeaker 1というデータしか収録していないようなので、どのようなデータを使っているのか同定する必要がある。

 

試しに下記のコマンドを打ってみると、dumpファイルに学習データの内容が我々が読める形で吐き出される。

~/CURRENNT/examples/speech_autoencoding_chime$ ncdump train_1_speaker.nc > dump

このコマンドはNetCDFがきちんとインストールされていないと動かないので注意。動かない場合は冒頭で引用した記事を参照していただきたい。

ちなみに学習時に使うncファイルは23.4MBで、ncファイルから吐き出されたdumpファイルは64.3MB。約3倍にデータ圧縮されているのに学習時解凍する必要がない。かなり優秀だ。pickle形式も見習ってほしい。

さてdumpには以下のように出力された。

netcdf train_1_speaker {
dimensions:
    numSeqs = 500 ;
    numTimesteps = 74334 ;
    inputPattSize = 39 ;
    targetPattSize = 39 ;
    maxSeqTagLength = 500 ;
variables:
    char seqTags(numSeqs, maxSeqTagLength) ;
        seqTags:longname = "sequence tags" ;
    int seqLengths(numSeqs) ;
        seqLengths:longname = "sequence seqLengths" ;
    float inputs(numTimesteps, inputPattSize) ;
        inputs:longname = "inputs adjusted for mean 0 and std dev 1" ;
    float targetPatterns(numTimesteps, targetPattSize) ;
        targetPatterns:longname = "regression targets" ;
data:

 seqTags =
  "/home/iaa1/workstud/wen/research/chime2/smallvoc/tum_fe/features/mfcc-std/train_noisy/id1/bbaf2n.mfcc",
  "/home/iaa1/workstud/wen/research/chime2/smallvoc/tum_fe/features/mfcc-std/train_noisy/id1/bbaf4p.mfcc",

(以下略...)

seqLengths = 117, 120, 159, 117, 131, 127, 128, 136, 128, 142, 122, 158,
    139, 165, 140, 135, 115, 128, 115, 128, 142, 139, 135, 129, 146, 186,
    142, 122, 122, 143, 135, 123, 140, 134, 135, 148, 147, 183, 139, 140,

(以下略...)

inputs =
  -2.934437, 1.067946, -0.962051, 0.765908, 1.393508, 2.342612, 1.355077,
    0.331135, 0.861362, 1.944664, 0.522046, -0.520356, -0.075297, -0.525195,
    0.472348, 1.096672, 0.060397, -0.000736, -0.748944, -1.20265, 0.114947,

(以下ファイル末端まで続く)

 

ここで重要なのはseqTagsの項目で、実験データを指定している部分。

CHiME2のsmallvocというデータセットのうち、id1という話者の音声ファイルを複数指定しているように読み取れる。

下記のURLにはsmall vocabulary trackというデータを使ったタスクがあるのでこいつだろう。

http://spandh.dcs.shef.ac.uk/chime_challenge/chime2013/chime2_task1.html

 

学習データには

Training set: 500 utterances from each of 34 speakers

  • (ftp) clean utterances (760 MB)
  • (ftp) reverberated utterances (1.5 GB)
  • (ftp) isolated noisy mixtures (1.6 GB)
  • embedded noisy mixtures (ftp) part 1 and (ftp) part 2 (9.6 GB total)

という上記4つの候補があるが、

Only the isolated utterances are used

と論文に書いてあるので(ftp) isolated utterances (1.6 GB)をダウンロードしておく。

 

学習時に用いるvalidation用データはdevelopment dataと呼ばれているらしい。

Development set: 600 utterances at each of 6 ranges of SNR

  •  (ftp) isolated noisy mixtures (330 MB)
  •  (ftp) embedded noisy mixtures (2.2 GB total)
  •  (ftp) noise-free reverberated utterances (51 MB)

上記の中から(ftp) isolated noisy mixtures (330 MB)をダウンロードしておく。


seqTagsのmfcc-stdというディレクトリ名は特徴抽出したファイルを示しているようで、

we use 39 cepstral mean normalised mel-frequency
cepstral coefficients (MFCCs) exactly corresponding to the features
employed by the Challenge baseline.

と論文に書いてある。

調べたところbaselineは公式に提供されているツールがあるらしい。

http://spandh.dcs.shef.ac.uk/chime_challenge/grid/README.pdf

ツールのダウンロードリンクが切れていたが、以前のコンペで用意された下記のページからpcchome.tar.gzを落とせば問題ないようだ。

http://spandh.dcs.shef.ac.uk/projects/chime/PCC/evaluation.html

 

とりあえず準備はこれでできた。

次回から実際にデータを扱っていく。