#0010

初心者必読!MNIST実行環境の準備から手書き文字識別までを徹底解説!

2018-04-23 17:26 2018-05-29 12:02 "ゆざ"

プログラミング未経験の私がPythonの機械学習で手書き文字の識別を行うまで」というテーマで、機械学習について全く知識のない人もプログラミング未経験者の人にもわかりやすく、プログラミング歴の浅い私だからこそできる説明をしていきたいと思います。

前回は、ニューラルネットワークとはなにか、どんな構造なのかを簡単な例を踏まえて解説しましたので、今回は実際に機械学習をプログラミングへ落とし込み、Pythonで手書き文字(MNIST)識別するプログラムを実装していきます。

スポンサーリンク

前回のまとめ

前回の「知識ゼロで機械学習・AIを理解するために必要なニューラルネットワークの基礎知識」では、ニューラルネットワークの仕組みとその構造について説明していました。

>>前半:「知識ゼロで機械学習・AIを理解するために必要なニューラルネットワークの基礎知識」はコチラ

簡単におさらいしていきます。

前回のモデル概要

ニューラルネットワークの構造は、入力層・隠れ層・出力層の3つの階層からできて、それぞれに役割があります。

入力層では、ニューラルネットワークに入るように工夫したデータxをインプットします。その値xを隠れ層で、重みWと掛け合わして、バイアスbを足した値を活性化関数に入れることで特徴量を抽出します。

そして、最終的に予測値yを出力層で、(全てのW*隠れ層から出てきた値+b)をした値をソフトマックス関数に入れることで得ることができます。

さらに、この予測値yの精度を上げるためにコスト関数を用いて、Wとbを更新して予測値と正解ラベルとの誤差を最小にしていくように学習を行います。

これが、一連のニューラルネットワークの流れです。

今回ニューラルネットワークを活用して作ったもの

私はPythonを使って機械学習で、0から9の手書き文字を認識してくれるプログラミングを作りました。

例えば、手で書かれた0-9の10コの数字から1つ、例えば「8」を作成したモデルに入ると、「あなたが書いた数字は"8"です。」といった判別結果を返してくれるといったようなプログラミングです。

今回は、MNIST(エムニスト:Mixed National Institute of Standards and Technology database)と呼ばれる0から9の手書き文字が無数に含んだデータセットを使用しました。

私が作ったモデルは、MNISTを用いて識別率92%を得ることができ、プログラミング初心者の私でもかなり精度の高い識別器が作れました!

皆さんもニューラルネットワークの仕組みをしっかりと理解していれば決して難しくないので、ぜひ手を動かしてチャレンジみて下さい。

プログラミングの概要(全体像)

0から9の手書き文字を認識する識別器の機械学習で行うためには、

  1. データセットの作成
  2. 判別モデルの作成
  3. モデルを学習させる
  4. 学習したモデルをテストして精度を検証する

の大きく4つのステップに分けられます。順を追って説明していきます。

①データセットの作成

通常は、自分でデータセットを作成する必要がありますが、今回のデータセットは先程述べたMNISTを使用します。MNISTデータセットの取得は後述に記載しています。

このデータセットには、0 から 9 までの数字について手書き数字のグレースケール 28×28 ピクセル画像がテスト用に10,000枚、トレーニング用に55,000枚、検証用に5,000枚用意されています。

テスト用データセットは、学習したモデルの精度を調べるために使います。

トレーニング用データセットは、その名の通り、学習をさせるために何度も使用して、モデルに正解ラベルを覚えさせます。

検証用データセットは、テスト用との区別がしづらいのですが、一定のトレーニングが終わるごとに精度を検証するために使います。

コレを使用する時は、学習はさせません。そのため、一定の学習が済んだところに毎回トレーニングに使用していないまっさらなデータで精度を確かめることができます。

MNISTデータセットの扱い方の詳しい内容については、別の記事でも解説を行いますのでこのくらいにしておきます。

②判別モデルの作成(最重要!)

ここが最も重要なステップで、0から9を判別するモデルを作成します。モデルとは、ニューラルネットワークの構造を含むメインとなるプログラムを指します。

最も大事なステップではありますが、ニューラルネットワークの仕組みと構造を理解していれば、そこまで難しくないので心配ありません。

