【发布时间】:2021-07-05 15:29:11
【问题描述】:
我想对层 x 执行一个简单的线性变换,所以变换的输出是y = a*x + b。我正在处理图像,所以 x 是 3 维的 (height * width * channels)。那么a 是大小为c 的尺度向量,其中c 是通道数,它对于x 的每个通道维度都有一个尺度参数。类似地,b 是一个大小的移位向量,它对于x 的每个通道维度都有一个移位参数。这是一个简单的归一化变体,没有对批次统计数据进行归一化。
这是一个例子:
# TODO: learn gamma and beta parameters
x = tf.keras.layers.Conv2D(filters=num_filters_e1,
kernel_size=5,
strides=2,
padding='same')(input)
x = tf.keras.layers.Multiply()([x, gamma]) # scale by gamma along channel dim
x = tf.keras.layers.Add()([x, beta]) # shift with beta along channel dim
y = tf.keras.layers.ReLU()(x) # apply activation after transformation
我不确定如何获得 gamma 和 beta。这些应该是模型在训练期间学习的参数,但我不确定如何构造或指定它们。通常我只是指定层(卷积层或密集层)来学习权重,但我不确定在这里使用哪个层以及该层应该将什么作为输入。我是否必须以某种方式初始化一个向量,然后学习权重以将它们转换为 gamma 和 beta?
即使可以使用 TensorFlow 的 batchnorm layer 来做到这一点(这仍然很有用),我想学习如何从头开始实现这种缩放/移位。谢谢!
【问题讨论】:
-
我鼓励您在 Keras 中实现一个自定义的
Layer,并将 alpha 和 beta 作为可训练变量。请参阅this 答案。
标签: tensorflow keras tensorflow2.0 tensor batch-normalization