在使用多个TensorFlow Keras层时,使用相同的初始化器、正则化器和约束是否安全?

5
我担心在(tensorflow)keras层中使用相同的initializer、regularizer和constraint创建的变量可能会在层之间连接。如果它们可以是字符串(例如,'he_normal'),那么就没有问题,但对于那些带有参数的变量,我必须传递实际的函数。例如,在自定义层的__init__中。
initializer_1 = tf.keras.initializers.he_normal()
regularizer_1 = tf.keras.regularizers.l2(l=0.001)
constraint_1  = tf.keras.constraints.MaxNorm(max_value=2, axis=[0,1,2])

layer_A = tf.keras.layers.Conv2D(
  ...
  kernel_initializer=initializer_1,
  kernel_regularizer=regularizer_1,
  kernel_constraint=constraint_1,
  ...
  )

layer_B = tf.keras.layers.Conv2D(
  ...
  kernel_initializer=initializer_1,
  kernel_regularizer=regularizer_1,
  kernel_constraint=constraint_1,
  ...
  )

这安全吗?

1个回答

3

也许可以,但不确定是否是最佳方案;我进行了试验 - 结果如下:

  • 对于同样的对象(1)和不同的对象(initializer_2等),两者的.fit()损失相同,因此每个对象都像独立运行一样。
  • 使用相同的initializer_1,层权重初始化不同(应该如此)。
  • 模型可以成功保存和加载。

然而,每个层的对象是相同的 - 这可以从它们的内存占用中看出。

print(layer_A.kernel_regularizer)
print(layer_B.kernel_regularizer)

<tensorflow.python.keras.regularizers.L1L2 object at 0x7f211bfd0c88>
<tensorflow.python.keras.regularizers.L1L2 object at 0x7f211bfd0c88>

有可能某些模型序列化的形式会出现问题,特别是涉及到模型图的部分,但我没有发现任何问题。最佳实践是为每个层使用唯一的层对象,但您的方法似乎也没有害处。

因此:您可以“一直使用它,直到它崩溃”。(但是您可能不知道何时会崩溃,例如当它导致模型输出有所不同时 - 除非您进行可重复性测试)。


完整测试示例

import tensorflow as tf
import numpy as np
import random
from tensorflow.keras.models import Model, load_model
from tensorflow.keras.layers import Input

np.random.seed(1)
random.seed(2)
if tf.__version__ == '2':
    tf.random.set_seed(3)
else:
    tf.set_random_seed(3)

initializer_1 = tf.keras.initializers.he_normal()
regularizer_1 = tf.keras.regularizers.l2(l=0.001)
constraint_1  = tf.keras.constraints.MaxNorm(max_value=2, axis=[0,1,2])

layer_A = tf.keras.layers.Conv2D(4, (1,1),
  kernel_initializer=initializer_1,
  kernel_regularizer=regularizer_1,
  kernel_constraint=constraint_1)

layer_B = tf.keras.layers.Conv2D(4, (1,1),
  kernel_initializer=initializer_1,
  kernel_regularizer=regularizer_1,
  kernel_constraint=constraint_1)

ipt = Input((16,16,4))
x   = layer_A(ipt)
out = layer_B(x)

model = Model(ipt, out)
model.compile('adam', 'mse')
print(model.layers[1].get_weights()[0])
print(model.layers[2].get_weights()[0])

x = np.random.randn(32, 16, 16, 4)
model.fit(x, x)

model.save('model.h5')
model = load_model('model.h5')

在我看到更明确的答案之前,我会采纳你的建议,即“为每个图层使用唯一的图层对象”。谢谢。 - Maosi Chen

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