AI
2024/04/23
古川 直輝

Kerasで画像分類をする方法

logo_Python

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_test = x_test.reshape(10000,784)

x_train = x_train/255
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モデルでも高いスコアを出すことができました。

New call-to-action