python - 使用 TensorFlow 层的 `kernel_constraint` 实现权重归一化

标签 python tensorflow neural-network deep-learning

一些 TensorFlow 层,例如 tf.layers.densetf.layers.conv2d ,接受 kernel_constraint论据,根据 tf api docs docs实现一个

Optional projection function to be applied to the kernel after being updated by an Optimizer (e.g. used to implement norm constraints or value constraints for layer weights).



[1] ,萨利曼斯等。提出一种神经网络归一化技术,称为权重归一化,它对网络层的权重向量进行归一化,例如批量归一化 [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, Diederik P. 权重归一化:加速深度神经网络训练的简单重新参数化。在:神经信息处理系统的进展。 2016 年。 901-909。

[2] IOFFE,谢尔盖; SZEGEDY,基督徒。批量归一化:通过减少内部协变量偏移来加速深度网络训练。 arXiv 预印本 arXiv:1502.03167, 2015。

最佳答案

尽管标题如此,但 Salimans 和 Kingma 的论文建议将权重范数与其方向分离,而不是实际将权重归一化(即按照您的建议将他们的 l2 范数设置为 1)。

如果您想验证您的代码是否具有预期效果,即使它不是他们提出的,您可以获取模型的权重并检查它们的范数。
在伪代码中:

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/

相关文章:

python - 使用requests和multiprocessing时的奇怪问题

python - Scrapy抓取多个页面错误过滤重复

python - 为什么不是所有的激活函数都相同?

tensorflow - NN 中数值输入的归一化

python - 未排序的二进制数组中第一次出现 1

python - 无法读取 tensorflow 检查点以进行微调

python - Keras:是否有一种简单的方法可以在时期之间对训练集中的数据进行变异(洗牌)?

python - fit_generator() 在 Spyder 中不起作用

python - 通过线性回归进行 tensorflow 图像分割

python - 用于删除跨列具有相同内容的连续重复行的数据框