こんにちはRyujiです。
今日は機械学習とDeepLearningを勉強したので、それについて書いていきます。
Contents
今日何作ったか
今日はTensorFlowとKerasを使ってDeepLearningを勉強しました。
手書きの数字を入力として与えて、
たくさん学習させた後、コンピュータが認識した結果を出力するプログラム
企画
朝9時さぁ今日は何をしようかなー
周りにpythonやり始めた人が多いからpythonで機械学習を勉強しよう!
ということでchainer入門チュートリアルで学習を始めました。
軽く勉強してアプリ作ろっかな^^って軽い気持ちで手を出しました。(結果機械学習は1日でどうこうできる代物ではなかったです。)
学習
Chainer Tutorialさんで勉強させてもらいました。
https://tutorials.chainer.org/
ここで勉強したことです。
- 機械学習とは
- 微分
- 線形代数
- pythonの文法
微分と線形代数は大学で勉強したので、少し覚えていました。
微分の基礎
xの二乗を微分すると2xになります。xを微分すると1になります。定数を微分すると消えて無くなります。
線形代数の基礎
行列の掛け算は縦横で計算します。
(1)ならば1×3+2×4
(2)ならば上の段に1×5+2×6、下の段に3×5+4×6みたいな
アプリを作りたい
とてもよいチュートリアルですが、アプリとして作るにはかなり時間がかかることがわかりました。
やばい!1日1アプリの宣言が2日目で崩れてしまう!
ということで急遽学習教材の変更!すでにおやつの時間帯です。
学習2
Aidemyさんの無料教材で学習することにしました。
初めてのDeapLearningの教材としては最強なんじゃないかな!
ここで学んだこと
- DeapLearningの仕組み
- ニューロン、ニューラルネットワーク
- python
DeepLearning
Aidemyのチュートリアルの最後で楽しい演習があったので、それを今日のアプリとすることにしました。(よかった!目標達成できそう!)
ソースコードは以下です。python知らない人でも概要だけわかるように説明を後述します。ので読み飛ばしてください。
import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
from keras.layers import Activation, Dense
from keras.models import Sequential, load_model
from keras.utils.np_utils import to_categorical
from keras.utils.vis_utils import plot_model
# mnist.load_data()で手書き画像のデータセットを取得する。
# mnistで60000枚の学習データ、10000枚のテストデータが用意されている。
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# X:入力データを6000枚にする。 Y:テストデータを1000毎にする。
# reshape はデータの順番と総数をそのままに、配列の形だけ変える関数。2次元なので、1次元に直している
X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]
y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]
# Deep Learningで使用するネットワークのモデルを作成する。
model = Sequential()
# 一層ずつaddしていく
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid")) #活性化関数
model.add(Dense(128))
model.add(Activation("sigmoid")) #活性化関数
model.add(Dense(10))
# 最後はsoftmax関数を適用する。
model.add(Activation("softmax"))
# 学習処理を設定、モデルの生成終了
model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=["accuracy"])
# model.fit(X_train, y_train, verbose=True)
#学習を実行 batch_sizeのデータの個数、nb_epochの周回分学習
model.fit(X_train, y_train, nb_epoch=500, batch_size=1000)
# 結果の生成
print(np.argmax(model.predict(X_test[0:10]), axis=1))
# 画像の生成
for i in range(10):
plt.subplot(1, 10, i+1)
plt.imshow(X_test[i].reshape((28,28)), "gray")
plt.show()
簡単な説明
import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
from keras.layers import Activation, Dense
from keras.models import Sequential, load_model
from keras.utils.np_utils import to_categorical
from keras.utils.vis_utils import plot_model
まずはここでいろんなモジュールやらライブラリやらを引っ張ってきています。
(X_train, y_train), (X_test, y_test) = mnist.load_data()
さっき読み込んだ「mnist」ってモジュールが手書き数字の60000枚画像データ、10000枚のテストデータを用意してくれるようです。それを生成しています。
X_train = X_train.reshape(X_train.shape[0], 784)[:6000]
X_test = X_test.reshape(X_test.shape[0], 784)[:1000]
y_train = to_categorical(y_train)[:6000]
y_test = to_categorical(y_test)[:1000]
60000枚はちょっと多いんで6000枚で入力値X、正しい答えである目標値Yとしています。
model = Sequential()
DeepLearningは下の絵みたいな感じで学習していくんですよね!なので、その全体をmodelって変数に定義しました。
model.add(Dense(256, input_dim=784))
model.add(Activation("sigmoid")) #活性化関数
model.add(Dense(128))
model.add(Activation("sigmoid")) #活性化関数
model.add(Dense(10))
model.add(Activation("softmax"))
さっきのmodelに一層ずつaddしていきます。
活性化関数とかは説明難しいので割愛!
model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=["accuracy"])
modelの生成を完了しています。
model.fit(X_train, y_train, nb_epoch=500, batch_size=1000)
ここでnb_epochの回数分学習をしています。
成果物
そんなこんなで学習した結果、入力画像の数字がなんなのか判別してみました。
入力が
[7,2,1,0,4,1,4,9,5,9]
ですね!500回学習させた結果が下です。
[7,2,1,0,4,1,4,9,6,9]
惜しい!最後から二番目が6って出てる!
ほぼほぼあっているけど、1つ異なりました。でも高い精度ですよね。入力画像の5は6に見えないこともないです(笑)
まぁそんなわけでほぼチュートリアルですが2日目のアプリはこれで勘弁してください。
感想と反省
結論:DeepLearningは1日でやる分量ではない!
今日は数学チックで少し難しい内容でしたが、ここまで読んでくれた皆さんありがとうございました。
(補足)環境構築
私が実施したpythonの環境構築を書いておきます。
$brew update
$brew install python3
$python3 -V
Python 3.7.3
$pip3 install numpy
$pip install matplotlib
$mkdir ~/.matplotlib
$vi ~/.matplotlib/matplotlibrc
(追記)
backend : TkAgg
コメント