Help us understand the problem. What is going on with this article?

【入門者向け解説】畳み込み処理入門(TensorFlowで説明)

More than 1 year has passed since last update.

入門者向けに「畳み込み」処理について解説

TensorFlowエキスパート向けチュートリアルDeep MNIST for Expertsを実行して、まずわかりにくいのが「畳み込み」処理でした。文系卒からすると一般用語でもないですし、少し時間がかかりましたが、分かれば簡単です。基本的には四則演算ができれば理解できます
【入門者向け解説】TensorFlowチュートリアルDeep MNIST記事で、畳み込みニューラルネットワークの処理を解説していますので参考にしてください。
また、「【入門者向け解説】プーリング処理入門(TensorFlowで説明)」の記事でプーリングについても解説しています。
※TensorBoardで出力した画像を参考に載せました(2017/7/27)

概説

概要

「【入門者向け解説】TensorFlowチュートリアルDeep MNIST」の記事で解説しましたが、「畳み込み」処理では画像の特徴を見つけます。画像だけでなく音声やデータでもいいですのですが、画像の方が視覚的でわかりやすいので、画像を使って解説します。
10.Overview.JPG

畳み込み処理の入出力

畳み込み処理は特徴を出すためにフィルターをかけます。画像をインプットとしてフィルターを使って、フィルターの枚数分の画像を出力します。MNISTデータを使った場合は、下記のとおりです。
Convolve01.JPG

TensorBoardに出した実際の畳み込み処理入出力画像を整理したらこんな感じでした。人間にはイマイチ理解できませんが、雰囲気はわかると思います(画像処理のプロはわかるかも・・・)。
Convolve06_images01.JPG

フィルター例

フィルターに関しては画像に対する編集処理ということで、「画像処理フィルタ一覧、比較」を参照ください。実際にどんな種類のフィルターを適用すると画像がどう変わるかがわかりやすいです。

具体的な処理

四則演算のみを使います。
TensorFlowエキスパート向けチュートリアルDeep MNIST for Expertsの以下のプログラム箇所が畳み込み処理です。第1層でも第2層でも同じで、TensorFlowのAPIを使うことでこの程度で実装することができます。

# 畳み込み処理
def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

画像例

入力画像例として縦4×横4×1色(黒のみ)の斜め棒画像を使います。斜め棒を1と0で表現しました。
Convolve02.JPG

ゼロパディング

padding='SAME'と書かれているオプションはゼロパディングといい、周囲を0で埋めます。なんでこんなことをしているかというと、入力画像と出力画像のTensor(テンソル)を同一にしたいからです。
Convolve03.JPG

フィルターの使用

斜め棒のフィルターを例示すると下図のとおりです。斜め棒に対して同じ角度の斜め棒で特徴を出します。
Convolve04_filter.JPG

TensorFlowエキスパート向けチュートリアルDeep MNIST for Expertsの以下の箇所がフィルター生成時のコードです(ここでは5(縦)×5(横)×1(色)×32(種類))。

W_conv1 = weight_variable([5, 5, 1, 32])

weight_variableの関数で、初期値を標準偏差0.1の正規分布乱数で生成しています。あとは学習しているうちに、最適なフィルターの値を探索してくれます。tf.truncated_normalの関数はリンク先を参照ください。

# 重み付け値
def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)    #標準偏差0.1の正規分布乱数
    return tf.Variable(initial)

掛け算と足し算

下図の形で掛け算と足し算をします。
Convolve05_step01.JPG
あとは、ひとつずつずらして計算を繰り返します。ゼロパディングをしているため、畳み込み処理結果の画像は同じ縦4×横4となります。下の絵は2つ目(1番上の左から2つ目)の畳み込み処理をしている概要図です。
Convolve05_step02_new.JPG

最終的に計算をし終わると下図に結果が出てきます。斜め棒に対して斜め棒フィルターを適用したので、同じ様な形となっています。
Convolve05_step03_new.JPG
※値が間違っていたので修正しました(2018/4/2)

参考

「高卒でもわかる機械学習 (7) 畳み込みニューラルネット その1」TensorFlow Tutorialの数学的背景 − Deep MNIST for Experts(その1)の記事では、非常に詳しくまとまっています。

畳み込みの数学での意味

畳み込みは数学で出てくる合成積のことです。Wikipediaに詳しく載っています。筆者は、教材「スバラシク実力がつくと評判の統計学キャンパス・ゼミ」を使って勉強しました。
数学勉強に関しては「文系卒社会人が統計・機械学習を理解するための数学勉強方法」の記事を参照ください。

FukuharaYohei
気の向いたままにいろいろと書きます。 仕事はSAP関連で、HANA、Fiori、SAPUI5、BusinessObjectsなどいろいろやっています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした