在自定义Keras层

时间:2018-02-20 06:34:12

标签: python tensorflow deep-learning keras

我使用较大模型的中间输出作为较小模型的输入,我试图使其成为一个连续的Model。为此,我必须使用K.function()作为模型的一部分。这导致了一个问题:

有没有办法在Keras图层中使用K.function()

我使用以下方法创建了一个简单的自定义图层:

class ActivationExtraction(Layer):
    """
    Extracts all of the outputs of the input_model network and feeds it as input
    to the next layer
    """
    def __init__(self, input_model, **kwargs):
        self.input_model = input_model

        # Extracts all outputs
        outputs = [layer.output for layer in input_model.layers]
        self.output_dim = np.array(outputs).shape
        self.names = [layer.name for layer in input_model.layers]

        # Evaluation function
        self.output_function = K.function([input_model.input] + [K.learning_phase()],
                                          outputs)

        super(ActivationExtraction, self).__init__(**kwargs)

    def build(self, input_shape):
        super(ActivationExtraction, self).build(input_shape)

    def call(self, x):
        return self.output_function([x, 0])

    def compute_output_shape(self, input_shape):
        return self.output_dim

但是,当我定义模型时,它会返回错误

TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed 
values include Python scalars, strings, lists, numpy ndarrays, or TensorHandles.

我不知道在编译时评估张量的解决方法(因为输入形状是动态的)。我尝试过使用

def call(self, x):
    x = K.get_session.run(x)
    return self.outputfuntion([x, 0])

作为尝试和评估张量的远景,但我不确定我会喂它(我对tensorflow的经验有限)。

作为最后的手段,我无法在Keras层中找到一种即时评估张量的方法。

0 个答案:

没有答案