入力層・隠れ層・出力層の3つの階層に分けてニューラルネットワークを構築します。重みWとバイアスbはこのモデルの構造中に組み込まれます。

そして、出力層から出てきた予測値と正しい値を比較して誤差の平均値を計算し、その誤差を最小にするように誤差逆伝播法を用いて、重みWとバイアスbを更新していきます。

詳しい原理や仕組みについては前半の「知識ゼロで機械学習・AIを理解するために必要なニューラルネットワークの基礎知識」で解説していますので、そちらをご覧ください。

③モデルを学習させる

作成したモデルを実際に学習を行わせていきます。

トレーニング用の55,000枚の画像から任意の枚数(今回は100枚)分取り出して画像の塊を作成します。これをバッチ(batch)と言います。

このバッチ毎モデルに画像を入力して、学習を行わせます。バッチを用いるメリットは、バッチの枚数分ずつの誤差の平均値を使用して、誤差を最小にするように作用するため、1枚ずつ学習させるよりも画像の違いによる学習のばらつきを抑える役割があります。

これをミニバッチ学習といい、これを繰り替えることによってモデルを学習させます。この際に、検証用のデータを使用して予測させることによって、現在の精度を確認することができます。

検証用のデータを入力する際には学習はさせないことで、常にトレーニングに未使用なデータとして精度を正確に検証することができます。

④学習したモデルをテストして精度を検証する

学習したモデルをテストして精度を検証します。

テスト用に10,000枚のデータセットをモデルに入力して、推測値が10,000枚分のうち正しく推定できたのかを精度として示します。

ここで、自分が期待するような精度が得られなかった時は、ハイパーパラメータ(学習率α、重みWとバイアスbの初期値、隠れ層のノード(ニューロン)数、最適化関数(オプティマイザー)etc.)を変更して再学習を行うことでよりよい精度を目指しましょう。(※今回はその必要はありません。)

Pythonで機械学習の実装する前に準備すること

まだ、このままではPythonで機械学習を使ったプログラムを実装することはできないので、必要な道具を揃えるための準備を行っていきましょう。

Anacoda(アナコンダ)のインストール

Anacondaとは、Python本体とPythonでよく利用されるライブラリがセットになったPythonパッケージです。

anacondaのロゴ

これを使うことで簡単に環境設定を行え、すぐに高度な数値計算やデータ分析、機械学習等でできるようになります。

Anacondaの公式ホームページからダウンロードを行いましょう。自分が使っているPCのOSを選択して、Python3.6 version(2018/04/23現在)を選んで下さい。Python3系とPython2系は同じようにみえてかなり違うので注意してください。

また、Anacondaのパッケージの中にはjupyter notebook(ジュピターノートブック)というブラウザで動作するプログラムの対話型実行できるツールがあります。

これは、プログラムを書いたり、実行したりするのがとてもわかりやすくて便利で初心者から研究者まで使用している機能です。これから書いていくコードもjupyter notebookを使うと簡単に実装していくことができます。

詳しくは、AnacondaでのTensorFlow環境構築と基礎的な使い方で解説しています。

TensorFlow(テンサーフォロー)のインストール

次に、機械学習を行うのに便利なライブラリTensorFlow(テンサーフォロー)をインストールしていきます(テンソルフォローとも言う)。

TensorFlowのロゴ

TensorFlowがなくても、Pythonの基本的なライブラリのみで機械学習を実装することもできるので、別の記事でそれも解説したいと思っていますが、今回は便利なこのライブラリをコードを書いていきます。

TensorFlowとは、機械学習をする際に必要である複雑な計算を手軽に行うことができるオープンソフトウェアライブラリです。

ぶっちゃけコレを使うと、前半で説明した数学的な理解がなくても実装できてしまいます。笑

ただし、理解をしていないとどうして動いているのか分からないといった事態にもなりかねないので、原理を理解した上で進めていくことを強くおすすめします。

TensorFlowは、先程インストールしたAnacondaで簡単にインストールできます。

>>TensorFlowのインストール方法と基礎的な使い方はコチラ

MNIST(エムニスト)のダウンロード

MNISTの例

Yann LeCun's MNIST DATEBASEでダウンロードして下さい。ダウンロードしたデータセットは、コードを書いているファイルと同じ階層にMNIST_dataという名前をつけたファイルを作り、そのファイルの中に入れておいてください。

