【问题标题】:Keras with CNTK backend: Writing custom layers带有 CNTK 后端的 Keras:编写自定义层
【发布时间】:2017-06-27 04:19:38
【问题描述】:

我正在尝试在 Keras 中编写一个自定义层,以复制论文中提出的特定架构。该层没有可训练的权重。我相信这可能是相关的,因为没有必要扩展类 Layer。

我正在使用 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 要求卷积的输入具有动态轴,否则它将输入的第一个维度解释为批量大小。所以我尝试使用占位符使坐标轴动态化(我能找到的唯一方法):

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() 不接受任何参数,并且似乎没有办法将输入作为参数传递给评估。

有没有办法在没有占位符的情况下做到这一点?或者一种将输入提供给占位符的方法?我是否在做一些根本错误的事情,应该走另一条路?

我应该补充一点,我真的很想避免被锁定在后端,所以任何解决方案都应该与后端无关。

【问题讨论】:

    标签: python keras cntk


    【解决方案1】:

    对于使用自定义层,您无需定义张量,让 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) 仍然会导致与我在原始帖子中提到的相同的 RuntimeError。我错过了什么吗?
    • 这个答案符合我的需要,谢谢。对于那些将来遇到这个问题的人:我需要这个来测试我正在开发的一些代码。这些层将集成到现有模型中,因此无需仅为这些层创建单独的模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2012-08-16
    • 1970-01-01
    • 2018-12-03
    • 2021-03-12
    • 2017-04-21
    相关资源
    最近更新 更多