2017-06-26 28 views
0

我试图在Keras中编写自定义图层以便在论文中提出的特定体系结构上进行复制。该图层没有可训练的权重。我相信这可能是相关的,因为它不需要扩展类层。我正在使用CNTK后端,但我试图尽可能保持后端不可知的代码,所以我依靠在keras.backend中定义的接口,而不是直接使用CNTK。带有CNTK后端的Keras:编写自定义图层

现在我只是想要一个小例子来工作。的例子如下:

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