该蝼说明书并没有说太多:
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
Run Code Online (Sandbox Code Playgroud)
Tensorflow源代码实际上很短,表明K.function(...)返回一个Function对象,当调用它时,使用输入来评估输出和更新.有趣的是它如何处理我不遵循的更新.任何解释/示例/指针,以帮助理解这个K.function(...)表示赞赏!以下是Tensorflow源代码的相关部分
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)
Run Code Online (Sandbox Code Playgroud)
Pal*_*Jog 15
我对此函数"Keras.Backend.Function"有以下了解.
我将在此代码片段的帮助下解释它.
代码段的部分如下 -
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])
Run Code Online (Sandbox Code Playgroud)
在此代码中,有一个模型,从中提取"conv5_3"层(第1行).在函数K.function()中,第一个参数输入到该模型,第二个参数设置为2个输出 - 一个用于卷积,第二个用于最后一层的softmax输出.
根据Keras/Tensorflow手册,此函数运行我们在代码中创建的计算图,从第一个参数获取输入并根据第二个参数中提到的层提取输出数.因此,conv_outputs是输出final_conv_layer和预测是输出model.layers [-1]模型的最后即层.
我认为此功能仅用于提取中间结果。可以参考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)
Run Code Online (Sandbox Code Playgroud)
另一种方法是构建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]
Run Code Online (Sandbox Code Playgroud)
您可以使用返回的函数对象get_3rd_layer_output获取第三层的中间结果。
| 归档时间: |
|
| 查看次数: |
6088 次 |
| 最近记录: |