Kerasで画像分類をする方法
kerasを利用することで誰でも簡単に画像分類をすることができます。Kerasは、比較的に構造がシンプルで扱いやすいこともあり、機械学習やディープラーニングの初心者が実装や実験を行うのに適したライブラリです。
はじめに
今回はKerasで画像分類を実装していきます。
Kerasは、比較的に構造がシンプルで扱いやすいこともあり、機械学習やディープラーニングの初心者が実装や実験を行うのに適したライブラリです。
必要なデータの用意
まず、必要なものを用意します。
from keras.datasets import mnist
from keras.utils import to_categorical
from keras.layers import Dense
from keras.model import Sequential
今回使うデータセットはmnistです。
mnistは、手書き数字「0~9」の訓練画像60,000枚と、テスト画像10,000枚を集めた画像データセットです。
(x_train,y_train),(x_test,y_test) = mnist.load_data()
mnistを訓練データ(x_train,y_train)とテストデータ(x_test,y_test)に分けます。
データの前処理
次にデータの前処理を行っていきます。
x_train = x_train.reshape(60000,784)
x_train = x_train/255
x_test = x_test.reshape(10000,784)
x_test = x_test/255
y_train = to_categorical(y_train,10)
y_test = to_categorical(y_test,10)
x_trainとx_testは縦:28px、横:28pxの画像なので、処理しやすいように784(28×28)に変換します。
さらに、x_trainとx_testをRGB値の255で割ることで正規化します。
to_categoricalを使うことでone_hotベクトルにしています。(今回の場合は、分類する数字が「0~9」なので10としています。)
モデルの構築
今回はSequentialモデルを使用します。
Sequentialモデルはシンプルな一直線のモデルを構築できます。
Sequentialモデルを使うことで、手書き数字の画像を入力値とし、それが0~9のどの数であるかを出力することができます。
model = Sequential()
model.add(
Dense(
input_shape = (784,),
units = 64,
activation = "relu"
)
)
model.add(
Dense(
units = 10,
activation = "softmax"
)
)
1つ目のmodel.addで中間層、2つ目のmodel.addで出力層を構築しています。
input_shape:入力層の形です。(今回の場合はx_trainが(60000,784)なのでinput_shape = (784,)です。)
units:ニューロン数です。(今回の場合は中間層のニューロン数が64、出力層のニューロン数が10です。)
activation:活性化関数です。
実行結果
modelの構築が完了したら、modelをcompileし、modelをfitさせます。
model.compile(
optimizer = "adam"
loss = "categorical_crossentropy"
metrics = ["accuracy"]
)
model.fit(
x_train,
y_train,
epochs = 20,
batch_size = 120,
verbose = 1,
validation_data = [x_test,y_test]
)
【compileの説明】
今回はoptimizer = “adam”,
loss = “categorical_crossentropy”とします。
【fitの説明】
batch_size:1回に計算するデータの数のことです。(一般的に2のn乗に設定されます。)
epochs:一つの学習データを何回繰り返して学習させるかを決めます。
activation:活性化関数です。
verbose:ログ出力の指定です。
validation_data:学習に使用していないデータです。(今回の場合はx_test、y_test)
model.evaluateで評価関数、損失関数の結果を見てみましょう。
score = model.evaluate(x_test,y_test)
print(f"loss:{score[0]}")
print(f"accuracy:{score[1]}")
今回は評価関数が0.9745、損失関数が0.089でした。
まとめ
今回はKerasでmnistの画像分類を実装しました。
mnistはシンプルなデータセットなので、Sequentialモデルでも高いスコアを出すことができました。