kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

tensorflowチュートリアル

tensorflowのチュートリアルをそのまま実行し、書いた内容を理解するための記事です。

www.tensorflow.org

コメントもチュートリアルに書いてある内容を書き込み、自分の理解できるように追記してみました。

import tensorflow as tf

# 画像を分類するニューラルネットワークを構築する
# このニューラルネットワークを訓練する
# そして最後に、モデルの正解率を評価する

mnist = tf.keras.datasets.mnist

## xは28x28の白黒のデータ
## yは正解の値
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(y_train)
## 白黒のためグレースケールになっており0-255の内容になっている。255で割り浮動小数点へ変換
x_train, x_test = x_train / 255.0, x_test / 255.0

# 層の設定
# 層を積み重ねてtf.keras.Sequentialモデルを構築します。訓練のためにオプティマイザと損失関数を選びます。
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10)
])

# モデルはそれぞれの標本について、クラスごとに"ロジット"や"対数オッズ比"と呼ばれるスコアを算出します。
## predictions = 予測
predictions = model(x_train[:1]).numpy()
print(predictions)

# tf.nn.softmax 関数はクラスごとにこれらのロジットを "確率" に変換します。
## ソフトマックスは単語だけ聞いたことがあります。
tf.nn.softmax(predictions).numpy()
print(predictions)

# 損失関数は、ロジットと True の インデックスに関するベクトルを入力にとり、それぞれの標本についてクラスごとに損失のスカラーを返します。
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

## モデルのコンパイル
## Adamオプティマイザ
## オプティマイザについては別途勉強したほうが良い。今はおまじないみたいな状態
# メトリクス(metrics) —訓練とテストのステップを監視するのに使用します。下記の例ではaccuracy (正解率)、つまり、画像が正しく分類された比率を使用しています
model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])

# Model.fit メソッドは損失を最小化するようにモデルのパラメータを調整します。
## データから訓練をしてmodelを鍛えている部分
model.fit(x_train, y_train, epochs=5)

# Model.evaluate メソッドはモデルの性能を検査します。
## データの検証
model.evaluate(x_test,  y_test, verbose=2)

mnistの内容について

MNIST 手書き数字データベースについて詳細が記載されています。

keras.io

どういうデータを解析しているか理解するために一度目を通すといいと思います。

機械学習用のサンプルデータが用意されているため、理解するためにも活用していきます。

オプティマイザ

Kerasで利用できるオプティマイザが記載されています。

keras.io

詳細は論文のリンクを読むしかなさそうですね。このあたりは、色々と読んで試していく方針しかなさそうです。機械学習をやっている人はみんな理解してる内容だったりするのかな。周りに機械学習をやっている人がいないから単語すら聞いたことがないです。

本当に1から勉強だなー

流れ

  1. 層の設定
  2. データの変換
  3. モデルのコンパイル(モデルの損失関数,オプティマイザ,メトリクスの設定 )
  4. 訓練
  5. テスト

この流れがまず思い通りにできるようになれば進歩できそうですね。

まずは動かしてみて期待値をあげていく試行を繰り返すところからです。

チュートリアルはそのまま動くし、コード量も少ないためかなり良いチュートリアルだと思います。

とりあえず動かせました。