はじめるDeep learning

TheanoでDeep Learning

Theanoの使い方

Theanoの基本メモ

Distributed TensorFlowの話

TensorFlow を1時間で試してみた

Caffeで Deep Q-Network

論文リスト

ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース

機械学習の論文紹介

Deep Learningの次?トポロジカル・データ・アナリシス

機械学習のデータ

Dan Cireșan のホームページ

Deep Learningによる画像認識革命 ー歴史・最新理論から実践応用までー (SlideShare)

Deep Learningと画像認識   〜歴史・理論・実践〜 (SlideShare)

ニューラルネットワークで時系列データの予測を行う (Qiita)

はじめてのDeepLearning入門(Chainer) 日本語文字認識 (Qiita)

chainerでサンプルコードを動かすまで

KDnuggets News

アマゾン、ディープラーニングライブラリ「DSSTNE」をオープンソース化

Amazonがディープラーニングのライブラリ「DSSTNE」をオープンソースで公開。TensorFlowよりも約2倍高速と主張

深層学習ライブラリ Keras

手書き中国語認識(github)

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

Faster R-CNNの紹介

TensorFlowチュートリアル - リカレント・ニューラルネットワーク(Qiita)

Chainer を用いたリカレントニューラル言語モデル作成のサンプルコード解説に挑戦してみた(Qiita)

Chainerでcaffemodelを読み込んで画像を分類する(Qiita)

DQNの生い立ち + Deep Q-NetworkをChainerで書いた(Qiita)

[Survey]Deep Residual Learning for Image Recognition (Qiita)

LSTMによる正弦波の予測 〜 Chainerによる実装 〜

Chainerでファインチューニングするときの個人的ベストプラクティス←CaffeモデルからChainerモデルへ変換

FaceDetection_CNN の GitHub←もっとまともなのはないのか?

caffeのexamples←00-classification.ipynbなどで勉強

Chainerのcaffeモデルの読み込みを爆速にした

DeepLearningを使った実装を纏めてみた

Caffeで機械学習 -1- リファレンスモデルを使って画像をカテゴリ分類

手書きひらがなの認識で99.78%の精度をディープラーニングで

ETL9のデータ加工について

Tensorflowを2ヶ月触ったので"手書きひらがな"の識別95.04%で畳み込みニューラルネットワークをわかりやすく解説

Recognizing Handwritten Japanese Characters Using Deep Convolutional Neural Networks(PDF)

ディープラーニングによるファッションアイテム検出と検索

ChainerのTrainerを使ってみた

Microsoftのモデルギャラリー

日本語OCRで認識率98.66% ←詳細不明

Caffe で MNIST

 Caffe公式ページ

 Caffe公式ページ:インストール

実行環境:Ubuntu 14.04 LTS

インストール

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install libatlas-base-dev
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev  libopencv-dev libboost-all-dev libhdf5-serial-dev
$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler

$ sudo apt-get install g++-4.6

CUDAをinstall

$ sudo dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda

cuDNN v4をインストール(これはNvidiaのサイトでユーザー登録が必要。アンケート聞かれ面倒)

cuDNNはversion5もあるが、v5だとある関数の引数の型が違うというエラーで終了。v4だと難なくコンパイルできた。(v5はソースからインストールする場合に限るらしい)

