【TensorFlow】畳み込みニューラルネットワークで使う畳み込み層とは

今回は、畳み込みニューラルネットワーク(Convolution Neural Network。以下、CNN)の一部である畳み込み層に注目した記事を作成してみました。

この記事では、

  • 畳み込み層について知りたい
  • TensorFlowで畳み込み層を実装する方法が知りたい
  • tf.nn.conv2d()を使用しているソースコードを見たい


といった期待に応えます。新しいことを習得するときには、いろいろな情報に触れてみて、全体像を理解していく必要がありますよね。

この記事は、その一端を担える内容になっていますので、まずは読んでみて、その後にいろいろな情報に触れると、理解が早いと思います!では、始めましょう。

畳み込みニューラルネットワーク(CNN)とは

CNNは、深層学習(ディープラーニング)に成功した実績があるニューラルネットワークの1つです。CNNと呼ばれる構造のニューラルネットワークに画像を渡すと、車95%、トラック3%、バイク2%といった確率が出力されます。

出力された確率のうち、もっとも高い確率になったものが画像に写っていると考えられるという仕組みになっています。

CNNの全体像

CNNは、複数の層を重ねたニューラルネットワークです。その中でも特に重要な層は、以下の2つです。

  • 特徴を学習する畳み込み層
  • 特徴のうちのささいな違いを同一視するプーリング層


CNNをより詳しく知りたい方は、以下のサイトをご覧ください。

参考:https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html

TensorFlowで畳み込み層を実装するには

少し具体的に、TensorFlowで畳み込み層を実装する方法を見ていきましょう。もっとも基本的な方法は、次のtf.nn.conv2d()を使用する方法です。

tf.nn.conv2d(
    input,
    filter,
    strides,
    padding,
    use_cudnn_on_gpu=True,
    data_format='NHWC',
    dilations=[1, 1, 1, 1],
    name=None
)
引数説明
input入力テンソルを指定します。
filter[height, width, in_channels, out_channels]の形式で、畳み込みに使用するフィルタの大きさとフィルタの数を指定します。

heightとwidthはフィルタの大きさです。in_channelsは入力する画像の数、out_channelsは入力画像に適用するフィルタの数(出力する画像の数)です。

たとえば、in_channelsが1で、out_channelsが32の場合、1個の画像を入力すると、32個の独立したフィルタを適用し、32個の出力画像を生成する畳み込み層ということになります。
stridesストライド(フィルタの移動量)を指定します。

batchとchannelsには必ず「1」を指定し、一般的にheightとwidthは同じため、[1, strides, strides, 1]を指定することになります。
padding”SAME”(ゼロパディングあり)、または”VALID”(ゼロパディングなし)を指定します。
use_cudnn_on_gpucuDNNの利用有無を指定します。
data_formatinput、strides、およびdilationsのデータの解釈方法を指定します。
dilationsDilated Convolution(拡張された畳み込み)を行う場合に、スキップする量を指定します。stridesと同様に、batchとchannelsには必ず「1」を指定し、一般的にはheightとwidthは同じため、[1, dilations, dilations, 1]を指定します。

Dilated Convolutionについては、以下のサイトの説明が詳しいのでお勧めします。

参考:http://joisino.hatenablog.com/entry/2017/07/13/210000
name畳み込み層に名前を付ける場合に指定します。

tf.nn.conv2d()のAPIリファレンスは、以下のサイトをご覧ください。

参考:https://www.tensorflow.org/api_docs/python/tf/nn/conv2d

また、最近ではKerasという、TensorFlowでのニューラルネットワーク実装を簡単に行えるライブラリがマージされました。こちらのAPIを使うのもいいでしょう。

tf.nn.conv2d()を使用しているソースコードを探す

以下の記事で紹介されているコードは、tf.nn.conv2d()を使用していますので、ぜひご覧ください。「Deep MNIST For Experts」で、tf.nn.conv2d()を使用しています。

【TensorFlow】MNISTデータを学習するプログラムを3種紹介!
更新日 : 2018年8月21日

「TensorflowでAutoEncoderをやってみた – Qiita」と「TensorFlowでAutoencoderを実装してみた – Qiita」の2つでtf.nn.conv2d()を使用しています。

まとめ

今回は、畳み込みニューラルネットワークの一部である畳み込み層に注目してみました。TensorFlowで畳み込み層を実装する最も基本的な方法は、tf.nn.conv2d()を使うということ、そしてtf.nn.conv2d()の引数の概要も説明しました。

TensorFlowを使いこなすには、メソッドの引数の意味や目的までしっかりと理解しておく必要があります。しかし、TensorFlowのAPIリファレンスを読むだけでは、頭の中ははてなマークだらけになってしまうでしょう。

そんなときは、この記事で説明したように、いったんコードから離れて、コードの背景にある理屈を理解し、それからまたAPIリファレンスを読む、ということを繰り返しましょう。

そのようにして、TensorFlowを正しく使い、深層学習で成果を出せるエンジニアになってください。応援しています!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

侍テック編集部

侍テック編集部

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説