我使用较大模型的中间输出作为较小模型的输入,我试图使其成为一个连续的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层中找到一种即时评估张量的方法。