MNISTデータセットの詳しい扱い方は、「MNISTデータセットを実践的に使うためには(執筆中)」で改めて説明します。これで準備は整いました!

0から9の手書き文字を認識してくれる識別器:MNIST beginnerの解説

それでは、「0から9の手書き文字を認識してくれる識別器」の解説を行っていきます。

今回、ココで使用するのは、MNIST beginner(リンクは英語版)というTensorFlowのチュートリアルとして使用させるサンプルコードを使用していきます。

このMNIST beginnerはかなりシンプルなモデルとなっており、隠れ層と活性化関数がなく、入力層で入ってきたデータをそのまま、出力層に入れ込むカタチになっています。(下の図)

今回のモデル概要(隠れ層なし)

モデルの学習結果

まずは、モデルの学習結果を見てください。

以下のグラフがトレーニング時の予測成功確率です。縦軸が予測成功確率で、横軸がバッチの試行回数を表しています。

予測結果

5,000回バッチを入れて学習を行ったところで、すでに90%以上の予測成功率を叩き出しています。5,000回の試行をするのにかかったPCの処理時間も約7秒ほどなので、比較的簡単に0から9の数字の特徴量を抽出することができたことがわかります。

機械学習には膨大な処理時間がかかり、GPUを使わないといけないというイメージを持っている人も多いと思いますが、ここでの30,000回の試行にかかった時間は、約44秒でした。これは、入力層と出力層のみであったため、計算がそれほど複数にならなかったと考えられます。

ちなみに、TensorFlowのツールの1つであるTensorBoard(テンサーボード)を使用すれば、このような学習中の推移も簡単に見ることができます。TensorBoard(テンサーボード)の使い方も、別の機会に紹介したいと思います。

次に、トレーニング時の誤差のグラフをみていきましょう。

誤差の結果

この図の縦軸は、コスト関数から出てきた値を表しているのですが、直感的に試行を重ねるごとに誤差が減少していることがわかるのではないでしょうか。

そして、このようなトレーニングを終えた後に、学習で使用していないテスト用データセットを用いて、予測成功確率を検証しました。

テスト結果

つまり、初めてモデルが出会った画像データでも92.2%の確率で正しい値を予測することができるまで学習することができました。

まとめると、30,000回の試行では以下のような結果になります。

処理時間 トレーニング時の予測成功確率 テスト時の予測成功確率
44s 94.0% 92.2%

実際に使用したコード

実際に使用したコードは、

  • import:必要なライブラリをインポートする
  • init:初期値を設定する
  • model:モデルを作成する
  • training:モデルを学習させる
  • test:学習したモデルをテストして精度を検証する

の5つに分けて考えることができます。

では、実際のコードを見てもらいましょう。

# ===========import===========
import tensorflow as tf
import os
from tensorflow.examples.tutorials.mnist import input_data
# GPUの無効化
os.environ['CUDA_VISIBLE_DEVICES'] = ""

def main():
	# ===========init===========
	image_size = 28*28
	output_num = 10
	learning_rate = 0.001
	loop_num = 30000
	batch_size = 100

	mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

	# ===========model===========
	with tf.device("/cpu:0"):
		x = tf.placeholder(tf.float32, [None, image_size])
		W = tf.Variable(tf.zeros([image_size, output_num]))
		b = tf.Variable(tf.zeros([output_num]))
		y = tf.nn.softmax(tf.matmul(x, W) + b)
		y_ = tf.placeholder(tf.float32, [None, output_num])

		cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
		train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)
		correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
		accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

		init = tf.global_variables_initializer()
		sess = tf.InteractiveSession()
		sess.run(init)

		# ===========training===========
		for i in range(loop_num):
			batch_xs, batch_ys = mnist.train.next_batch(batch_size)
			sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

			if i % 1 == 0:
				print("step", i, "train_accuracy:", sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys}))

		# ===========test===========
		print("test_accuracy:", sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))


if __name__ == "__main__":
	main()
必要なライブラリをインポートする
# ===========import===========
import tensorflow as tf
import os
from tensorflow.examples.tutorials.mnist import input_data
# GPUの無効化
os.environ['CUDA_VISIBLE_DEVICES'] = ""

