2017-06-26 10 views
0

私はKerasにカスタムレイヤーを作成して、論文で提案されている特定のアーキテクチャを複製しようとしています。このレイヤーにはトレーニング可能なウェイトはありません。クラスレイヤを拡張する必要はないので、これは適切かもしれないと私は考えている。CNTKバックエンドを使用したKeras:カスタムレイヤーの作成

私はCNTKバックエンドを使用していますが、コードをできる限りバックエンドに依存しないようにしています。そのため、CNTKを直接使用するのではなく、keras.backendで定義されているインターフェイスに依存しています。

今はちょっとしたサンプルを手に入れようとしています。

import numpy as np 

from scipy.misc import imread 
from keras import backend as K 

im = imread('test.bmp') 

#I'm extending a grayscale image to behave as a color image 
ex_im = np.empty([im.shape[0],im.shape[1],3]) 

ex_im[:,:,0] = im 
ex_im[:,:,1] = im 
ex_im[:,:,2] = im 

conv_filter = K.ones([3,3,ex_im.shape[2],ex_im.shape[2]]) 
x = K.conv2d(ex_im,conv_filter,padding='same') 

このコードは、しかし、次のエラーの結果は:

RuntimeError: Convolution currently requires the main operand to have dynamic axes

CNTKダイナミック軸を有するようにコンボリューションへの入力を必要とするそれ以外の場合は、最初の次元を解釈し、例えば次のようです入力のバッチサイズを指定します。だから私は、プレースホルダ(私はそうすることで見つけることができる唯一の方法)との軸を動的に作ってみました:

import numpy as np 

from scipy.misc import imread 
from keras import backend as K 

im = imread('test.bmp') 

ex_im = np.empty([1,im.shape[0],im.shape[1],3]) 

ex_im[0,:,:,0] = im 
ex_im[0,:,:,1] = im 
ex_im[0,:,:,2] = im 

place = K.placeholder(shape=((None,) + ex_im.shape[1:])) 

conv_filter = K.ones([3,3,ex_im.shape[3],ex_im.shape[3]]) 
x = K.conv2d(place,conv_filter,padding='same') 

画像は基本的に1

のバッチサイズであるものと、今画像の配列であります

これは正しく動作します。しかし、コードをテストするために入力をプレースホルダに供給する方法を理解できません。 eval()は引数をとらず、入力を評価の引数として渡す方法はないようです。

プレースホルダなしでこれを行う方法はありますか?または入力をプレースホルダに供給する方法ですか?私は根本的に何かをやっているのですか?別の道をたどるべきですか?

私は本当にバックエンドにロックされないようにしなければならないということを付け加えてください。したがって、どのソリューションもバックエンドに依存しないようにする必要があります。

答えて

0

カスタムレイヤーを使用する場合は、テンソルを定義しないで、Kerasがそれを行います。ただ、レイヤーを作成し、どのような層に与えられますが、既に適切なテンソルになります:私はオリジナルのポストで述べたように

images = np.ones((1,50,50,3)) 

def myFunc(x): 
    conv_filter = K.ones([3,3,3,3]) 
    return K.conv2d(x,conv_filter,padding='same') 

inp = Input((50,50,3)) 
out = Lambda(myFunc, output_shape=(50,50,3))(inp) 

model = Model(inp,out) 
print(model.predict(images)) 
+0

単に場所を使用して= K.variable(ex_imは)まだ同じ例外RuntimeErrorになります。何か不足していますか? – fnw

+0

実例で私の答えを更新しました。 –

+0

この回答は私が必要としたことです、ありがとうございます。将来この質問に遭遇する人たちに:私が開発しているコードをテストするためには、これが必要でした。このレイヤーは既存のモデルに統合されるため、これらのレイヤーのためだけに別のモデルを作成する必要はありません。 – fnw

関連する問題