Python 如何编写自定义函数CNTK

Python 如何编写自定义函数CNTK,python,function,segmentation-fault,cntk,Python,Function,Segmentation Fault,Cntk,我创建了一个名为CustomFunc的自定义函数,如下所示: 如果我按照文章的建议使用它,它会起作用: model = cntk.user_function(CustomFunc(prev_node)) 这很好,模型运行没有任何问题。我的问题是,我想在cntk.layers.Sequential调用和cntk.layers.Recurrence调用中使用此函数。要做到这一点,我需要以某种方式构造我的函数与另一个函数的组合,然后将其放入顺序调用或重复调用中。现在我使用一些占位符,即我所做的是:

我创建了一个名为CustomFunc的自定义函数,如下所示:

如果我按照文章的建议使用它,它会起作用:

model = cntk.user_function(CustomFunc(prev_node))
这很好,模型运行没有任何问题。我的问题是,我想在cntk.layers.Sequential调用和cntk.layers.Recurrence调用中使用此函数。要做到这一点,我需要以某种方式构造我的函数与另一个函数的组合,然后将其放入顺序调用或重复调用中。现在我使用一些占位符,即我所做的是:

customFunToUse = cntk.user_function(CustomFunc(cntk.placeholder(), otherInputs))
model = cntk.layers.Sequential([cntk.layers.Dense(100), 
                                customFunToUse, 
                                cntk.layers.Recurrence(
                                customFunToUse >> cntk.layers.LSTM(100))])
但这不起作用,并引发了各种各样的错误:有时它是一个segfault,在另一个类似的模型中是一个segfault

"ValueError: Cannot create an NDArrayView using a view shape '[? x 10]' that has unknown dimensions for any of its axes."
相反,其他时间是

Evaluate: All nodes inside a recurrent loop must have a layout that is identical; mismatch found for nodes ...
还要注意,我的自定义函数不会改变输入维度:给定任何数量的参数,它将返回相同的数量和类型。代码如下:

class CustomFun(UserFunction):
    def __init__(self, *args, otherStuff, name='CustomFun'):
        super(CustomFun, self).__init__(list(args), name=name)
        self.otherStuff = otherStuff

    def forward(self, arguments, outputs=None, keep_for_backward=None, device=None, as_numpy=True):
        return None,[x/2 for x in arguments]

    def backward(self, state, root_gradients, variables=None, as_numpy=True):
        #it's not important right now, just a test...
        return root_gradient

    def infer_outputs(self):
        #shape, type and dynamic axes of inputs are not changed by this function

        outputVar = [output_variable(self.inputs[idx].shape, self.inputs[idx].dtype,
            self.inputs[idx].dynamic_axes, name='out_quantLayer') for idx in range(len(self.inputs))]
        return outputVar

    def serialize(self):
        return {'otherStuff': self.otherStuff}

    @staticmethod
    def deserialize(inputs, name, state):
        return CustomFun(inputs, otherStuff=state['otherStuff'], name=name)

正确的方法是这样写

def my_图层(x):
@C.职能
def应用(x):
返回cntk.user_函数(CustomFunc(x))
退货申请
不幸的是,这似乎导致我的Python解释器崩溃。我已经打开了这个。当问题得到解决时,将尝试更新此答案

更新:有一个小的打字错误,我们没有发现。github问题页面上有一个解决方案