0

支持我有一个带有 5 个卷积的网络。我是由 Keras 编写的。

x = Input(shape=(None, None, 3))
y = Conv2D(10, 3, strides=1)(x)
y = Conv2D(16, 3, strides=1)(y)
y = Conv2D(32, 3, strides=1)(y)
y = Conv2D(48, 3, strides=1)(y)
y = Conv2D(64, 3, strides=1)(y)

我想将所有卷积设置kernel_initializer为 xavier。一种方法是:

x = Input(shape=(None, None, 3))
y = Conv2D(10, 3, strides=1, kernel_initializer=tf.glorot_uniform_initializer())(x)
y = Conv2D(16, 3, strides=1, kernel_initializer=tf.glorot_uniform_initializer())(y)
y = Conv2D(32, 3, strides=1, kernel_initializer=tf.glorot_uniform_initializer())(y)
y = Conv2D(48, 3, strides=1, kernel_initializer=tf.glorot_uniform_initializer())(y)
y = Conv2D(64, 3, strides=1, kernel_initializer=tf.glorot_uniform_initializer())(y)

但是这样的写法很伤感,代码也很冗余。

有没有更好的写法?

4

2 回答 2

3

Keras 无法更改默认值,因此您只需创建一个包装函数:

def myConv2D(filters, kernel):
    return Conv2D(filters, kernel, strides=1, kernel_initializer=tf.glorot_uniform_initializer())

然后将其用作:

x = Input(shape=(None, None, 3))
y = myConv2D(10, 3)(x)
y = myConv2D(16, 3)(y)
y = myConv2D(32, 3)(y)
y = myConv2D(48, 3)(y)
y = myConv2D(64, 3)(y)
于 2019-03-27T10:27:33.117 回答
1

最好制作一个lambda将创建一个Conv2D层并根据需要修复初始化程序并在模型定义部分中调用它的方法。

我认为 lambda 比函数更适合这种情况。

你可以这样做,

customConv = lambda filters, kernel : Conv2D(filters, kernel, strides=1, kernel_initializer=tf.glorot_uniform_initializer())

x = Input(shape=(None, None, 3))

y = customConv(10, 3)(x)
y = customConv(16, 3)(y)
y = customConv(32, 3)(y)
y = customConv(48, 3)(y)
y = customConv(64, 3)(y)
于 2019-03-27T13:13:49.503 回答