tf.layers.conv2dでCNNを構築する

有名なゼロから作るDeepLearningの魚の本ありますよね。自分もお世話になってます。
その本の8章に f:id:Owatank:20170701172825p:plain
こんな感じのCNNの説明がありましたよね。コードも公開してあります。
個人的にtensorflowで実装して見たいと思い、このCNNを構築してみた。
コードはここ
ネットワークの特徴として

  • 畳み込みのフィルターは3x3
  • Adamによる最適化
  • 活性化関数はReLU
  • 全結合の後にDropoutレイヤを使用
  • 重みの初期値には「Heの初期値」を使用

の他に荷重減衰を追加してみた。
実装においてtf.nn.conv2dではエラーが出てしまい困った。
最初の第1層目を以下のように定義すると

h_conv1_1 = tf.nn.relu(tf.nn.conv2d(input=input_layer, 
                                    filter=W_conv1_1, 
                                    strides=[1, 1, 1, 1], 
                                    padding='SAME')+ b_conv1_1)
h_conv1_2 = tf.nn.relu(tf.nn.conv2d(input=h_conv1_1, 
                                    filter=W_conv1_2, 
                                    strides=[1, 1, 1, 1], 
                                    padding='SAME')+ b_conv1_2)

ValueError: Dimensions must be equal, but are 3 and 1 for 'Conv2D_1' (op: 'Conv2D') with input shapes: [?,28,28,1], [5,5,1,32].
こんな感じのエラーが出力される。非常に困った。
良い解決方法が思いつかなかったので、tf.layers.conv2dで畳み込み層を定義することにした。

トレーニングでは、メモリ2GBでしょっぱいのでバッチサイズは10で回した。
バッチサイズを50にして学習ステップも1万ほど回したらもっといい精度出るのかな?

畳み込みやDropoutとについてはまたメモする
tf.nn.conv2dtf.layers.conv2dの違いは何だろう?引数が増えたくらいにしかリファレンス読んだところ感じなかった・・・