今回は前回の記事に掲載できなかった、 4. 実際のコード について、ご紹介したいと思います。
=================
4.実際のコード
=================
ここからは実際にAIを実行させるコードについてご紹介いたします。
今回画像に使用するのは有名な mnist の手書きの数字データというものです。
手書きで書かれた数字を認識させて、読み込んだ画像に対して、それが何の数字なのか予測させるというものです。
それではモデルの構築から、予測までずらっと一気に記載します。
※実行には30分以上かかる場合がありますのでご注意ください。
#■■■■■■■■■■①手書きデータの読み込み■■■■■■■■■■
# ライブラリのインポート
import numpy as np #numpyという行列などを扱うライブラリ
from sklearn import neighbors, preprocessing #機械学習用のライブラリ
#MNIST(手書き数字)データベースの読み込み
from tensorflow.keras.datasets import mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
print(Y_train[:5])
#前処理
# AIに読み込めるようにデータセットを4階の配列に直す
X_train = X_train.reshape(60000, 28,28,1)
X_test = X_test.reshape(10000, 28,28,1)
# 画素を0~1の範囲に変換(正規化)
x_train = X_train.astype('float32') / 255
x_test = X_test.astype('float32') / 255
# 正解ラベルを付与
y_train = to_categorical(Y_train, 10)
y_test = to_categorical(Y_test, 10)
print(y_train[:5])
#■■■■■■■■■■①手書きデータの読み込み■■■■■■■■■■
#□□□□□□□□□□□②AIの作成□□□□□□□□□□□
#CNN(畳み込みニューラルネットワーク)モデルの生成
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Activation
#畳み込み層
model = Sequential()
model.add(Conv2D(16, (3, 3), padding='same',activation='relu', input_shape=(28,28,1)))
model.add(Conv2D(16, (3, 3), padding='same',activation='relu'))
model.add(Conv2D(16, (2, 2), strides=2, padding='same'))
model.add(Conv2D(32, (3, 3), padding='same',activation='relu'))
model.add(Conv2D(32, (3, 3), padding='same',activation='relu'))
model.add(Conv2D(32, (2, 2), strides=2, padding='same'))
model.add(Conv2D(64, (3, 3), padding='same',activation='relu'))
model.add(Conv2D(64, (3, 3), padding='same',activation='relu'))
model.add(Conv2D(64, (2, 2), strides=2, padding='same'))
#全結合層
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(10))
model.add(Activation('softmax'))
model.summary()
# モデルを構築
from tensorflow.keras.optimizers import Adam
model.compile( Adam(lr=1e-3), loss="categorical_crossentropy", metrics=["acc"])
#□□□□□□□□□□□②AIの作成□□□□□□□□□□□
#▲▲▲▲▲▲▲▲▲▲③AIの学習と予測の実行▲▲▲▲▲▲▲▲▲▲
#学習の実行
history = model.fit(x_train, y_train, batch_size=128, epochs=15, verbose=1,
validation_data=(x_test, y_test))
#結果を確認するためのグラフ
from matplotlib import pyplot as plt
train_acc = history.history['acc']
test_acc = history.history['val_acc']
x = np.arange(len(train_acc))
plt.plot(x, train_acc, label = 'train accuracy')
plt.plot(x, test_acc, label = 'test accuracy')
plt.legend()
#結果表示
print('予測',model.predict(x_test[:10]).argmax(axis=1))
print('正解',Y_test[:10])
#▲▲▲▲▲▲▲▲▲▲③AIの学習と予測の実行▲▲▲▲▲▲▲▲▲▲
コードの解説について細かい解説はややこしくなるので致しませんが、
「#■■■■■■■■■■①手書きデータの読み込み■■■■■■■■■■」のエリアにて
手書きデータを読み込み、それをAIが飲み込めるように形を変えてあげている作業になります。
「#□□□□□□□□□□□②AIの作成□□□□□□□□□□□」では画像分類の仕組みで解説した、畳み込み層と全結合層を構築し、AIを作り上げています。
最後に「#▲▲▲▲▲▲▲▲▲▲③AIの学習と予測の実行▲▲▲▲▲▲▲▲▲▲」で、学習の実行と予測の実行を実施し結果の表示をするといった流れになっています。
上記のコードを実行すると以下のように学習が進んでいることがわかると思います。
“Accuracy“というのは正解率みたいなもので、99%の精度を出していることがわかります。
最後に予測で画像に対して出力された結果と正解を表示しています。
今回作成したモデルを自分で使ってみたい場合は以下のようにして使用すればAIの予測を試してみることができます。
from PIL import Image
# もう一度データの読み込みをする。
(X_mytrain, Y_mytrain), (X_mytest, Y_mytest) = mnist.load_data()
#X_mytrain[<任意の数値>]に適当な値を入れて自分が予測させたい画像を確認する。
img = X_mytrain[5]
img = Image.fromarray(np.uint8(img))
img.resize((224,224))
#前処理
# データセットをAIに読み込めるように4階の配列に直す
X_mydata = X_mytrain.reshape(60000, 28,28,1)
# 画素を0~1の範囲に変換(正規化)
X_mydata = X_mydata.astype('float32') / 255
#model.predict(X_mydata[<さっきの任意な数字>:<さっきの任意な数字+1>]).argmax(axis=1)
print('モデルによる予測',model.predict(X_mydata[5:6]).argmax(axis=1))
<任意の数値> となっている箇所に自分が適当に選んだ数値を入れてあげれば実行することができます。
↓
以上で画像分類については終了です。
AIって名前だけ独り歩きしていてその中身がよくわからないという人にもどういうものか体系だけでも理解いただけたなら幸いです。