如何在一个图层模块中打包几个keras图层?

时间:2018-03-24 16:30:49

标签: python machine-learning neural-network keras keras-layer

我必须从pytorch切换到keras,在pytorch中我可以用类似的代码创建类似模块的层:

lapply(unlist(assignments), count)

如何在keras中以类似模块的方式组织代码?

2 个答案:

答案 0 :(得分:1)

想出一种方法是做功能:

def double_conv(var1, input):
    x = k.layers.Conv2d(some_parameters) (input)
    x = k.layers.Conv2d(some_parameters) (x)
    x = k.layers.MaxPooling2d(some_parameters) (x)
    return x

但是还有更多'kerasic'的方法吗?

修改 这就是我想要使用像Keras层这样的功能,但如果有人会找到更好的方法来组织代码,那么我会欢迎任何想法

def conv_bn_relu(filters, kernel=(3,3)):
    def inside(x):
        x = Conv2D(filters, kernel, padding='same') (x)
        x = BatchNormalization() (x)
        x = Activation('relu') (x)
        return x
    return inside

# usage:
x = conv_bn_relu(params) (x)

<强> EDIT2
你甚至可以在类似CamelCase的类中作弊和命名这个函数,所以看起来像创建像层

这样的Keras
def ConvBnRelu(filters, kernel=(3,3)):
    def inside(x):
        x = Conv2D(filters, kernel, padding='same') (x)
        x = BatchNormalization() (x)
        x = Activation('relu') (x)
        return x
    return inside

# usage:
x = ConvBnRelu(params) (x)

但可能第二种解决方案会受到批评

答案 1 :(得分:0)

最新的(截至 2021 年 6 月)Tensorflow documentation on creating custom layers 解释了如何做到这一点。

TL;DR:子类 tf.keras.layers.Layertf.keras.Model,如果您想检查自定义块内的中间结果,后者是首选。例如:

class ConvolutionalBlock1x1(tf.keras.Model):

  def __init__(self, filters):
    super().__init__(name='')

    self.conv2a = tf.keras.layers.Conv2D(filters, (1, 1))
    self.conv2b = tf.keras.layers.Conv2D(filters, (1, 1))
    self.conv2c = tf.keras.layers.Conv2D(filters, (1, 1))

  def call(self, input_tensor, training=False):
    x = self.conv2a(input_tensor)
    x = tf.nn.relu(x)
    x = self.conv2b(x)
    x = tf.nn.relu(x)
    x = self.conv2c(x)
    return tf.nn.relu(x)