【问题标题】:Where does the "call" function used in TensorFlow?TensorFlow 中使用的“调​​用”函数在哪里?
【发布时间】:2021-09-29 12:47:50
【问题描述】:

我正在写一个 RESNET,但我不明白“调用”函数在哪里使用。

也许这是 TensorFlow 自动调用的,所以这意味着我们必须编写一个名为“call”的函数?如果是这样,这个“调用”功能的确切要求应该是什么?谢谢!!

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Sequential

class BasicBlock(layers.Layer):
    def __init__(self, filter_num, strides=1):
        super(BasicBlock, self).__init__()
        self.conv1 = layers.Conv2D(filter_num, (3, 3), strides=strides, padding="same")
        self.bn1 = layers.BatchNormalization()
        self.relu = layers.Activation('relu')
        self.conv2 = layers.Conv2D(filter_num, (3, 3), strides=1, padding="same")
        self.bn2 = layers.BatchNormalization()

        if strides != 1:
            self.downsample = layers.Conv2D(filter_num, (1, 1), strides=strides)
        else:
            self.downsample = lambda x:x

    def call(self, inputs, training=None): 
        out = self.conv1(inputs)
        out = self.bn1(out, training=training)
        out = self.relu(out)

        out = self.conv2(out, training=training)
        out = self.bn2(out)

        identity = self.downsample(inputs)

        output = layers.add([out, identity])
        output = tf.nn.relu(output)

        return output

【问题讨论】:

    标签: python function tensorflow keras call


    【解决方案1】:

    调用函数的使用方式如下:

    basic_block = BasicBlock()
    basic_block(args)
    

    所以它来代替:

    basic_block.call(args)
    

    【讨论】:

      【解决方案2】:

      当您定义一个自定义层时,您将扩展基类tensorflow.keras.layers.Layer 并按如下方式使用它:

      import tensorflow as tf
      
      class BasicBlock(tf.keras.layers.Layer):
         ...
      
      basic_block = BasicBlock()
      basic_block(inputs)
      

      上面 sn-p 的最后一行将调用类中的魔术方法__call__(如果您有兴趣,请在此处查看有关魔术方法的更多信息A Guide to Python's Magic Methods

      由于您没有在BasicBlock 中定义__call__ 方法(您定义了不同的call),因此将使用来自tensorflow.keras.layers.Layer__call__

      此方法根据Tensorflow documentation有以下文档

      包装调用,应用预处理和后处理步骤。

      粗略地说你会有(如果你有兴趣可以查看source code,但它要复杂得多):

      class Layer(...):
         ....
         def __call__(self, ...):
            # preprocessing steps
            self.call(...)
            # post processing steps
      

      如果你熟悉继承,你应该猜到使用basic_block(inputs)时的不同步骤:

      1. 检查BasicBlock是否有一个名为__call__的方法=>没有
      2. 检查基类Layer是否有一个名为__call__的方法=>是的,使用它并进入这个方法
      3. 应用预处理步骤
      4. 检查 BasicBlock 是否有一个名为 call 的方法 => 是的,使用它并将其应用于输入
      5. 应用后处理步骤

      关于实现最佳资源的call 方法的要求是official Tensorflow documentation,您可以在其中解释有关预期的输入数据结构+关键字参数的所有内容

      【讨论】:

        猜你喜欢
        • 2016-04-15
        • 2015-08-13
        • 1970-01-01
        • 2016-10-13
        • 2016-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-12
        相关资源
        最近更新 更多