$ tar xvzf cudnn-7.0-linux-x64-v4.0-prod.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/* /usr/local/cuda/lib64/

$ sudo apt-get install git
$ git clone https://github.com/BVLC/caffe.git
$ cd Caffe
$ cp Makefile.config.sample Makefile.config

Makefile.config を修正

# USE_CUDNN := 1

のコメントを外す

USE_CUDNN := 1

また、

CUSTOM_CXX := g++

を次のように修正

CUSTOM_CXX := g++-4.6
$ make
$ make test
$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64
$ make runtest

並列にコンパイルするには、

$ make -j4

リビルドするには

$ make -B
$ make test -B
$ make runtest

GPUについての情報が欲しければ

$ ./build/tools/caffe device_query -gpu 0

いよいよ MNISTで実験

$ ./data/mnist/get_mnist.sh
$ ./examples/mnist/create_mnist.sh
$ ./examples/mnist/train_lenet.sh

最後の行は下記を実行するスクリプト

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

examples/mnist/lenet_solver.prototxt がパラメータ設定ファイル

パラメータの種類や構造はここが参考になる

data/mnist/t10k-images-idx3-ubyteなどの画像データファイルのフォーマットについてはここが参考になる

ログファイルから学習とテストの様子を描画

基本的にはここをなぞった。

ログファイルを得る(よく見たら、/tmp/caffe.INFOを使えばいい。symbolic linkになっている)

$ ls -t /tmp/caffe* | head -1
$ /tmp/caffe.wildcat3.nagai.log.INFO.20160503-202548.6848

重要な情報を抽出する python scriptがある

$ ./tools/extra/parse_log.py /tmp/caffe.wildcat3.nagai.log.INFO.20160503-202548.6848 /tmp

gnuplotで表示

$ ~/bin/trashhead -1 /tmp/caffe.wildcat3.nagai.log.INFO.20160503-202548.6848.train | gawk -F, -v OFS=' '  '{print $1,$4}'| data2ps.pl -title 'loss func' | viewps.pl
$ ~/bin/trashhead -1 /tmp/caffe.wildcat3.nagai.log.INFO.20160503-202548.6848.test | gawk -F, -v OFS=' '  '{print $1,$4,$5}'| data2ps.pl -title 'accuracy,loss func' -color | viewps.pl 

ネットワークの可視化

$ sudo apt-get install python-pydot
$ python python/draw_net.py --rankdir=BT examples/mnist/lenet_train_test.prototxt mnist_lenet_train_test.png
mnist_lenet_train_test.png

rankdir はネットワークの伸びる方向。BT, TB, LR, RLがある。デフォルトは何故かLR。

CIFAR10 で実験

$ ./data/cifar10/get_cifar10.sh
$ ./examples/cifar10/create_cifar10.sh
$ ./examples/cifar10/train_full.sh

ILSVRC2012 で実験

ここにreadmeあり

image-net.org から ILSVRC2012_img_train.tar, ILSVRC2012_img_val.tar, ILSVRC2012_img_test.tar を入手 (申請してアカウントを作る必要があり、それなりに面倒)

$ mkdir ILSVRC2012
$ cd ILSVRC2012
$ mkdir train
$ cd train
$ tar xf ILSVRC2012_img_train.tar
$ for f in *.tar; do dir=`echo $f | sed -e 's/\.tar//'`; echo $dir; mkdir $dir; tar xf $f -C $dir; done
$ cd ..
$ mkdir val
$ tar xf ILSVRC2012_img_val.tar -C val
$ mkdir test
$ tar xf ILSVRC2012_img_test.tar -C test
$ ./data/ilsvrc12/get_ilsvrc_aux.sh

examples/imagenet/create_imagenet.sh を修正

10:TRAIN_DATA_ROOT=data/ILSVRC2012/train/
11:VAL_DATA_ROOT=data/ILSVRC2012/val/
16:RESIZE=true

データベースを作る(所要:6時間以上)

$ ./examples/imagenet/create_imagenet.sh

examples/imagenet/ilsvrc12_train_lmdb

examples/imagenet/ilsvrc12_val_lmdb

に作成

meanを計算(所要:22分)

$ ./examples/imagenet/make_imagenet_mean.sh

data/ilsvrc12/imagenet_mean.binaryproto

に作成

いよいよtraining開始 (所要:約54時間)

$ ./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt

pycaffe の環境作り

$ sudo apt-get install python-dev python-pip python-numpy python-skimage gfortran
$ sudo pip install -r ~/caffe/python/requirements.txt
$ make pycaffe

~/.bashrc に下記を追加

export PYTHONPATH=~/caffe/python/:$PYTHONPATH
$ source ~/.bashrc
$ python
$ >>> import caffe

でエラーが出なければOK

個別の手書きファイルを分類

ここをなぞった。

ここからダウンロードした mnist_jpg_converter.py でlmdbファイルから元の画像ファイルを生成

$ wget -O examples/mnist/mnist_jpg_converter.py https://github.com/yuishihara/CaffePythonUtils/raw/master/mnist_jpg_converter.py
$ chmod 755 examples/mnist/mnist_jpg_converter.py
$ sudo pip install lmdb
$ mkdir data/mnist/jpg
$ ./examples/mnist/mnist_jpg_converter.py examples/mnist/mnist_test_lmdb/
$ mv data/mnist/jpg data/mnist/jpg-test

train用の画像ファイルも同様にlmdbファイルから生成できる。(ともに約4倍。2値モノクロ画像) lmdbファイルを扱う時には参考になるだろう。

分類用の python scriptも同様にダウンロードしてくる。

$ wget -O examples/mnist/lenet_classify.py https://github.com/yuishihara/CaffePythonUtils/raw/master/lenet_classify.py
$ wget -O examples/mnist/show_mnist_result.py https://github.com/yuishihara/CaffePythonUtils/raw/master/show_mnist_result.py

examples/mnist/lenet_classify.py を2ヶ所修正

       default=os.path.join(pycaffe_dir,
               "../examples/mnist/lenet.prototxt"),

を下記のように修正

       default=os.path.join(pycaffe_dir,
               "lenet.prototxt"),

また、

       default=os.path.join(pycaffe_dir,
               "../examples/mnist/lenet_iter_10000.caffemodel"),

を下記のように修正

       default=os.path.join(pycaffe_dir,
               "lenet_iter_10000.caffemodel"),

もしCPUモードで実行するなら、examples/mnist/lenet_classify.py の

   caffe.set_mode_gpu()

をコメントアウト

$ chmod 755 examples/mnist/lenet_classify.py
$ chmod 755 examples/mnist/show_mnist_result.py

これで準備完了。

いよいよ個別の画像を分類。

$ ./examples/mnist/lenet_classify.py data/mnist/jpg-test/00000007_9.jpg result.npy
    中略
I0504 00:26:14.893918  9869 net.cpp:752] Ignoring source layer mnist
I0504 00:26:14.894134  9869 net.cpp:752] Ignoring source layer loss
Loading file: data/mnist/jpg-test/00000007_9.jpg
Classifying 1 inputs.
Done in 0.00 s.
Saving results into result.npy
$ ./examples/mnist/show_mnist_result.py result.npy
[[  4.00120392e-03   1.22770737e-03   4.98170219e-03   5.00620299e-05
    4.58798558e-01   7.96950553e-05   1.01684280e-04   4.51153191e-03
    2.52322853e-02   5.01015544e-01]]

lmdb ファイルを作る

$ ./build/tools/convert_imageset [FLAGS] <画像のあるディレクトリ> <正解ファイル> <出力先ディレクトリ>
[FLAGS]は
-shuffle でシャッフル
-backend <lmdbかleveldb>
-resize_width <resize後のwidth>
-resize_height <resize後のheight>
-gray はグレースケール用

$ ls data/mnist/jpg-train/ | perl -e 'while(<>){ chomp; if (/_([0-9])/){$class=$1;} print "$_ $1\n"; }' > my-train.txt
$ ./build/tools/convert_imageset -shuffle -backend lmdb -gray -resize_width 28 -resize_height 28 data/mnist/jpg-train/ my-train.txt examples/mnist/my-train_lmdb

testデータについても同様に、

$ ls data/mnist/jpg-test/ | perl -e 'while(<>){ chomp; if (/_([0-9])/){$class=$1;} print "$_ $1\n"; }' > my-test.txt
$ ./build/tools/convert_imageset -shuffle -backend lmdb -gray -resize_width 28 -resize_height 28 data/mnist/jpg-test/ my-test.txt examples/mnist/my-test_lmdb

手書きひらがな認識

$ sudo apt-get install gnuplot gv gawk
$ sudo apt-get install python-opencv
$ scp -p 133.8.**:/home/nagai/Downloads/Jcode-0.87.tar.gz
$ cd  ~/Downloads
$ tar xvzf Jcode-0.87.tar.gz
$ cd Jcode-0.87
$ perl Makefile.PL
$ make
$ make test
$ sudo make install
$ scp -rp 133.8.***:/home/nagai/bin ~/
$ scp -rp 133.8.***:/home/nagai/Downloads/ETL9B ~/Downloads/
$ cd ~/Downloads/ETL9B
$ unzip ETL4.zip
$ cd ~/caffe
$ python ./data/etl4/create_etl4.py

このscript内で下記を実行している

$ ./build/tools/convert_imageset -shuffle -backend lmdb -gray ./data/etl4/ ./data/etl4/train.txt ./examples/etl4/train_lmdb'
$ ./build/tools/convert_imageset -shuffle -backend lmdb -gray ./data/etl4/ ./data/etl4/test.txt  ./examples/etl4/test_lmdb'
$ ./build/tools/compute_image_mean.bin -backend=lmdb ./examples/etl4/train_lmdb ./examples/etl4/etl4_mean.binaryproto

学習開始

$ ./build/tools/caffe train --solver examples/etl4/etl4_cifar10_quick_solver_dropout.prototxt

グラフ化

$ ./tools/extra/parse_log.py /tmp/caffe.INFO /tmp
$ trashhead -1 /tmp/caffe.INFO.train | gawk -F, -v OFS=' '  '{print $1,$4}'| data2ps.pl -title 'loss func' | viewps.pl
$ trashhead -1 /tmp/caffe.INFO.test | gawk -F, -v OFS=' '  '{print $1,$4,$5}'| data2ps.pl -title 'accuracy,loss func' | viewps.pl

ETL9 についてはここを参照すべき

数字・アルファベット認識(書籍『Caffeをはじめよう』3章)

データは数字、アルファベットの大文字・小文字の62種類。

ここからダウンロードできる。

$ wget -O recog-chars74k.tar.gz 'http://www.cs.gunma-u.ac.jp/~nagai/wiki/index-write.php?plugin=attach&pcmd=open&file=recog-chars74k.tar.gz&refer=Deep%20Learning%B4%D8%B7%B8'
$ tar xvzf recog-chars74k.tar.gz
$ cd recog-chars74k

$ mkdir data
$ cd data
$ wget http://www.ee.surrey.ac.uk/CVSSP/demos/chars74k/EnglishHnd.tgz
$ wget http://www.ee.surrey.ac.uk/CVSSP/demos/chars74k/EnglishFnt.tgz
$ tar xvzf EnglishHnd.tgz
$ tar xvzf EnglishFnt.tgz
$ cd ..

$ ./split-data.sh
$ ./create-DB.sh
$ ./training.sh

$ python classify_chars.py input1.png
predicted class: 51   ⇒ p (正解はPのつもり)
$ python classify_chars.py input2.png
predicted class: 39   ⇒ d (大正解!)
$ python classify_chars.py input3.png
predicted class: 6    ⇒ 6 (正解は5)

最終行のclass欄が予測クラス番号。例えば6なら、データのSample007に対応。

$ eog data/English/Hnd/Img/Sample007/img007-001.png
$ eog data/English/Fnt/Sample027/img007-00001.png

で答え合わせ。

参考)

 Ubuntu 14.04 上での Caffe の導入手順メモ←コンパクトでよい

 Ubuntu14.04にCaffeをインストール(CPUモード)

 Ubuntu 14.04にCaffeをインストール(GPU編)

 Caffeで手書き数字(MNIST)の認識学習をする

 ネットやパラメータ定義に関する説明その日本語訳

 Mocha版(様々な話題あり)

 CaffeでDeep Learning つまずきやすいところを中心に

 Hands on Tutorial with Caffe

 pycaffeに関するwiki

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

 素人がCaffeを使ってDeepLearningしてみた(実践編)

 MNIST 手書き数字データを画像ファイルに変換する

 Caffeを使って自分で作ったデータセットを学習させる(少女時代編) ←これをなぞれば理解が深まる気がする←データがない

 Caffeを使って手書きのひらがなを識別する←これもデータがない

 OSX10.10でCaffeをインストール、リファレンスモデルで画像を分類

 Caffeで手軽に画像分類

 『Caffeで手軽に画像分類』が手軽にできない。

 ノート/Caffeのモジュール記述抜粋(caffe.prototxt)

 ノート/Caffeのデモプログラムを試してみる (2014-12-24)

GPU版で躓いたとき、下記でうまくいった。(これは間違えてUbuntu i386版をインストールしていた時代の話。その後インストールし直した)

$ sudo apt-get remove --purge nvidia-*
$ sudo add-apt-repository ppa:xorg-edgers/ppa -y
$ sudo apt-get update
$ sudo apt-get install nvidia-352
$ sudo apt-get install cuda
$ shutdown -r now

参考)http://stackoverflow.com/questions/32493904/could-not-insert-nvidia-352-no-such-device の3番目の書き込み

 pythonを使った作業例

reference用に有名どころのnetをダウンロード

BVLC Reference CaffeNet

$ ./scripts/download_model_binary.py models/bvlc_reference_caffenet

BVLC AlexNet

$ ./scripts/download_model_binary.py models/bvlc_alexnet

BVLC Reference R-CNN ILSVRC-2013

$ ./scripts/download_model_binary.py models/bvlc_reference_rcnn_ilsvrc13

BVLC GoogLeNet

$ ./scripts/download_model_binary.py models/bvlc_googlenet

各netの説明などは公式ページを見る

「hValueError: Mean shape incompatible with input shape」なるエラー対策

caffe/python/caffe/io.py の253-254行目

if ms != self.inputs[in_][1:]:
    raise ValueError('Mean shape incompatible with input shape.')

を次のように修正

if ms != self.inputs[in_][1:]:
    print(self.inputs[in_])
    in_shape = self.inputs[in_][1:]
    m_min, m_max = mean.min(), mean.max()
    normal_mean = (mean - m_min) / (m_max - m_min)
    mean = resize_image(normal_mean.transpose((1,2,0)),in_shape[1:]).transpose((2,0,1)) 

疑問1

examples/mnist/lenet.prototxt

examples/mnist/lenet_train_test.prototxt

の2つあるのはなぜ?

前者は分類の時に使用

後者は訓練の際に使用

疑問2

Python Layer とは何か?

prototxtに記述する層の定義とpythonのプログラムを関連付けられる

Using the Python Layer (Google Groups)にも記述あり

この機能を使うには、Makefile.configで

WITH_PYTHON_LAYER := 1

として

$ make -B

Caffeについて困ったときやわからないことがあった時は、

caffe users mailing list

github issue

github issue

とのこと(CaffeでDeep Learning つまずきやすいところを中心に

パラメータ値を参照するとき

>>> net.params['conv1'][0].data.shape
(96, 3, 11, 11)

>>> net.params['conv1'][1].data.shape
(96,)

>>> net.params['conv1'][1].data
biasのパラメータ値

参考) http://hirotaka-hachiya.hatenablog.com/entry/2015/08/02/215547

Caffeに新しいLayerを追加するとき

InnerPorductLayerの実装

LIBSVMのデータフォーマットでの入力を可能にするDataLayerの自作

Developing new layers(公式)

Making a Caffe Layer

Making your first layer

C++, CUDAのソースはここ

C++のヘッダーはここ

テストコードはここ

TensorFlow で MNIST

公式インストールページの pip install に沿って進める

$ sudo apt-get update
$ sudo apt-get install python-pip python-dev

ここで、CPU版は

$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl

一方、GPU版は

$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl

環境変数を設定

$ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64"
$ export CUDA_HOME=/usr/local/cuda

下記をエラーなく実行できることを試す

$ python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> sess.run(hello)
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> sess.run(a+b)
42
>>>

python libraryのpathを下記コマンドで確認

$ python -c 'import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))'

いざ、実行

$ python -m tensorflow.models.image.mnist.convolutional
$ python /usr/local/lib/python2.7/dist-packages/tensorflow/models/image/mnist/convolutional.py

随分遅いというのが正直な印象。⇒TensorFlowの勉強はあとまわし

参考)

UbuntuにTensorFlowをインストール

TensorFlow 畳み込みニューラルネットワークで手書き認識率99.2%の分類器を構築 ←pythonプログラムへの日本語説明あり

ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース(TensorFlow, Chainer, Caffe, DeepDream, 画風変換)

chainer で MNIST

公式ページ

ここ を大いに参考にした

既に諸々インストールされているので、

$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ python get-pip.py

が、エラー終了。"pip install --upgrade pip"を検討せよとのメッセージ。

$ pip install --upgrade pip

するも、permission denied。そこで

$ sudo pip install --upgrade pip

とすると、/home/nagai/.cache/などのpermissionについてのメッセージあり。 そこで、

$ chmod 777  /home/nagai/.cache/pip
$ chmod 777 /home/nagai/.cache/pip/http
$ sudo python get-pip.py

依然、何やらメッセージが出るが、pipのバージョンは新しくなった

$ pip -V
pip 8.1.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)
$ sudo pip install --upgrade pip
$ sudo pip install --upgrade setuptools
$ sudo pip install numpy
$ sudo pip install h5py
$ sudo pip install --upgrade cython

ここで、環境変数をチェック。 この時点までに ~/.bashrc に追加した設定は下記の通り。

# for Caffe & Chainer
export LD_LIBRARY_PATH=/usr/local/cuda/lib64
export PATH=/usr/local/cuda/bin:$PATH
export CUDA_PATH=/usr/local/cuda

# for pycaffe
export PYTHONPATH=~/Caffe/python/

では続行。

$ git clone https://github.com/pfnet/chainer.git
$ cd chainer
$ sudo python setup.py install

chainer-1.8.1がinstallされたとのメッセージあり。 何となく、リンクに張り替えておく。

$ cd ..
$ mv chainer chainer-1.8.1
$ ln -s chainer-1.8.1 chainer
$ cd chainer

いよいよ、MNISTを学習

$ cd chainer/examples/mnist/
$ time python ./train_mnist.py -g 0

データファイルをいろいろダウンロードするので、chainer/examples/mnist/ で実行するといいだろう

chainer で MNIST

ここのプログラムを大いに参考に実装

GPU化はここを参考にしたが、ここのプログラムは致命的な欠陥があるので要注意

# coding:utf-8
import six.moves.cPickle as pickle
import six
import chainer
from chainer import cuda
import chainer.functions as F
from chainer import optimizers
import cv2
import numpy as np
# from dataArgs import DataArgumentation
import argparse


# NN設定
batchsize = 100
n_epoch = 10
IMGSIZE = 28

# GPU
parser = argparse.ArgumentParser(description='Chainer example: MNIST')
parser.add_argument('--gpu', '-gpu', default=-1, type=int,
                    help='GPU ID (negative value indicates CPU)')

# GPUが使えるか確認
args = parser.parse_args()
if args.gpu >= 0:
    cuda.check_cuda_available()
xp = cuda.cupy if args.gpu >= 0 else np


# データセット読み込み
x_train = []
x_test = []
y_train = []
y_test = []


import re
patt = re.compile(r'.*_([0-9])\.jpg')

import os
imgs = os.listdir('./jpg-train/')
for img in imgs:
    if img.find('.jpg') > -1:
        src = cv2.imread('./jpg-train/' + img, 0)
        src = cv2.resize(src, (IMGSIZE, IMGSIZE))
        # dargs = DataArgumentation(src)
        src = cv2.bitwise_not(src)
        x_train.append(src)
        obj = patt.match(img)
        if obj:
            # print obj.group(1)
            y_train.append( int(obj.group(1)))
        # for x in xrange(10):
        #     dst = dargs.argumentation([2, 3])
        #     ret, dst = cv2.threshold(
        #         dst, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
        #     x_train.append(dst)
        #     y_train.append(unicode2number[_unicode])
        #     # cv2.imshow('ARGUMENTATED', dst)
        #     # cv2.waitKey(0)
        #     # cv2.destroyAllWindows()

print('N = %d' % len(y_train))

imgs = os.listdir('./jpg-test/')
for img in imgs:
    if img.find('.jpg') > -1:
        src = cv2.imread('./jpg-test/' + img, 0)
        src = cv2.resize(src, (IMGSIZE, IMGSIZE))
        src = cv2.bitwise_not(src)
        x_test.append(src)
        obj = patt.match(img)
        if obj:
            # print obj.group(1)
            y_test.append( int(obj.group(1)))


# 読み込んだデータを0~1に正規化,numpy.arrayに変換
x_train = np.array(x_train).astype(np.float32).reshape(
   (len(x_train), 1, IMGSIZE, IMGSIZE)) / 255
y_train = np.array(y_train).astype(np.int32)
x_test = np.array(x_test).astype(np.float32).reshape(
   (len(x_test), 1, IMGSIZE, IMGSIZE)) / 255
y_test = np.array(y_test).astype(np.int32)
N = len(y_train)
N_test = len(y_test)

print('N = %d %d' % (N, N_test))


# モデルの設定
model = chainer.FunctionSet(conv1=F.Convolution2D(1, 20, 5, pad=1),
                            #bn1=F.BatchNormalization(20),
                            conv2=F.Convolution2D(20, 50, 5, pad=1),
                            #bn2=F.BatchNormalization(50),
                            ip1=F.Linear(1800, 500), # 1800=6*6*50?
                            ip2=F.Linear(500, 10))

# GPU使用のときはGPUにモデルを転送
if args.gpu >= 0:
    cuda.get_device(args.gpu).use()
    model.to_gpu()


def forward(x_data, y_data, train=True):
    x, t = chainer.Variable(x_data, volatile=not train), chainer.Variable(
        y_data, volatile=not train)
    # h = F.max_pooling_2d(F.relu(model.bn1(model.conv1(x))), 2)
    # h = F.max_pooling_2d(F.relu(model.bn2(model.conv2(h))), 2)
    h = F.max_pooling_2d(F.relu(model.conv1(x)), 2)
    h = F.max_pooling_2d(F.relu(model.conv2(h)), 2)
    # h = F.dropout(F.relu(model.fl4(h)), train=train)
    h = F.relu(model.ip1(h))
    y = model.ip2(h)
    return F.softmax_cross_entropy(y, t), F.accuracy(y, t)


# オプティマイザーの設定
optimizer = optimizers.Adam()
optimizer.setup(model.collect_parameters())


# 学習のループ
for epoch in six.moves.range(1, n_epoch + 1):
    print('epoch', epoch)
    # 学習
    perm = np.random.permutation(N)
    sum_accuracy = 0
    sum_loss = 0
    for i in six.moves.range(0, N, batchsize):
        x_batch = xp.asarray(x_train[perm[i:i + batchsize]])
        y_batch = xp.asarray(y_train[perm[i:i + batchsize]])
        optimizer.zero_grads()
        loss, acc = forward(x_batch, y_batch)
        loss.backward()
        optimizer.update()
        sum_loss += float(cuda.to_cpu(loss.data)) * len(y_batch)
        sum_accuracy += float(cuda.to_cpu(acc.data)) * len(y_batch)
        # 動作確認のため定期的に出力
        if i % 10000 == 0:
            print 'COMPUTING...'

    print('train mean loss={}, accuracy={}'.format(
        sum_loss / len(y_train), sum_accuracy / len(y_train)))

    # テスト
    sum_accuracy = 0
    sum_loss = 0
    for i in six.moves.range(0, N_test, batchsize):
        x_batch = xp.asarray(x_test[i:i + batchsize])
        y_batch = xp.asarray(y_test[i:i + batchsize])

        loss, acc = forward(x_batch, y_batch, train=False)
        sum_loss += float(cuda.to_cpu(loss.data)) * len(y_batch)
        sum_accuracy += float(cuda.to_cpu(acc.data)) * len(y_batch)

    print 'test mean loss={}, accuracy={}'.format(sum_loss / len(y_test), sum_accuracy / len(y_test))

    # モデルの保存
    pickle.dump(model, open('model' + str(epoch), 'wb'), -1)

まず、 画像ファイルが jpg-train, jpg-test にあることを想定している。 Caffeでの作業中に作った画像ファイルを参照する

$ ln -s ~/Caffe/data/mnist/jpg-train .
$ ln -s ~/Caffe/data/mnist/jpg-test .

どこかで

$ sudo apt-get install python-opencv

実行は

$ python train-mnist.py

にてCPUにて実行

$ python train-mnist.py --gpu=0 | tee log

にてGPUにて実行

画像ファイルの読み込みが意外と時間が掛かる(Caffeのサンプルがlmdbなる形式に変換していた理由が分かった気がする)

CPUでの実行は、Caffeに比べてかなり遅い(5倍程度)

GPUでの実行は、Caffeより若干遅い(3割増し程度)

グラフ化は

$ grep test log | sed -e 's/[a-z= ]//g' | tr ',' ' ' | cat -n | data2ps.pl -color -title=loss,accuracy | viewps.pl

参考)

ディープラーニング フレームワークChainerを試しながら解説(Qiita)

Chainerチュートリアルの和訳

chainerでサンプルコードを動かすまで

Chainer: 例題 MNIST の学習

質問はここらしい

Chainer の imagenet サンプルで遊んでみる

chainerのサンプルコードを集めてみた(チュートリアルも追加)

はじめてのDeepLearning入門(Chainer) 日本語文字認識

ChainerでCIFAR10

ChainerでResNet

Chainerでファインチューニングするときの個人的ベストプラクティス

Chainer Reference Manual

Convolutional Neural Networkを実装する(主にAlexNet)

ETLCDB ETLの日本語文字データベース

公式にはここからダウンロード

ここにpythonのコードも

$ mkdir ETL9B ←不適切だろうがプログラムに合わせる
$ cd ETL9B
$ mv /somewhere/ETL2.zip .
$ unzip ETL2.zip
$ mv /somewhere/ETL8G.zip .
$ unzip ETL8G.zip
$ mv /somewhere/ETL9G.zip .
$ unzip ETL9G.zip

$ cd ..
$ mkdir src

ETL2の展開

$ wget -O co59-utf8.txt 'http://www.cs.gunma-u.ac.jp/~nagai/wiki/index-write.php?plugin=attach&pcmd=open&file=co59-utf8.txt&refer=Deep%20Learning%B4%D8%B7%B8'
$ wget -O etl2.py 'http://www.cs.gunma-u.ac.jp/~nagai/wiki/index-write.php?plugin=attach&pcmd=open&file=etl2.py&refer=Deep%20Learning%B4%D8%B7%B8'
$ sudo pip install bitstring
$ python etl2.py

にて、ETL2, ETL2_sheet に展開

ETL8Gの展開

$ wget -O code-table.txt 'http://www.cs.gunma-u.ac.jp/~nagai/wiki/index-write.php?plugin=attach&pcmd=open&file=code-table.txt&refer=Deep%20Learning%B4%D8%B7%B8'
$ wget -O etl8g.py 'http://www.cs.gunma-u.ac.jp/~nagai/wiki/index-write.php?plugin=attach&pcmd=open&file=etl8g.py&refer=Deep%20Learning%B4%D8%B7%B8'
$ python etl8g.py

にて、ETL8G, ETL8G_sheet に展開 (所要確か3分くらい)

ETL9Gの展開

$ wget -O code-table.txt 'http://www.cs.gunma-u.ac.jp/~nagai/wiki/index-write.php?plugin=attach&pcmd=open&file=code-table.txt&refer=Deep%20Learning%B4%D8%B7%B8'
$ wget -O etl9g.py 'http://www.cs.gunma-u.ac.jp/~nagai/wiki/index-write.php?plugin=attach&pcmd=open&file=etl9g.py&refer=Deep%20Learning%B4%D8%B7%B8'
$ python etl9g.py

にて、ETL9G, ETL9G_sheet に展開 (所要確か12分くらい)

他のデータもここのpythonコードを基に同様に展開できるはず

code-table.txtはここから取得

ResNet

論文はIdentity Mappings in Deep Residual Networks

  GitHub Torchベース

ResNetのもともとの論文はDeep Residual Learning for Image Recognition

  GitHub (pretrained版)  Torchベース

ResNet-50までは12GBに収まる(らしい)

ResNetの実装で比較するDeep Learning フレームワーク ←ResNet-110の各種フレームワークによる実装あり

chainer版のGitHub (CIFAR10用、ResNet-110) 学習もできる

週末はChainerでResNet152を試したりした

 【勝利】 Microsoftの152層CNNを学習させるためにChainerを改造する!【機械学習

  • 結論として、TITAN X + Chainer 上で ResNet-152 を学習させるのは厳しいかも(無理矢理動かせても遅いため)
  • 問題はGPUのメモリ
  • もしかしたら、Torchはその点が優れている?
  • Kaiminging He はどんな GPU を使っているのだろう?(CNTKは使っていないと思う。Torchのはず⇒ResNetのCNTK + python実装があった
  • Chainerのcaffefunction.pyは要注目

Wide Residual Networks GitHub

有望かも

https://github.com/szagoruyko/wide-residual-networks/blob/master/models/wide-resnet.lua#L92-L93 のopt.widen_factorが特徴的

https://github.com/raghakot/keras-resnet/blob/master/resnet.py#L212 をk倍すればいい気がする

CNTK の情報

Setup CNTK on your machine (右に色々な項目がある)

Multiple GPUs and machines

Setup CNTK on Linux

CNTK v2 では python もサポート

GitHubからダウンロード


添付ファイル: fileetl9g.py 27件 [詳細] fileetl8g.py 32件 [詳細] fileetl2.py 23件 [詳細] filecode-table.txt 33件 [詳細] fileco59-utf8.txt 31件 [詳細] filerecog-chars74k.tar.gz 89件 [詳細] filemnist_lenet_train_test.png 296件 [詳細] filecreate_etl4.py 105件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-03-15 (水) 20:40:13 (72d)