tf.layers.conv2d和tf.layers.Conv2D有什么区别?

3

tf.layers.conv2dtf.layers.Conv2D有什么区别?

为什么在论文的示例代码中使用了tf.layers.Conv2D

这是完整的代码片段:

class AddCoords(base.Layer):
    """Add coords to a tensor"""
    def __init__(self, x_dim=64, y_dim=64, with_r=False):
        super(AddCoords, self).__init__()
        self.x_dim = x_dim
        self.y_dim = y_dim
        self.with_r = with_r

    def call(self, input_tensor):
        """
        input_tensor: (batch, x_dim, y_dim, c)
        """
        batch_size_tensor = tf.shape(input_tensor)[0]
        xx_ones = tf.ones([batch_size_tensor, self.x_dim], dtype=tf.int32)
        xx_ones = tf.expand_dims(xx_ones, -1)
        xx_range = tf.tile(tf.expand_dims(tf.range(self.x_dim), 0), [batch_size_tensor, 1])
        xx_range = tf.expand_dims(xx_range, 1)
        xx_channel = tf.matmul(xx_ones, xx_range)
        xx_channel = tf.expand_dims(xx_channel, -1)
        yy_ones = tf.ones([batch_size_tensor, self.y_dim], dtype=tf.int32)
        yy_ones = tf.expand_dims(yy_ones, 1)
        yy_range = tf.tile(tf.expand_dims(tf.range(self.y_dim), 0), [batch_size_tensor, 1])
        yy_range = tf.expand_dims(yy_range, -1)
        yy_channel = tf.matmul(yy_range, yy_ones)
        yy_channel = tf.expand_dims(yy_channel, -1)
        xx_channel = tf.cast(xx_channel, 'float32') / (self.x_dim - 1)
        yy_channel = tf.cast(yy_channel, 'float32') / (self.y_dim - 1)
        xx_channel = xx_channel*2 - 1
        yy_channel = yy_channel*2 - 1
        ret = tf.concat([input_tensor, xx_channel, yy_channel], axis=-1)
        if self.with_r:
            rr = tf.sqrt(tf.square(xx_channel-0.5) + tf.square(yy_channel-0.5))
            ret = tf.concat([ret, rr], axis=-1)
        return ret

class CoordConv(base.Layer):
    """CoordConv layer as in the paper."""
    def __init__(self, x_dim, y_dim, with_r, *args, **kwargs):
        super(CoordConv, self).__init__()
        self.addcoords = AddCoords(x_dim=x_dim, y_dim=y_dim, with_r=with_r)
        self.conv = tf.layers.Conv2D(*args, **kwargs)
        def call(self, input_tensor):
            ret = self.addcoords(input_tensor)
            ret = self.conv(ret)
            return ret

我猜想这是torch实现,而不是tensorflow。 - bigbounty
请参考 https://pytorch.org/docs/stable/nn.html#torch.nn.Module。 - bigbounty
@bigbounty 这是TensorFlow。 - mrgloom
1
这里有一个类似的问题:https://dev59.com/1qrka4cB1Zd3GeqPk-dD?rq=1。我的猜测是为了保持一致性,因为AddCoords也是一个类? - Eric Zhou
2个回答

2

调用

y = tf.layers.conv2d(inputs, **kwargs)

现在与完全相同

y = tf.layers.Conv2D(**kwargs).apply(inputs)

因此,当您不打算重用由Conv2D创建的对象而仅调用其apply方法时,可以将tf.layers.conv2d视为一种快捷方式。


2

tf.layers.conv2d 是一个简单的函数/方法,用于计算其输入的卷积,因此它需要输入特征映射和内核或过滤器来运行此方法。有些用户只需调用此方法来计算卷积。
但是,tf.layers.Conv2d 是一个类(面向对象编程概念),您需要在使用之前实例化它并指定某个过滤器。一旦实例化,您可以向其中输入不同的输入并获得输出。使用这个类来设计和编程一个新的类或其他用户使用的新类型操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接