Pythonでは、ライブラリをインポートすることで便利なツールを手軽に使うことができます。

また、自分で書いたコードもインポートすることによって他のファイルで使うことができます。

ここでは、先程インストールしたtensorflowとMNISTの使用する上での処理が書かれているinput_data.pyというPythonファイルをインポートします。

osというライブラリもインポートするのですが、これは今回CPUを用いて実行していくのでGPUを無効化するコードを書くために使います。コレがなくても、CPUを使ってくれることもあるのですが、念のために書いておきます。

初期値を設定する
def main():
	# ===========init===========
	# 入力する画像のサイズ(28pixel*28pixelのグレースケール)
	image_size = 28*28
	# 出力する値の数(数字予測なので、「0,1,2,3,4,5,6,7,8,9」の10コ)
	output_num = 10
	# 学習率(今回は、α=0.001を設定)
	learning_rate = 0.001
	# バッチの試行回数
	loop_num = 30000
	# バッチ1つに対する画像の枚数
	batch_size = 100

def main():の配下に書かれている部分は、このPythonファイルを実行した時に動くというふうに理解して下さい。

ここでは、予め決まっている初期値を定義していきます。例えば、入力する画像のサイズであるimage_sizeは28*28、出力する値の数ouput_numは10といったように定義します。

この作業をせず、output_numが入る部分に10と書いても全く問題はないですが、何度も出てくるものや「ここでの10の意味はなんだっけ」と思い出すためにこのような初期値の定義を行っておくとラクです。

# MNISTデータセットを読み込む
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

Pythonでの「.」の接続には複数の意味がありますが、ここではinput_data.pyの中のread_data_setsという関数と解釈して下さい。

つまり、mnistの中には、input_data.pyの中の関数であるread_data_setsを引数("MNIST_data/", one_hot=True)とした時の返ってくる値が入っています(本当はオブジェクトですが、ややこしいので値という認識でもOK)。

この値とは、train、test、validationのそれぞれの画像データ(images)正解ラベル(labels)です。

データセット名 内容
mnist.train.labels トレーニング用データセット(55,000枚)の画像データ(28*28pixel)
mnist.train.images トレーニング用データセット(55,000枚)のラベルデータ
mnist.test.labels テスト用データセット(10,000枚)の画像データ(28*28pixel)
mnist.test.images テスト用データセット(10,000枚)のラベルデータ
mnist.validation.labels 検証用データセット(5,000枚)の画像データ(28*28pixel)
mnist.validation.images 検証用データセット(5,000枚)のラベルデータ

例えば、以下のようにすると、トレーニング用データセットの1枚目のラベルを確認することができます。

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
print(mnist.train.labels[0])
# 実行結果:[ 0.  0.  0.  0.  0.  0.  0.  1.  0.  0.] ===>> "7"

1枚の画像データは、28*28pixelなので、28*28の数列が含まれています。

一方で、ラベルデータは、one-hot表現を使用しており、例えば、「7」を表現するには[0, 0, 0, 0, 0, 0, 0, 1, 0, 0]と表記されます。

one-hot表現を使うことで、計算する誤差値のばらつきを無くすことができます。

この場合、予測値は8つ目の要素、正解ラベルは2つ目の要素で予測値と正解ラベルは違うとわかって、誤差では「1-0=1」となり、どんな値同士での誤差は均一になります。

仮にone-hot表現を使用しなかった場合は予測値が7で、正解ラベルが1である時、誤差は「7-1=6」となり、誤差が不均一となってしまいます。

モデルを作成する
# ===========model===========
# GPUではなくて、CPUを使う場合に書くおまじない
with tf.device("/cpu:0"):
	# 入力する値x(Noneには、実際に入れる画像の枚数が自動的に入る)
	x = tf.placeholder(tf.float32, [None, image_size])
	# 重みW(初期値は、image_size*output_numのゼロのみが入った配列)
	W = tf.Variable(tf.zeros([image_size, output_num]))
	# バイアルb(初期値は、output_numのゼロの身が入った配列)
	b = tf.Variable(tf.zeros([output_num]))
	# 全てのxとWを掛け合わして、bを足した値out
	out = tf.matmul(x, W) + b
	# ソフトマックス関数に代入することで予測値が出力
	y = tf.nn.softmax(out)

	# 正解ラベル (Noneには、実際に入れる画像の枚数が自動的に入る)
	y_ = tf.placeholder(tf.float32, [None, output_num])

	# コスト関数
	cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
	# 最適化関数を用いて誤差逆伝播法を行う
	train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)
	# 予測値と正解ラベルが同じ値であるかを確かめる
	correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
	# 予測精度を計算
	accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

	# TensorFlow独特の仕様(ここではおまじない)
	init = tf.global_variables_initializer()
	sess = tf.InteractiveSession()
	sess.run(init)

