【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でAutoEncoderをやってみた – Qiita」と「TensorFlowでAutoencoderを実装してみた – Qiita」の2つでtf.nn.conv2d()を使用しています。

まとめ

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

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

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

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

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次