2017-07-09 12 views
1

現在、this pageで定義されているRCLレイヤを実装しています。テンソルを一緒に追加できないのはなぜですか?

import keras 
from keras.models import Model 
from keras.layers import Input, Dense, Dropout, Flatten 
from keras.layers import merge, Conv2D, MaxPooling2D, Input 
import numpy as np 
from keras import backend as K 

# RCL: 
# BatchNorm(Relu(conv(L-1) + conv(L))) 
# 

def make_RCNN(dim_1,dim_2,dim_3,number_of_rcl,num_of_filter, filtersize): 
    return True 

def RCL(feed_forward_input,num_of_filter, filtersize): 
    conv = Conv2D(filters=num_of_filter, kernel_size=filtersize) 
    recurrent_input = conv(feed_forward_input) 
    merged = merge([feed_forward_input,recurrent_input],mode='sum') 
    conv_relu = Relu(merged) 
    conv_relu_batchnorm = BatchNormalization()(conv_relu) 
    return conv_relu_batchnorm 

input = Input(shape=(30,30,3)) 
output = RCL(feed_forward_input=input,num_of_filter=3,filtersize=3) 

と私はエラーメッセージを取得しています:

python RCNN.py 
Using TensorFlow backend. 
Couldn't import dot_parser, loading of dot files will not be possible. 
RCNN.py:22: UserWarning: The `merge` function is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc. 
    merged = merge([feed_forward_input,recurrent_input],mode='sum') 
/usr/local/lib/python2.7/dist-packages/keras/legacy/layers.py:460: UserWarning: The `Merge` layer is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc. 
    name=name) 
Traceback (most recent call last): 
    File "RCNN.py", line 28, in <module> 
    output = RCL(feed_forward_input=input,num_of_filter=3,filtersize=3) 
    File "RCNN.py", line 22, in RCL 
    merged = merge([feed_forward_input,recurrent_input],mode='sum') 
    File "/usr/local/lib/python2.7/dist-packages/keras/legacy/layers.py", line 460, in merge 
    name=name) 
    File "/usr/local/lib/python2.7/dist-packages/keras/legacy/layers.py", line 111, in __init__ 
    node_indices, tensor_indices) 
    File "/usr/local/lib/python2.7/dist-packages/keras/legacy/layers.py", line 155, in _arguments_validation 
    'Layer shapes: %s' % input_shapes) 
ValueError: Only layers of same output shape can be merged using sum mode. Layer shapes: [(None, 30, 30, 3), (None, 28, 28, 3)] 

をそれだけでRCLの誤解も生じさせることができ、実際に問題はどれ...形状は同じではないことを言います..

しかし、私が理解から、またここで定義され

RCN explanation

私が実装したのは、前のレイヤー(フィードフォワードテンソル)からテンソルをとり、そのテンソル(恒久的なテンソル)に畳み込みを適用するRCLです。これらの2つのテンソルは、 z_ijk(t)方程式。この後に、方程式のように計算された両方のテンソルの合計は、畳み込みフィードフォワード入力=再帰入力は同じサイズではないという意味で意味があります。 2つのテンソル、それらのサイズが同じでないときは? RCLメソッドは次のようになりますので、

答えて

2

私は、解決策はただConv2Dコールにpadding='same'引数を追加するのと同じくらい簡単かもしれないと思う。それがなければ

def RCL(feed_forward_input,num_of_filter, filtersize): 
    conv = Conv2D(filters=num_of_filter, kernel_size=filtersize, padding='same') 
    recurrent_input = conv(feed_forward_input) 
    merged = merge([feed_forward_input,recurrent_input], mode='sum') 
    conv_relu = relu(merged) 
    conv_relu_batchnorm = BatchNormalization()(conv_relu) 
    return conv_relu_batchnorm 

、Conv2D層は、入力を(リサイズします28,28,3)の画像であり、元の画像とマージすることができない。パディングパラメータは、出力が同じ形状(または同じ形状の単純な部分)を入力とするように、イメージをゼロで埋めます。

+0

それはそれを修正します...しかし実際には正しい解決策であればわかりません..紙にはパディングに関連するものは何も言及されていません..これは一種の汚れ修正です。 – Lamda

+0

パディングは畳み込みネットワークのための標準的な技術であり、論文はそれを言いたいとは思わないかもしれません。このエラーは、コンボリューション・レイヤーが入力テンソルを(28,28,3)にサイズ変更していることを示しています。これは、コンボリューション・フィルターのサイズが3x3であるために起こります。画像の端から外れている)。パディングは、入力と出力が同じサイズになるように、外側にゼロのマージンを追加するだけです。 [This](http://cs231n.github.io/convolutional-networks/#convolutional-layer)はそれをうまく説明しています。 – JAustin

関連する問題