【E資格不合格から学ぶ】CNN(畳み込みニューラルネットワーク)のポイントを解説!

  • 「CNN」について学びたいけど理解できるか不安・・・
  • 「CNN」についてどこから学んでいいか分からない?
  • 「CNN」を体系的に教えて!

 「CNN((Convolutional Neural Network:畳み込みニューラルネットワーク)」は畳み込み層とプーリング層をもつニューラルネットワークです。画像から特徴量を抽出するために効果的なモデルですが、興味があっても難しそうで何から学んだらよいか分からず勉強のやる気を失うケースは非常に多いです。

 私は過去に基本情報技術者試験(旧:第二種情報処理技術者試験)に合格し、また2年程前に「一般社団法人 日本ディープラーニング協会」が主催の「G検定試験」に合格しました。現在、「E資格」にチャレンジ中ですが3回不合格になり、この経験から学習の要点について学ぶ機会がありました。

 そこでこの記事では、「CNN(畳み込みニューラルネットワーク)」を学習する際のポイントについて解説します。

 この記事を参考にして「CNN」が理解できれば、E資格に合格できるはずです。

<<「CNN」のポイントを今すぐ見たい方はこちら

目次

1.CNNの構造

 CNN(Convolutional Neural Network:畳み込みニューラルネットワーク)の構造は以下のとおりである。

CNNの構造図(例)
CNNの構造図(例)

1.1 LeNetの構造図

LeNetとは・・・
  • CNN(畳み込みニューラルネットワーク)の最初の提案および実装である
  • 従来は「画像認識向けの3層MLP」
  • LeNetでは「畳み込み層 – サブサンプリング層」を2回繰り返したのち、全結合層を3層つなげて識別する
LeNetの構造図
LeNetの構造図

1.2 畳み込み層の全体像

畳み込み層の全体像
畳み込み層の全体像

1.3 全結合層での学習

全結合での学習
全結合での学習

1.4 CNNで扱えるデータの種類

  • CNNでは次元間で繋がりのあるデータを扱える
1次元2次元3次元
単一チャンネル音声
<時刻,強度>
フーリエ変換した音声
<時刻,周波数,強度>
CTスキャン画像
<x,y,z,強度>
複数チャンネルアニメのスケルトン
<時刻,(腕の値、膝の値・・・)>
カラー画像
<x,y,(R,G,B)>
動画
<時刻,x,y,(R,G,B)>
CNNで扱えるデータの種類一覧

2.畳み込み層

2.1 Bias(バイアス)

畳み込み層とは・・・

画像の場合、縦、横、チャンネルの3次元データをそのまま学習し、次に伝えることが出来る。
結論:3次元の空間情報も学習できるような層が畳み込み層である。

畳み込みの演算概念

畳み込みの演算例
畳み込みの演算
畳み込みの演算例②
畳み込みの演算例②

2.2 Padding(パディング)

Padding(パディング)とは・・・
Paddingの演算例
Paddingの演算
  • 元画像に対してパディングするため、ミニバッチサイズ、チャンネル数をそのまま維持する。

2.3 Stride(ストライド)

Stride(ストライド)とは・・・
Strideの演算例
Strideの演算例

2.4 Channel(チャンネル)

Channel(チャンネル)とは・・・
Channelの演算例
Channelの演算例
全結合で画像を学習した際の課題

画像は3次元データ(縦,横,チャンネル)だが、1次元のデータとして処理される。

   RGBの各チャンネル間の関連性が学習に反映されないこと。

2.5 Pooling(プーリング)

Pooling(プーリング)層の演算概念
  • 必要なところは細かく、必要がないところは荒くデータを圧縮する方法
Poolingの演算例
Poolingの演算例

2.6 Unpooling(アンプーリング)

Unpooling(アンプーリング)とは・・・
Unpoolingの演算例
Unpoolingの演算例

◎確認テスト

  • Q1.サイズ6×6の入力画像を、サイズ2×2のフィルタで畳み込んだ時の出力画像のサイズを答えよ。
    なお、ストライドとパディングは1とする。
  • A1.下の公式より出力画像のサイズを求めると、高さ7×幅7になる。
入力画像の大きさ,パディング数,フィルターの大きさ,ストライド数から出力画像の大きさを求める公式
入力画像のサイズ,パディング数,フィルターの大きさ,ストライド数から出力画像のサイズを求める公式

〈上記公式の補足〉

  • 分子:フィルターはその高さ・幅分しか移動できないから画像の高さ・幅からマイナスしている。
  • 分母:分子に対してストライド値で割ることで出力画像のサイズを求めることができる。

2.7 Pythonコード

畳み込み演算のコード化ついてのポイント

 4次元配列(ミニバッチサイズ,チャンネル数,縦幅,横幅)に対して行列演算を行う必要がある。

パディング操作
  • np.pad の用途
    パディングを計算する関数
  • np.pad の使い方
    np.padには3つの引数がある。
    第1引数:元の配列
    第2引数:前・後の文字詰め量
    第3引数:埋め込み方式

  • data=[ 2, 3, 4]
    np.pad=(data, [3, 4], ‘constant‘)
スライス操作
  • s[i:j:k] の用途
    スライスを行う関数
  • s[i:j:k] の使い方
    i:開始値
    j:終了値(常に含まれない
    k:間隔
    i、j、kはそれぞれ組み込み関数rangeやnp.arange関数の引数
    start:初期値
    stop:終値
    step:増分
    に対応
整形と行列の転置
  • kernel.reshape((○○,ー1)).T
    reshape:整形
    T:転置行列
    補足)-1を渡した場合は「行ベクトル」になる。
       kernelを列「〇〇」の「行ベクトル」に変換し、転置をとる。

〈参考〉https://numpy.org/doc/stable/reference/generated/numpy.ndarray.reshape.html
〈参考〉https://numpy.org/doc/stable/reference/generated/numpy.ndarray.T.html

3.まとめ

【CNNのポイント】
  • 「畳み込み」の概念
  • Bias
    画像の場合、縦、横、チャンネルの3次元データをそのまま学習し、次に伝えることが出来る。
  • Padding
    元画像に対してパディングするため、ミニバッチサイズ、チャンネル数をそのまま維持する。
  • Stride
  • Channel
  • Pooling
    必要なところは細かく、必要がないところは荒くデータを圧縮する方法
  • 入力画像のサイズ、パディング数、フィルターの大きさ、ストライド数から出力画像のサイズを求める公式
  • Unpooling
  • 畳み込み後の出力画像のサイズ

最後まで読んで頂きありがとうございます。
皆様のキャリアアップを応援しています!!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次