Python 带有CNTK后端的Keras:编写自定义层

Python 带有CNTK后端的Keras:编写自定义层,python,keras,cntk,Python,Keras,Cntk,我试图在Keras中编写一个自定义层,以在一篇论文中提出的特定体系结构上进行复制。该层没有可训练的重量。我相信这可能是相关的,因为没有必要扩展类层 我使用的是CNTK后端,但我试图使代码尽可能与后端无关,因此我依赖于keras.backend中定义的接口,而不是直接使用CNTK 现在我只是想让一个小例子起作用。示例如下: import numpy as np from scipy.misc import imread from keras import backend as K im = i

我试图在Keras中编写一个自定义层,以在一篇论文中提出的特定体系结构上进行复制。该层没有可训练的重量。我相信这可能是相关的,因为没有必要扩展类层

我使用的是CNTK后端,但我试图使代码尽可能与后端无关,因此我依赖于keras.backend中定义的接口,而不是直接使用CNTK

现在我只是想让一个小例子起作用。示例如下:

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:卷积当前要求主操作数具有 动态轴

CNTK要求卷积的输入具有动态轴,否则它会将输入的第一维度解释为批量大小。因此,我尝试使用占位符使轴动态(这是我能找到的唯一方法):

图像现在是一个图像数组,基本上批量大小为1

这是正确的。但是,我不知道如何向占位符提供输入以测试代码
eval()
不接受任何参数,而且似乎没有办法将输入作为参数传递给求值

有没有一种不用占位符的方法?还是一种将输入提供给占位符的方法?我是否做了一些根本错误的事情,应该走另一条路


我应该补充一点,我确实希望避免被锁定在后端,因此任何解决方案都应该是后端无关的。

对于使用自定义层,您不需要定义张量,让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))

简单地使用place=K.variable(ex_im)仍然会导致与我在原始帖子中提到的相同的运行时错误。我遗漏了什么吗?这个答案正是我所需要的,谢谢。对于将来遇到这个问题的人:我需要这个来测试我正在开发的一些代码。这些层将集成到现有模型中,因此不需要仅为这些层创建单独的模型。
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))