はじめる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% ←詳細不明

labellio web上のサービス

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からダウンロード

入手可能なデータ

Yahoo, 楽天, ニコニコ, リクルート, クックパッドなど


添付ファイル: fileetl9g.py 70件 [詳細] fileetl8g.py 63件 [詳細] fileetl2.py 49件 [詳細] filecode-table.txt 80件 [詳細] fileco59-utf8.txt 52件 [詳細] filerecog-chars74k.tar.gz 105件 [詳細] filemnist_lenet_train_test.png 373件 [詳細] filecreate_etl4.py 126件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-07 (金) 18:55:42 (79d)