Python機械学習アルゴリズム学習備忘録。ディープラーニングについて。今回は畳み込みニューラルネットワークの実装編です。
内容は、Udemy の「【世界で74万人が受講】基礎から理解し、Pythonで実装!機械学習26のアルゴリズムを理論と実践を通じてマスターしよう」で学んだ内容を自分用備忘録としてまとめたものです。
前回までの記事で畳み込みニューラルネットワークについて書いてきました。今回はその実装編の備忘録を書いていきます。
参考
みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習
【機械学習アルゴリズム学習備忘録】ディープラーニング その1 – 基礎編 –
【機械学習アルゴリズム学習備忘録】ディープラーニング その2 – 実装編 –
【機械学習アルゴリズム学習備忘録】ディープラーニング その3 –畳み込みニューラルネットワーク–
Pythonによる実装 – ライブラリのインポート –
まずはいつもどおりライブラリのインポートから。今回はtensorflowを使います。
import tensorflow as tf
from tensorflow.keras.preprocessing,image import ImageDataGenerator
Pythonによる実装 – データの前処理 –
次にデータの前処理を行う。
訓練用データセットの前処理
train_datagen = ImageDataGenerator(
rescale = 1./255,
# 標準化をしている部分。
# 画像のカラースケール(0 - 255)を255で割ることで標準化している。
shear_range = 0.2
#元の画像をランダムに回転させてデータを一般化していく。過学習回避の狙いがある。
zoom_range = 0.2
# これは画像のズーム度合い。shear_rangeと同様に過学習回避が狙いで、ランダムに画像をズームさせる。
horizontal_flip = True,
# 画像を水平方向に反転させるかどうか。Trueの場合ランダムに画像を反転させる。
)
training_set = train_datagen.flow_from_directory('ディレクトリ',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
テスト用データセットの前処理
test_datagen = ImageDataGenerator(
rescale = 1./255,
)
# テスト用データでは、shear_range等過学習回避用に設定する引数は不要。
test_set = test_datagen.flow_from_directory('ディレクトリ',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
Pythonによる実装 – 畳み込みニューラルネットワークの構築 –
ここから畳み込みニューラルネットワークを構築していく。
イニシャライズ
cnn = tf.keras.models.Sequential()
畳み込み
cnn.add(tf.keras.layers.Conv2D(filters = 32, kernel_size = 3, padding = "same", activation = "relu", input_shape = [64, 64, 3]))
# filters : フィルターの数を指定。多ければよい、少なければだめ、みたいなものはなく、ケースバイケースで調整する。
# kernel_size : 特徴量のfeature mapの大きさを指定。
# padding : zero paddingをするかどうか。"same"でzero paddingになる。画像の一番外側をぐっと縮める。
# activation : 活性化関数。今回は"relu"。他の活性化関数もあるが、一般的にreluが使われることが多い。
# 非線形活性化関数を入れること自体にも意味がある。詳しくは過去記事参照。
# input_shape : 入力画像の大きさ。今回は、train_setのtarget_size = (64, 64)としているので、これに合わせる。
# input_shapeの3は、青、緑、赤の三原色を使っているので3を指定している。(チャンネルの数)
プーリング
cnn.add(tf.keras.layers.MaxPool2D(pool_size = 2, strides = 2, padding = "valid"))
# MaxPoolingは、最大値を取るプーリング。詳しくは過去記事参照。
# 今回は2 x 2の行列の範囲(pool_size)を対象にプーリングをする。
# stridesは、pool_sizeで取る範囲をどれぐらいずらしながら値を取っていくかを指定している。
層の追加
cnn.add(tf.keras.layers.Conv2D(filters = 32, kernel_size = 3, padding = "same", activation = "relu"))
cnn.add(tf.keras.layers.MaxPool2D(pool_size = 2, strides = 2, padding = "valid"))
Flattening
cnn.add(tf.keras.layers.Flatten())
# ここまでで作成した行列をFlatteningでベクトルに変換していく。
cnn.add(tf.keras.layers.Dense(units = 128, activation = "relu"))
# 隠れ層の作成。unitsはノードの数。
出力層の追加
cnnn.add(tf.keras.layers.Dense(units = 1, activation = "sigmoid"))
# 今回は0,1の結果を出すのでunitsは1でok.
# 今回は0,1の二値分類で、与えられた画像が0か1かを確率的に表すことができるので、sigmoid関数が適していると言える。。
モデルの訓練
ここまでで、データの前処理と畳み込みニューラルネットワークの構築ができたので、いよいよここからモデルを訓練していく。
モデルのコンパイル
cnn.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
訓練用データセットを用いたモデルの訓練
cnn.fit(x = training_set, validation_data = test_set, epochs = 25)
結果の予測
畳み込みニューラルネットワークの構築、訓練ができたら、最後に用意したデータに対して、結果の予測を行う。
import numpy as np
from tensorflow.keras.preprocessing import image
test_image = image.load_img('画像パス", target_size = (64,64))
test_image = image.img_to_array(test_image)
test_image np.expand_dims(test_image, axis = 0)
result = cnn.predict(test_image)
training_set.class_indices
if result[0][0] == 1:
prediction = 'dog'
else:
prediction = 'cat'
print(prediction)
# 犬猫の二値分類の場合に結果を犬か猫かで表示できるようにしている。
これで、畳み込みニューラルネットワークの実装が完了しました。結果を見ながら、ハイパーパラメータを適宜調整したり、データの前処理を調整したりしながら、精度向上を図っていきます。
では、最後まで読んでいただきありがとうございました。
コメント