【问题标题】:How to access weight variables in Keras layers in tensor form for clip_by_weight?如何以张量形式访问 Keras 层中 clip_by_weight 的权重变量?
【发布时间】:2023-03-04 14:55:02
【问题描述】:

我正在实施 WGAN,需要裁剪权重变量。

我目前使用 TensorflowKeras 作为高级 API。因此使用 Keras 构建层以避免手动创建和初始化变量。

问题是 WGAN 需要裁剪权重变量,这可以在我获得这些权重变量张量后使用 tf.clip_by_value(x, v0, v1) 完成,但我不知道如何安全地获得它们。

一种可能的解决方案可能是使用tf.get_collection() 来获取所有可训练变量。但我不知道如何在没有 bias 变量的情况下仅获得 weight 变量。

另一个解决方案是layer.get_weights(),但它得到numpy 数组,虽然我可以使用numpy API 剪辑它们并使用layer.set_weights() 设置它们,但这可能需要CPU-GPU 公司,并且可能不是不错的选择,因为每个 train step 都需要执行剪辑操作。

我知道的唯一方法是使用 exact 变量名直接访问它们,我可以从 TF 低级 API 或 TensorBoard 获得,但这可能不安全,因为 Keras 的命名规则无法保证保持稳定。

是否有任何干净的方法可以使用 Tensorflow 和 Keras 仅在 Ws 上执行 clip_by_value

【问题讨论】:

    标签: python tensorflow deep-learning keras


    【解决方案1】:

    您可以使用约束(here) 类来实现对参数的新约束。

    这是您可以轻松实现剪辑权重并在模型中使用它的方法。

    from keras.constraints import Constraint
    from keras import backend as K
    
    class WeightClip(Constraint):
        '''Clips the weights incident to each hidden unit to be inside a range
        '''
        def __init__(self, c=2):
            self.c = c
    
        def __call__(self, p):
            return K.clip(p, -self.c, self.c)
    
        def get_config(self):
            return {'name': self.__class__.__name__,
                    'c': self.c}
    
    import numpy as np
    from keras.models import Sequential
    from keras.layers import Dense
    
    model = Sequential()
    model.add(Dense(30, input_dim=100, W_constraint = WeightClip(2)))
    model.add(Dense(1))
    
    model.compile(loss='mse', optimizer='rmsprop')
    
    X = np.random.random((1000,100))
    Y = np.random.random((1000,1))
    
    model.fit(X,Y)
    

    我已经测试了上面代码的运行,但没有测试约束的有效性。您可以通过在使用model.get_weights()model.layers[idx].get_weights() 进行训练后获取模型权重并检查其是否遵守约束来实现。

    注意:约束并没有添加到所有模型权重.. 只是添加到其使用的特定层的权重,W_constraint 将约束添加到 W 参数和 b_constraint 到 b(偏差)参数

    【讨论】:

    • 感谢您的回复。我已经在 y=ax+b 的一个玩具问题上试过了,效果很好!
    • 用Tensorflow实现时出现问题。使用 model.fit 时,它工作得很好,但是当使用 sess.run(tran_step,...) 和 TF 命令时,约束似乎不起作用。关于如何解决它的任何想法?
    • 您可能正在使用来自 tensorflow 的优化器对象。 keras 约束应用在 Keras 中实现的优化器类中。例如对于 SGD,以下是应用的约束:github.com/fchollet/keras/blob/master/keras/…。所以你需要使用 keras 优化器来获取 train_step。 tran_step = model.optimizer.get_updates(model.trainable_weights, model.constraints, model.total_loss)。否则你可以使用model.train_on_batch(),它会像sess.run(tran_step,...)一样处理所有的keras内部和训练,就像sess.run(tran_step,...)
    • 知道了。谢谢你。我会尝试使用第一个解决方案。我使用 TF 和 Keras API 而不是直接使用 Kears 的原因是我试图避免使用模型,因此我可以在未来向网络添加一些复杂的架构(如 PixelCNN 中的 GatedCNN)。顺便说一句,keraslayers.W.name 似乎可以返回权重变量的名称。但是我仍然无法将剪辑应用于Convolution2D 层,因为 TF 报告未明确给出权重变量的形状。
    • 祝你好运。如果您有其他疑问,请提出新问题。如果有帮助,请采纳答案。
    猜你喜欢
    • 2019-06-18
    • 2021-02-21
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多