ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
これの続き
前回,日曜日に~とか書いてたのにその後やってないのはまぁ研究がですね.うん.
自分で書いたコードはここ.
3章 3.6から
MNISTを読み込み,表示
mnist_test.py
表示のためにmtplotlibを使うが,エラー.
ここを見て解決.
Python3.4.0, matplotlib1.4.3でplot時にエラーが出る : mwSoft blog
表示できた.5.
ラベル予測
サンプルの重みを使ってMNISTのラベル予測をする.(neuralnet_mnist.py
)
通常版とバッチ処理版と.
[ru@ru_pc]ch03 % python3 neuralnet_mnist.py Accuracy: 0.9352 Accuracy(batch_size=100): 0.9352
わーい.
4章
いよいよ学習.
損失関数
学習のためには損失関数が必要.
交差エントロピー誤差関数を用意する.バッチ処理に対応させる.(loss_funcs.py
)
ミニバッチの準備
ミニバッチで学習できるよう,データをランダムに取り出す.(mini_batch.py
)
numpy.array
のこの挙動,とても変な感じがするんだが,そんなことない?
In [1]: import numpy as np In [2]: x = np.array([[0, 0], [1, 1], [2, 2], [3, 3]]) In [3]: x[[0, 2]] Out[3]: array([[0, 0], [2, 2]])
行のリストを渡すと,その行だけ残った形のarrayになる.
これを利用してランダムな行を抜き出している.
batch_mask = np.random.choice(train_size, batch_size) x_batch = x_train[batch_mask]
数値微分
勾配法の準備として,数値微分も実装する.(grads.py
)
微分
前方差分だと誤差が大きく,誤差を小さくしようと分母を小さくしすぎると丸め誤差の問題が出てくるため,中心差分を使う.
適当な関数の適当な値で微分してみる.(diff_test.py
)
これを利用して各点での偏微分ももとめられるが割愛.
勾配
勾配をもとめる.(grads.py
)
2変数の場合を想定すると,グリッド上の各点で偏微分を行い, をもとめる.
もとめられたベクトルをグリッド上に並べた図を作ってみる.(gradient_test.py
)
元のプログラムでは偏微分計算時にf(x)
に渡されるxが(x_0, x_1)
ではなく,データ点数次元のx_0やx_1になっている.
def function_2(x): print(x.shape)
[ru@ru_pc]ch03 % python3 gradient_method.py (324,) (324,) . . (324,)
しばらく悩んだが,転置して,fに正しく(x_0, x_1)を渡すように変更しても全く同じグラフが出た.
x_0, x_1が対称で,グラフの範囲も対称なので行列計算的にたまたま同じ勾配になるっぽい?
意味的にはやっぱり変なので自分のを採用.
びびりながらプルリクも送ってみた.
勾配法
勾配が最小値を指す(正確には,局所的に勾配が小さくなる方向を指す)のを利用する勾配法.
勾配に学習率(,lr)をかけた量ずつ変化させて最小値を目指す.
まずは適当な関数の最小値を探してみる.(gradient_method.py
)
numpyで列ベクトルを得るのはこうするんやね.行は全部(:)で,列は1行目,的な.
In [1]: import numpy as np In [2]: a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) In [3]: a[2, 1] Out[3]: 8 In [4]: a[:, 1] Out[4]: array([2, 5, 8])
学習率を変えてみると,中心を飛び越えながら近づいたり,変化量が少なすぎてたどり着かなかったりする.
数値微分のとこで結構疲れたので,とりあえずここまで.
つづきは忙しいので12月.
所感
るるるるねるるる
— る (@yue_roo) November 1, 2016