私は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()
は引数をとらず、入力を評価の引数として渡す方法はないようです。
プレースホルダなしでこれを行う方法はありますか?または入力をプレースホルダに供給する方法ですか?私は根本的に何かをやっているのですか?別の道をたどるべきですか?
私は本当にバックエンドにロックされないようにしなければならないということを付け加えてください。したがって、どのソリューションもバックエンドに依存しないようにする必要があります。
単に場所を使用して= K.variable(ex_imは)まだ同じ例外RuntimeErrorになります。何か不足していますか? – fnw
実例で私の答えを更新しました。 –
この回答は私が必要としたことです、ありがとうございます。将来この質問に遭遇する人たちに:私が開発しているコードをテストするためには、これが必要でした。このレイヤーは既存のモデルに統合されるため、これらのレイヤーのためだけに別のモデルを作成する必要はありません。 – fnw