ニューラルネットの復習
最近趣味で機械学習を始めた(再開した)のでちょいちょいメモっていこうと思う。
以前もやった「ゼロから作るDeep Learning」にざっと目を通したところからスタート。 2周目ということもあって特に不明なところもなかったので、さっそくTensorflowのチュートリアルをやってみる
しかしチュートリアルでいきなりわからん言葉が出てくる
(x_train, y_train),(x_test, y_test) = mnist.load_data()
これは見たとおりなので問題ないが
model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation=tf.nn.relu), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation=tf.nn.softmax) ])
いきなり
Sequential
の意味が分からなくてうろたえたが、どうやらこれは層構造のモデルを使うという宣言のようなものらしい。
続く
Flatten()
は、次の層への入力をベクトルにする。
Dense()
は、通常(?)の層。全結合というらしい。通常でないものが何かと言えば例えば畳み込み処理を行う Conv2D
などがある。
activationで指定された関数が活性化関数として使われる。
Dropout()
はドロップアウト。引数が0.2 なら 20%が0に置き換えられる。
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
optimizer
にadamを使う、というところは特に疑問はないと思う。
損失関数の sparse_categorical_crossentropy
がなんなのかわからなかったが、
これは通常 categorical_crossentropy
がyに [0,0,1,0,0]
といったone-hot表現を受け取ることに対して、
sparse_categorical_crossentropy
だと、2
といった正解ラベルのインデックスを整数で受け取ることができる。便利。
metrics=['accuracy']
を指定しないとlossしか標準出力に出てこなくて寂しいので思考停止で追加してよさそう。
model.fit(x_train, y_train, epochs=5)
で学習が始まる。引数の意味は見た通り。
model.evaluate(x_test, y_test)
で、テストデータを使って精度を検証することができる。
以上でチュートリアルで不明なところはなくなったと思うので、どんどん遊んでいきたい。
おまけ
ちなみに mnist.load_data()
の中身が気になったのでコードを読んでみた
mnist.npzというファイルがS3においてあり、それをダウンロードして
f = np.load(ファイル)
として、f['x_train'], f['y_train'] といった具合にアクセスしているらしい。
npzというファイルをどうやって作るのかというと
numpyが提供する関数 savez
または saves_compressed
で作成できる。
import numpy as np x_train = np.array([省略]) y_train = np.array([省略]) np.savez_compressed("path/to/output.npz", x_train=x_train, y_train=y_train)
といった具合だ。 これをあらかじめ作っておくことで学習の時間を短縮することができる、ということらしい。