ここで、もう一度モデル全体像をおさらいしましょう。上記のコードはこのモデルを完全に落とし込んでいるので、この図をしっかりと理解することが大切です。

隠れ層なしのモデル概要

そして、それぞれの値は図のどこに対応しているのかを下の表と照らし合わせてみてください。

内容 配列の大きさ(shape)
x 入力した画像データ [バッチの枚数(None),28*28(pixel)]
W 入力層と出力層のニューロン間の重み [28*28(pixel),出力数(10)]
b 出力層にいるバイアス [出力数(10)]
out W*x+bで求める出力層の値 [バッチの枚数(None),出力数(10)]
y ソフトマックス関数にoutを代入することで得られる予測値 [バッチの枚数(None),出力数(10)]
y_ 実際の値の正解ラベル [バッチの枚数(None),出力数(10)]

上の図だと1枚のみの画像でしたが、実際はバッチとして塊となった画像が入るのでここでは、None=1度に入力する画像の枚数(バッチの枚数)となり、何枚でもまとめていれることができます。

入力したxは、重みWと掛け合わて、バイアスbを加えます。そして、outを求めることができ、それをソフトマックス関数に代入することで予測値yを獲得します。

これを1度に入力する画像の枚数繰り返すので、yの配列の大きさは、[None(1度に入力する画像の枚数),10(出力する値の数)]となります。

# コスト関数
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

ここでは、コスト関数としてクロスエントロピーという手法を使っています。以下が誤差を求める公式です。
クロスエントロピーの公式

y^は正解ラベルで、yは予測値です。直感的に考えると、y^=y≒1の時、また、y^=y≒0の時には誤差が0に近づます。つまり、正解ラベルと予測値との誤差がない時はcross_entropyも大きくなりません

# 最適化関数を用いて誤差逆伝播法を行う
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)

「GradientDescentOptimizer」は、最急降下法による最適化関数です。最急降下法とは、全ての誤差の合計を使ってコスト関数でW,bの傾きを小さくする方法です。

この「GradientDescentOptimizer」を使うと、学習率α=0.001でcross_entropyを最小にするように変数(W,b)を更新してくれます。

これが、TensorFlowがめちゃくちゃ便利な理由です。この1行のみで誤差逆伝播を行なってくれるのです。

これをTensorFlowを一切使わずに書くと、W,bの傾きを小さくするために微分を行なって、値を各階層ごとに更新する数式を手書きしなければいけません

しかし、やはり、どのようにW,bを更新しているかという原理が抜けているとどこかで落とし穴にハマって抜け出せなくなってしまうと思うので、しっかりと原理を理解してからTensorFlowの最適化関数を使いましょう。必ず自分のチカラになるはずです。

# 予測値と正解ラベルが同じ値であるかを確かめる
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
# 予測精度を計算
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

tf.argmax(y, 1)は、yの配列の2行目(0が1行目なので)で最も大きな値が何列目にあるのかを返します。そして、tf.equalは2つの値が等しい時にTrueを返し、予測値が正しい予測を行うことができたかを確かめます。

accuracyは、全体の平均予測精度を表しています。tf.castは、引数がTrueなら1、Falseなら0を返し、tf.reduce_meanでそれらの値の平均値を求めます。

