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

时间:2018-01-07 22:33:23

标签: tensorflow keras

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)

3 个答案:

答案 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之后计算出来的,因为它太宏了,无法包含此类操作。