序論
こんにちは、今日はAIの世界に足を踏み入れてみましょう。具体的には、MNISTという手書き数字のデータセットを使って、数字の[3]と[4]を見分けるAIを作ります。この記事では、AIの作り方を一から説明します。プログラミングの経験がない方でも大丈夫。小学生でもわかるように説明しますので、一緒に楽しみながら学んでいきましょう。
AIとは?
まずは基本から。AIとは何でしょう?AIはArtificial Intelligenceの略で、日本語では「人工知能」と訳されます。人間が持つ知能をコンピュータ上で再現しようとする技術のことを指します。例えば、人間が自然に行うような判断や学習、認識などをコンピュータにさせることがAIの目標です。
機械学習とは?
AIの中でも特に注目されているのが「機械学習」です。機械学習は、人間がプログラムを書く代わりに、コンピュータが自分で学習して問題を解く技術のことを指します。具体的には、大量のデータからパターンを見つけ出し、そのパターンを使って新しいデータに対する予測を行います。
ニューラルネットワークとは?
ニューラルネットワークは、機械学習の一種で、人間の脳の神経細胞(ニューロン)の働きを模倣したものです。ニューロンは複数の入力を受け取り、それらの入力に基づいて出力を行います。ニューラルネットワークも同様に、複数の入力データを受け取り、それらのデータに基づいて出力を行います。
それでは、これらの概念を使って、実際にAIを作ってみましょう。
プログラムの準備と今回作成するAIについて
今回は、MNISTデータセットを使って、数字の3
と、4
の画像を判別するAIを作ります。
まずは必要なライブラリをインポートします。今回は、PythonのライブラリであるTensorFlowとKerasを使います。TensorFlowは機械学習のためのライブラリで、KerasはTensorFlowをより簡単に操作するためのライブラリです。詳しくはTensorFlowの公式チュートリアルやKerasの公式ドキュメンテーションを参照してみてください。
import tensorflow as tf
from tensorflow import keras
データセットの準備
次に、MNISTの手書き数字データセットを読み込みます。MNISTは機械学習でよく使われるデータセットで、0から9までの手書き数字の画像とそのラベル(正解の数字)が含まれています。今回はこの中から3
と4
の画像だけを使います。
# MNISTデータセットの読み込み
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# [3]と[4]のデータだけを抽出
train_filter = (y_train == 3) | (y_train == 4)
test_filter = (y_test == 3) | (y_test == 4)
x_train, y_train = x_train[train_filter], y_train[train_filter]
x_test, y_test = x_test[test_filter], y_test[test_filter]
# ラベルを二値化([3]を0、[4]を1に変換)
y_train[y_train == 3] = 0
y_train[y_train == 4] = 1
y_test[y_test == 3] = 0
y_test[y_test == 4] = 1
モデルの構築
次に、ニューラルネットワークのモデルを構築します。今回はシンプルな全結合層(Dense)のみからなるモデルを作ります。全結合層は、前の層の全てのニューロンが次の層の全てのニューロンと結合している層のことを指します。
# モデルの構築
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(1, activation='sigmoid')
])
モデルの学習
モデルを構築したら、次はモデルを学習させます。学習とは、訓練データを使ってモデルのパラメータを調整することを指します。モデルのパラメータとは、ニューロンの重みやバイアスのことを指します。
# モデルのコンパイル
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
# モデルの学習
model.fit(x_train, y_train, epochs=5)
モデルの評価
学習が終わったら、モデルの性能を評価します。評価とは、テストデータを使ってモデルの予測精度を確認することを指します。テストデータはモデルの学習には使われていない新しいデータで、これを使ってモデルの性能を評価することで、モデルが未知のデータに対してどれくらいの予測精度を持つかを確認します。
# モデルの評価
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print('\nTest accuracy:', test_acc)
モデルの利用
最後に、学習したモデルを使って、新しい画像が[3]なのか[4]なのかを予測してみましょう。ここでは、デスクトップに保存されている画像を読み込んで予測を行います。
from PIL import Image
import numpy as np
# 画像の読み込み
img = Image.open('desktop/my_image.png').convert('L')
# 画像をMNISTのデータ形式に変換
img = img.resize((28, 28))
img = np.array(img) / 255.0
# モデルを使って予測
prediction = model.predict(img[None, ...])
# 予測結果の表示
if prediction < 0.5:
print("This image is [3]")
else:
print("This image is [4]")
desktop/my_image.png
ここには自分のファイルパスを入れてください。
これで正解すれば、分類型AIは完成です。
以上で、MNISTの手書き数字データセットを使って、3
と4
を分類するAIの作り方を説明しました。AIや機械学習についてはまだまだ深いですが、この記事が皆さんの学習の一助になれば幸いです。