使用TensorFlow图层的"kernel_constraint"实现权重规范化

har*_*nen 6 python neural-network deep-learning tensorflow

一些TensorFlow层,如tf.layers.densetf.layers.conv2d,接受一个kernel_constraint参数,根据tf api 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)))))
Run Code Online (Sandbox Code Playgroud)

什么是验证/使我的解决方案无效的简单测试用例?

[1] SALIMANS,蒂姆; KINGMA,Diederik P.体重标准化:一种简单的重新参数化,可加速深层神经网络的训练.在:神经信息处理系统的进展.2016.p.901-909.

[2] IOFFE,谢尔盖; SZEGEDY,Christian.批量标准化:通过减少内部协变量偏移来加速深度网络训练.arXiv preprint arXiv:1502.03167,2015.

Lio*_*Lio 0

尽管有标题,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))
Run Code Online (Sandbox Code Playgroud)