一些TensorFlow层(例如tf.layers.dense和tf.layers.conv2d)接受kernel_constraint
参数,根据tf api docs docs,该参数实现了
在[1]中,Salimans等人。提出了一种称为权重归一化的神经网络归一化技术,该技术对网络层的权向量进行归一化,与之相对的是批量归一化[2],后者对流经该层的实际数据批次进行归一化。在某些情况下,权重归一化方法的计算开销较低,它也可以用于无法使用批量归一化的情况。
我的问题是:是否可以使用上述TensorFlow层的kernel_constraint
来实现权重归一化?假设x
是形状为(batch, height, width, channels)
的输入,我想我可以按以下方式实现它:
x = tf.layers.conv2d(
inputs=x,
filters=16,
kernel_size=(3, 3),
strides=(1, 1),
kernel_constraint=lambda kernel: (
tf.nn.l2_normalize(w, list(range(kernel.shape.ndims-1)))))
什么是验证/使我的解决方案无效的简单测试用例?
[1] SALIMANS,蒂姆; KINGMA,DiederikP。权重归一化:一个简单的重新参数化,可加快深度神经网络的训练速度。于:神经信息处理系统的进展。 2016年901-909。
[2] IOFFE,谢尔盖; SZEGEDY,基督徒。批量归一化:通过减少内部协变量偏移来加速深度网络训练。 arXiv预印本arXiv:1502.03167,2015年。
最佳答案
尽管有标题,但Salimans和Kingma的论文建议将权重范数与其方向分离,而不是实际对权重进行归一化(即按照您的建议将其l2范数设置为一个)。
如果您想验证代码是否达到了预期的效果(即使不是他们所建议的),则可以获取模型的权重并检查其规范。
用伪代码:
model = tf.models.Model(inputs=inputs, outputs=x)
weights = model.get_weights()[i] # checking the weights of the i-th layer
flat_weights = weights.flatten()
import numpy as np
print(np.linalg.norm(flat_weights, 2))
关于python - 使用TensorFlow层的 `kernel_constraint`实现权重归一化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51351004/