Software Engineer Blog

エンジニアブログです。技術情報(Go/TypeScript/k8s)や趣味の話も書くかもです。

Machine Learning事始め (TensorFlow)

概要

お盆休みを利用して、Machine LearningをTensorFlowのTutorialを通して触れてみました。
解いた問題は、手書き数値の認識です。

Machine Learning

おこなっていることは、任意のグラフに対して近似する関数(=Model)を見つけること

用語

  • データ
    • (Training用) データとそのラベルのセットを持つ必要がある
      • ex) 手書き文字 <-> 書いてある文字
    • (Test用) accuracyを計測するためのデータ
      • 同様にデータと正解ラベルを持つ必要がある
  • weight
  • bias
    • weightと入力値の積をずらす
  • x
    • 入力値
  • y
    • 出力
  • activation function
evidence = W * x + b

-------------------
Tensor
W = weight
x = input
b = bias
-------------------
  • softmax function
    • evidence(活性化関数=activation functionの結果)を確率へと変換する
    • 確率より 0 <= y <= 1
  • loss function
    • 期待値と実際の結果の差分を計測する関数
    • ※ loss functionの結果を0に近づけることが目標
      (=期待値と実際の値が一致する)

Machine Learningの流れ

  1. Trainingデータセットを用意する
  2. activation function(W * x + b)を定義
  3. loss functionを定義
  4. TrainingするOptimizerを決めて、loss functionをセットする
    ex) Gradient Decent (最小勾配法)
  5. Trainingを実施
    テストデータを利用して、関数を何度も実行する。
    実行するたびに、WbをOptimizeする。(TensorFlow利用時は勝手にOptimizeしてくれる)
  6. Modelのaccuracyを測定する

サンプルコード

github.com

手書き数値の認識

CNNを利用せずにの実装もできましたが、accuracyを上げるためにも、CNNを利用したほうが良いみたいです。

Convolutional Neural Network

  • 畳み込みニューラルネットワーク
  • 面を一定の大きさのフィルタで覆い、領域で特徴量を抽出する方法
    • ex) 32x32の画像を5x5のフィルタでスライド1の場合 => 28x28の画像となる
    • pixel単位でないため画像が全体的に類似しているかを判断できる
  • Filter
    • パラメータ
      • filterの数
      • filterの大きさ
      • filterの移動幅
      • padding
        • 画像の端の領域を0で埋める
  • Layer
    • Convolutional Layer
    • Pooling Layer
      • サイズを圧縮する層
      • max poolingが利用される
        • 領域内の最大値を取る手法
    • Fully Connected Layer

肝となると感じた部分

  • 大量のTrainingデータを用意すること
  • accuracyを向上させるためのチューニング

まとめ

基本的に、TensorFlowのTutorialを上からなぞってコード書いてみただけですが、
Machine Learningで何やってるかを少しだけ知ることができました。
絶賛、下記を読み込み中なので読めたらneural networksdeep learningについて
正確に理解できるかなと思います。

Neural networks and deep learning

ひとまずPythonでやってみてますが、GolangでもTensorFlow自体は使えるので、
書き直したいところです。

参考