在TensorFlow中实现重量约束的最佳方法是什么?
tensorflow
3
0

假设我们有权重

x = tf.Variable(np.random.random((5,10)))
cost = ...

我们使用GD优化器:

upds = tf.train.GradientDescentOptimizer(lr).minimize(cost)
session.run(upds)

我们如何实现例如权重的非负性?

我试着剪掉它们:

upds = tf.train.GradientDescentOptimizer(lr).minimize(cost)
session.run(upds)
session.run(tf.assign(x, tf.clip_by_value(x, 0, np.infty)))

但是,这会使我的训练速度降低了50倍。

有人知道在TensorFlow中对权重实施此类约束的好方法吗?

PS:在等效的Theano算法中,

T.clip(x, 0, np.infty)

它运行顺利。

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

您可以采用拉格朗日方法,只需对不需要的变量的特征添加惩罚。

例如,为了鼓励 theta为非负数,可以在优化器的目标函数中添加以下内容。

    added_loss = -tf.minimum( tf.reduce_min(theta),0)

如果任何theta为负,则add2loss将为正,否则为零。将其缩放到有意义的值留给读者练习。缩放太小将不会施加足够的压力。太多可能会使事情变得不稳定。

收藏
评论

从TensorFlow 1.4开始, tf.get_variable有一个新参数 ,该参数允许传递在优化程序更新后应用的约束函数。这是强制实施非负约束的示例:

with tf.variable_scope("MyScope"):
  v1 = tf.get_variable("v1", …, constraint=lambda x: tf.clip_by_value(x, 0, np.infty))

约束:由Optimizer更新后将应用于变量的可选投影函数(例如,用于实现范数约束或图层权重的值约束)。该函数必须将代表变量值的未投影张量作为输入,并返回投影值的张量(必须具有相同的形状)。在进行异步分布式训练时,使用约束并不安全。

收藏
评论

我最近也有这个问题。我发现您可以导入具有良好权重约束功能的keras,因为可以直接在tensorflow的kernen约束中使用它们。这是我的代码示例。您可以使用内核正则化器执行类似的操作

from keras.constraints import non_neg

conv1 = tf.layers.conv2d(
    inputs=features['x'],
    filters=32,
    kernel_size=[5,5],
    strides = 2,
    padding='valid',
    activation=tf.nn.relu,
    kernel_regularizer=None,
    kernel_constraint=non_neg(),
    use_bias=False)
收藏
评论

通过运行

sess.run(tf.assign(x, tf.clip_by_value(x, 0, np.infty)))

您一直在向图添加节点,并使它变得越来越慢。

实际上,您可能仅在构建图形时定义了一个clip_op ,并在每次更新权重之后每次都运行它:

# build the graph
x = tf.Variable(np.random.random((5,10)))
loss = ...
train_op = tf.train.GradientDescentOptimizer(lr).minimize(loss)
clip_op = tf.assign(x, tf.clip(x, 0, np.infty))

# train
sess.run(train_op)
sess.run(clip_op)
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号