konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

【DeepLearning特訓】CNN 実装のポイント

E資格向けの自習アウトプット
自分用メモ

CNN実装するには、Pythonでの計算する行列のカタチを意識してやるのが重要です
その基本的なテクニックについて
E資格的には numpy での実装方法が聞かれるのかな

画像の読み込みと確認方法

まずは基本中の基本で画像を一枚読み込んで、チャネルごとのイメージを掴んで見る
Pillow で画像の読み込んで、numpy array でチャネルごとの成分を「0」にして RGB の画像を確認する

import matplotlib.pyplot as plt
from PIL import Image
from io import BytesIO
import numpy as np

filename = 'dataset/FF14.jpg'
img = Image.open(filename)
img_array = np.asarray(img)  # (H, W, Ch)

def get_channel(image,channel='r'):
    # イメージをコピー
    new_image = image.copy()
    if channel=='r':
        # 「r」が指定された場合、「g」「b」は0にする
        new_image[:,:,1] = 0
        new_image[:,:,2] = 0
    elif channel=='g':
         # 「g」が指定された場合、「r」「b」は0にする
        new_image[:,:,0] = 0
        new_image[:,:,2] = 0
    elif channel=='b':
         # 「g」が指定された場合、「r」「b」は0にする
        new_image[:,:,0] = 0
        new_image[:,:,1] = 0
    return new_image


print("REDチャンネル")
image_2 = get_channel(img_array,channel='r')
plt.imshow( image_2 )
plt.axis("off")
plt.show()

print("GREENチャンネル")
image_2 = get_channel(img_array,channel='g')
plt.imshow( image_2 )
plt.axis("off")
plt.show()

print("BLUEチャンネル")
image_2 = get_channel(img_array,channel='b')
plt.imshow( image_2 )
plt.axis("off")
plt.show()


f:id:konchangakita:20210115095904p:plain

画像を計算しやすい行列に変換

入力される画像データは4次元(画像枚数 N, チャネル数 Ch, H, W)ではいってきて、カーネル(フィルタ)で局所的な演算をするわけなので、そのまんまでは扱いにくい
f:id:konchangakita:20210114235653p:plain


畳み込み処理(カーネルサイズ、ストライプ数)、プーリングの設定に合わせて、行列を組み直してからカーネルとの計算をおこなうと具合がよい
f:id:konchangakita:20210115005918p:plain
(行 x 列だとの計算しやすい)


Numpy だけで行うとこの実装が結構ややこしくて、確認が何度も必要だったりするので実装が結構大変だが、PyTorch や TensorFlow では簡単に実装できる関数が用意されていたりする

PyTorch は過去にトライしたりもしている
PyTorchを使ったDeep Learningのお勉強 画像認識編(CIFAR-10) - konchangakita

畳み込みを効率よくするには

畳み込みネットワークは特徴量の学習コストが高い

計算コストを減らすための工夫
 ・ランダムなカーネルを利用
 ・層ごとの貪欲事前学習(問題を分割し、要素ごとに最適化)
 ・教師なし学習の利用


さいごに

このあたりは試験対策の為に、考え方が重要なので理解しておく
実装は PyTorch はすでに挑戦したので、TensorFlow での実装をおこなってみようかな