Tensorflowのチュートリアルをやったメモ

ニューラルネットの復習

最近趣味で機械学習を始めた(再開した)のでちょいちょいメモっていこうと思う。

以前もやった「ゼロから作るDeep Learning」にざっと目を通したところからスタート。 2周目ということもあって特に不明なところもなかったので、さっそくTensorflowのチュートリアルをやってみる

しかしチュートリアルでいきなりわからん言葉が出てくる

www.tensorflow.org

(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() の中身が気になったのでコードを読んでみた

https://github.com/keras-team/keras/blob/d954aef2a2e33532f8725f58183cf605f5c54656/keras/datasets/mnist.py#L11-L28

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)

といった具合だ。 これをあらかじめ作っておくことで学習の時間を短縮することができる、ということらしい。