# バッチサイズが10枚を入れた時のcorrect_predictionの例:
[True True False True True False True True False False]
# tf.cast(correct_prediction, tf.float32)の例:
[1. 1. 0. 1. 1. 0. 1. 1. 0. 0.]
# acurracyの例:
0.6
モデルを学習させる
# ===========training===========
# loop_num回トレーニングを行う
for i in range(loop_num):
	# バッチは、batch_sizeの画像をトレーニング用データセットから持ってくる
	# batch_xs:画像データ(28*28pixel)
	# batch_ys:正解ラベル(0-9の値)
	batch_xs, batch_ys = mnist.train.next_batch(batch_size)
	# xにbatch_xsを代入、y_にはbatch_ysを代入して、トレーニングを行う
	sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

	# 100回ごとにトレーニング時の予測精度を表示する
	if i % 100 == 0:
		print("step", i, "train_accuracy:", sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys}))

いよいよ、モデルの学習です。ここでは、for文を使って、loop_num=30,000回トレーニングを行います。

1回のトレーニングは、バッチごとに行います。バッチはbatch_size=100枚です(initで定義済み)。

mnist.train.next_batch(batch_size)は、上記(初期値を設定する)で定義しているmnistのトレーニング用データセットであるtrainを使って、メソッドであるnext_batchによりバッチをランダムに取り出します

トレーニング用データセット55,000枚の中から100枚を取り出します。

そして、xに今取り出したバッチの画像データを入れ、y_には正解ラベルを入れて、train_stepを実行します。

sess.runは、別の記事で説明するので、ここではTensorFlowで実行を行う際に使うおまじないだと思ってください。

そして、printではトレーニング100回ごとに予測精度を表示させています。

※ココからの話は、まだプログラミングをはじめたばかりの人はスルーして頂いても構いません。

厳密に、mnist.train.next_batch(batch_size)を解説します。

mnistの中には、input_data.read_data_sets("MNIST_data/", one_hot=True)による戻り値として、それぞれの画像データ(images)、正解ラベル(labels)を含んだtrain、test、validationの3つのDatasetというオブジェクトを返します。

このオブジェクトの中には、next_batchというメソッドも含んでいます。そのため、mnist.train.next_batch(batch_size)というように「.」を繋いでコードを書くことができているのです。

学習したモデルをテストして精度を検証する
# ===========test===========
# xにmnist.test.image(テスト用データセットの画像)を代入
# y_にはmnist.test.labels(テスト用データセットのラベル)を代入して、テストを行い、精度を確かめる
print("test_accuracy:", sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

最後に、テスト用データセットを使用して、予測精度を検証します。

xにテスト用画像データを入れ、y_には正解ラベルを入れて、accuracyを実行します。これで、このモデルの予測精度を確認することができます。

if __name__ == "__main__":
main()

全コードをmnist-beginner.pyと保存して、ターミナル(Windowsはコマンドプロンプト)からpython mnist-beginner.pyと実行した時にmain()に含まれたコードが動くということを意味しています。

つまり、他のファイルからインポートしても、実行されることはなく、このファイルを直接読んだときのみ実行されます。

お疲れ様でした。これが、MNIST beginnerによる0から9の手書き文字を認識プログラムの全てです。

今回のまとめ

今回は、「プログラミング未経験の私がPythonの機械学習で手書き文字の識別を行うまで」の後半ということで、簡単なモデルを使って数字の識別を行なってくれるプログラムの実装をお伝えしました。

ニューラルネットワークの基本的な原理を理解した人は案外簡単にここでやっていることを理解できたと思います。

まだ、いまいちわからないという人は前半のニューラルネットワークの仕組みについて何度も読み返して下さい

1度では、難しいと思うますが、繰り返し読むことで必ずわかってくるので諦めずに続けて下さい。ココさえ乗り越えれば、実践的な応用はすぐ目の前です。

次は、隠れ層と活性関数を加えたニューラルネットワーク(NN)の実装を解説します!モデルに隠れ層と活性関数を加えるとどのように変わるのかを明らかにすることで、機械学習の面白さをより一層感じることができると思います。

この記事を書いた人

学生Webエンジニア PLANインターン生 PHP Laravel Python HTML CSS JS

【名前】 "ゆざ"

【関連】 株式会社PLAN / MIYABI Lab / Tmeet(twitterユーザーマッチングサービス) /

【MIYABI Lab運営】23歳/同期がト◯タやMicr◯softに就職する中、ベンチャーに未経験でWebエンジニアになるのを選んだ脳科学専攻の理系院生◆人見知り日本縦断◆機械学習/Web歴5ヶ月

Twitterやってます

最新の技術ブログはこちら