Kera manual并没有说太多:
keras.backend.function(inputs, outputs, updates=None)
Instantiates a Keras function.
Arguments
inputs: List of placeholder tensors.
outputs: List of output tensors.
updates: List of update ops.
**kwargs: Passed to tf.Session.run.
Returns
Tensorflow source code,实际上非常短,表明K.function(...)返回一个Function对象,当被调用时,它会计算输出和更新< / em>使用输入。有趣的是它如何处理我不遵循的更新。任何解释/示例/指针,以帮助理解这个K.function(...)表示赞赏!以下是Tensorflow source code
的相关部分class Function(object):
"""Runs a computation graph.
Arguments:
inputs: Feed placeholders to the computation graph.
outputs: Output tensors to fetch.
updates: Additional update ops to be run at function call.
name: a name to help users identify what this function does.
"""
def __init__(self, inputs, outputs, updates=None, name=None,
**session_kwargs):
updates = updates or []
if not isinstance(inputs, (list, tuple)):
raise TypeError('`inputs` to a TensorFlow backend function '
'should be a list or tuple.')
if not isinstance(outputs, (list, tuple)):
raise TypeError('`outputs` of a TensorFlow backend function '
'should be a list or tuple.')
if not isinstance(updates, (list, tuple)):
raise TypeError('`updates` in a TensorFlow backend function '
'should be a list or tuple.')
self.inputs = list(inputs)
self.outputs = list(outputs)
with ops.control_dependencies(self.outputs):
updates_ops = []
for update in updates:
if isinstance(update, tuple):
p, new_p = update
updates_ops.append(state_ops.assign(p, new_p))
else:
# assumed already an op
updates_ops.append(update)
self.updates_op = control_flow_ops.group(*updates_ops)
self.name = name
self.session_kwargs = session_kwargs
def __call__(self, inputs):
if not isinstance(inputs, (list, tuple)):
raise TypeError('`inputs` should be a list or tuple.')
feed_dict = {}
for tensor, value in zip(self.inputs, inputs):
if is_sparse(tensor):
sparse_coo = value.tocoo()
indices = np.concatenate((np.expand_dims(sparse_coo.row, 1),
np.expand_dims(sparse_coo.col, 1)), 1)
value = (indices, sparse_coo.data, sparse_coo.shape)
feed_dict[tensor] = value
session = get_session()
updated = session.run(
self.outputs + [self.updates_op],
feed_dict=feed_dict,
**self.session_kwargs)
return updated[:len(self.outputs)]
def function(inputs, outputs, updates=None, **kwargs):
"""Instantiates a Keras function.
Arguments:
inputs: List of placeholder tensors.
outputs: List of output tensors.
updates: List of update ops.
**kwargs: Passed to `tf.Session.run`.
Returns:
Output values as Numpy arrays.
Raises:
ValueError: if invalid kwargs are passed in.
"""
if kwargs:
for key in kwargs:
if (key not in tf_inspect.getargspec(session_module.Session.run)[0] and
key not in tf_inspect.getargspec(Function.__init__)[0]):
msg = ('Invalid argument "%s" passed to K.function with Tensorflow '
'backend') % key
raise ValueError(msg)
return Function(inputs, outputs, updates=updates, **kwargs)
答案 0 :(得分:10)
我对此功能有以下了解&#34; Keras.Backend.Function&#34;。
我将在this的代码段的帮助下解释它。
代码段的部分如下 -
final_conv_layer = get_output_layer(model, "conv5_3")
get_output = K.function([model.layers[0].input], [final_conv_layer.output, model.layers[-1].output])
[conv_outputs, predictions] = get_output([img])
在此代码中,有一个模型,&#34; conv5_3&#34;提取图层(第1行)。在函数K.function()中,第一个参数输入到该模型,第二个参数设置为2个输出 - 一个用于卷积,第二个用于最后一层的softmax输出。
根据Keras / Tensorflow手册,此函数运行我们在代码中创建的计算图,从第一个参数获取输入并根据第二个参数中提到的层提取输出数。因此, conv_outputs 输出 final_conv_layer ,预测输出 model.layers [-1] ,即最后一层该模型。
答案 1 :(得分:2)
我认为此功能仅用于提取中间结果。可以参考Keras文档中的“如何获得中间层的输出?”
一种简单的方法是创建一个新模型,该模型将输出您感兴趣的图层:
from keras.models import Model
model = ... # create the original model
layer_name = 'my_layer'
intermediate_layer_model = Model(inputs=model.input,
outputs=model.get_layer(layer_name).output)
intermediate_output = intermediate_layer_model.predict(data)
另一种方法是构建Keras函数,该函数将在给定输入的情况下返回特定层的输出。例如:
from keras import backend as K
# with a Sequential model
get_3rd_layer_output = K.function([model.layers[0].input],
[model.layers[3].output])
layer_output = get_3rd_layer_output([x])[0]
您可以使用返回的函数对象get_3rd_layer_output获取第三层的中间结果。
答案 2 :(得分:0)
将其视为函数包装器。在keras和tensorflow的框架中,它包装张量列表作为输入,并对网络中的权重进行一些操作(向后传播)。 它在强化学习领域中特别有用,在该领域中,损失是在动作(模型输出)和model.fit之后计算出来的,因为它太宏了,无法包含此类操作。