tensorflowのチュートリアル(MNISTビギナー編)
チュートリアルを翻訳していく。
MNISTは機械学習の"Hello World"だよ。
手書き数字の画像と数字のデータセットを使って、訓練して数字を予測するん。
ソフトマックス(多項ロジスティック)回帰と呼ばれる、単純なモデルで説明するよん。
ソースコードは"tensorflow/examples/tutorials/mnist/mnist_softmax.py"かな。
MNISTデータ
MNISTデータを"input_data.py"でダウンロードするようにしておいた。
下のコードをコピーしてデータを使いな。
訓練データ:55000、テストデータ:10000.、検証データ:5000だ。
これがいい感じの割合なんだ。
xsに28x28=784次元ベクトル(値は0~1)を55000個。
ysに0~9の数字(値は0か1で1種類)を55000個。
準備完了。モデル設計をはじめよう。
ソフトマックス回帰
画像をみてそれが0~9のどれに一致するかを確率で出すことにする。
確率をだすならソフトマックスでやるんだ。
複雑なモデルであっても最後の層はそうすることになる。
んで数式だ。
evidence(i)は各数字の結果
x(j)は784の入力
w(i,j)は結合線の重み
b(i)はバイアス
合計して求める。
それをsoftmaxで確率にする。
行列でいろいろやって、最後はシンプルに。
画像引用な。
実装
Pythonで実装するよ。
行列計算はnumpyをつかうとモデルと分離しやすい。
・tensorflow使うぜ定義:
import tensorflow as tf
・変数使うぜ定義:
x = tf.placeholder(tf.float32, [None, 784])
決まってない変数のところは、入力データの数を入るようにするべ。
んでこれは、浮動小数点(float32)の784個の2次元配列になってんよ。
・あと重みとバイアスが必要だな
これは変更できる数(Variable)にしとく。
W = tf.Variable(tf.zeros([ 784、10 ]))
b = tf.Variable(tf.zeros([ 10 ]))
初期値は0になってる。訓練で覚えていくから気にしなくていい。
次は行列のところをやるんだけど、1行で書けちゃう。
tensorflowすごい!
y = tf.nn.softmax(tf.matmul(x、W)+ b)
これでおしまいだ。簡単だろ?
訓練
コストとロスを定義する。
一般的には交差エントロピーを使うのがいいんだ。詳しくはググってくれ。
変数を追加しよう。
y_ = tf.placeholder(tf.float32, [None, 10])
で交差エントロピーっと、
cross_entropy = -tf.reduce_sun(y_*tf.log(y))
yの対数を計算して、要素に対応するy_をかけて、
reduce_sumがすべての要素に追加する。これは1枚の画像だけな。
バックプロパゲーションで訓練してやんよー
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
学習率は0.01で、勾配降下法をつかう。
訓練の前に初期化する操作:
init = tf.initialize_all_variables()
訓練開始:
sess = tf.Session()
sess.run(init)
訓練は1000回ループだー
for i in range(1000):
batch_xs, batch_ys = mnist.train.next.batch(100)
train_step.run({x: batch_xs, y_: batch_ys})
バッチは100個のランダムで取得する。
train_stepになんかする。(ここはよくわからんなー)
評価
tf.argmax使うと配列の最大値がとれるよ。
yとy_で比較できんよ。
tf.reduse_meanで平均値をとれる。
精度を表示するよ。だいたい91%くらいかな。
あまりよくない。ちょっといじれば97%くらいにできるぜ。
すげーのだと99.7%のもあんよ。
え、こんなもん。がっかりだって?
上級者向けのコースがありまっせ。旦那。
翻訳おしまい。
Deep LearningのGPU環境構築
(2016/3/4追記)この記事の内容は古くなっています。
tensorflow 0.7.1, chainer 1.7.0の場合、CUDA 7.5 + cuDNN v4を設定すること。
Ubuntu 14.04 LTS 64bitのインストール
システムの更新
$ sudo apt-get update $ sudo apt-get dist-upgrade
リセット
nVidiaドライバのインストール
システム設定→ソフトウェアとアップデート→追加のドライバー NVIDIA binary driver を選択 変更の適用
CUDA toolkitのインストール
事前にダウンロードする
$ sudo dpkg -i cuda-repo-ubuntu1404_7.0-local_7.0-28_amd64.deb $ sudo apt-get update $ sudo apt-get install cuda
.bashrcに追記
export CUDA_HOME=/usr/local/cuda-7.0 export PATH=$CUDA_HOME/bin:$PATH export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
cuDNNライブラリ
$ wget http://developer.download.nvidia.com/compute/redist/cudnn/v4/cudnn-7.0-linux-x64-v4.0-rc.tgz $ tar -xzvf ./cudnn-7.0-linux-x64-v4.0-rc.tgz $ sudo mkdir /usr/local/cudnn-v4-rc $ sudo cp -r cuda /usr/local/cudnn-v4-rc
.bashrcに追記
export CUDNN_HOME=/usr/local/cudnn-v4-rc/cuda export CPATH=$CUDNN_HOME/include:$CPATH export LIBRARY_PATH=$CUDNN_HOME/lib64:$LIBRARY_PATH export LD_LIBRARY_PATH=$CUDNN_HOME/lib64:$LD_LIBRARY_PATH
ファイルのコピー
$ cp /usr/local/cudnn-v4-rc/cuda/include/cudnn.h $CUDA_PATH/include $ cp /usr/local/cudnn-v4-rc/cuda/lib64/libcudnn* $CUDA_PATH/lib64
※追記
tensorflow 0.7.0のバイナリだと実行時にCUDNNのエラーがでる。
v3-prodのcuDnnに変えれば実行できる。
v4ができそうな記載あるからソースからビルドするも、
bazelのビルドエラーが解決できない。
CNTK の cuDNN v4 ビルドエラー対応
エラー:
1>C:/CNTK/Source/Math/CuDnnConvolutionEngine.cu(507): error : argument of type "const float *" is incompatible with parameter of type "void *"
原因:
cuDNN v4 Rc から cuDNN v4 Prodで、APIの引数が変わった。
対応:
Before
CUDNN_CALL(cudnnBatchNormalizationBackward(m_cudnn, mode, &C::One, &C::One, t(inT), ptr(in), t(inT), ptr(srcGrad), t(inT), ptr(grad),
t(scaleBiasT), ptr(scale), ptr(scaleGrad), ptr(biasGrad), CUDNN_BN_MIN_EPSILON, ptr(saveMean), ptr(saveInvStdDev)));
After
CUDNN_CALL(cudnnBatchNormalizationBackward(m_cudnn, mode, &C::One, &C::One, &C::One, &C::One, t(inT), ptr(in), t(inT), ptr(srcGrad), t(inT), ptr(grad),
t(scaleBiasT), ptr(scale), ptr(scaleGrad), ptr(biasGrad), CUDNN_BN_MIN_EPSILON, ptr(saveMean), ptr(saveInvStdDev)));