首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Conv层创建Keras层子类

使用Conv层创建Keras层子类
EN

Stack Overflow用户
提问于 2019-07-17 17:06:55
回答 1查看 393关注 0票数 1

我想创建一个与以下函数类似的自定义tf.keras.layers.Layer

代码语言:javascript
复制
def conv_block(inputs, filters, kernel_size, strides=(1, 1, 1),
                 padding='valid', activation=True, block_name='conv3d'):

    with tf.name_scope(block_name):
      conv = Conv3D(filters=filters, kernel_size=kernel_size, strides=strides,
                    padding=padding, activation=None,
                    name='{}_conv'.format(block_name))(inputs)
      batch_norm = BatchNormalization(
          name='{}_batch_norm'.format(block_name))(conv)

      if activation:
        relu = ReLU(max_value=6, name='{}_relu'.format(block_name))(batch_norm)
        res_layer = relu
      else:
        res_layer = batch_norm
    return res_layer

我查看了可用的文档这里这里,然后创建了下面的类:

代码语言:javascript
复制
class ConvBlock(tf.keras.layers.Layer):

    def __init__(self, filters, kernel_size, strides=(1, 1, 1), padding='valid', activation=True, **kwargs):
        super(ConvBlock, self).__init__()
        self.filters = filters
        self.kernel_size = kernel_size
        self.strides = strides
        self.padding = padding
        self.activation = activation

        self.conv_1 = Conv3D(filters=self.filters, 
                             kernel_size=self.kernel_size, 
                             strides=self.strides, 
                             padding=self.padding, 
                             activation=None)

        self.batch_norm_1 = BatchNormalization()
        self.relu_1 = ReLU(max_value=6)

    def call(self, inputs):
        conv = self.conv_1(inputs)
        batch_norm = self.batch_norm_1(conv)

        if self.activation:
            relu = self.relu_1(batch_norm)
            return relu
        else:
            return batch_norm

我想在我的模型中多次使用这个Layer。我对此有几个问题:

  1. 文档提到了在add_weights()方法中使用build()。不过,在这种情况下是否有需要呢?
  2. 我是否需要包含一个build()方法?
  3. 如何获得该层的输出形状?这些文档提到了使用以下功能: def compute_output_shape(self,input_shape):shape = tf.TensorShape(input_shape).as_list() self 1= self.output_dim return tf.TensorShape(shape)

如何使用此函数计算输出层的形状?

EN

回答 1

Stack Overflow用户

发布于 2021-03-17 13:01:20

也许您可以直接使用一个函数来封装您的重复操作,而不是子类层,只有当您认为需要使用权重或初始化权重模式时才可以使用子类,因为这是比后者更正确的方法。

示例:

代码语言:javascript
复制
def simple_conv(x):
   x = Conv2d(x)
   x = Bathcnorm(x)
   return x
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57081006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档