keras.backend.function()的目的是什么

sgu*_*sgu 23 keras tensorflow

蝼说明书并没有说太多:

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]模型的最后即层.


Jac*_*ang 5

我认为此功能仅用于提取中间结果。可以参考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获取第三层的中间结果。