您可以采用拉格朗日方法,只需对不需要的变量的特征添加惩罚。
例如,为了鼓励 theta
为非负数,可以在优化器的目标函数中添加以下内容。
added_loss = -tf.minimum( tf.reduce_min(theta),0)
如果任何theta
为负,则add2loss将为正,否则为零。将其缩放到有意义的值留给读者练习。缩放太小将不会施加足够的压力。太多可能会使事情变得不稳定。
0
您可以采用拉格朗日方法,只需对不需要的变量的特征添加惩罚。
例如,为了鼓励 theta
为非负数,可以在优化器的目标函数中添加以下内容。
added_loss = -tf.minimum( tf.reduce_min(theta),0)
如果任何theta
为负,则add2loss将为正,否则为零。将其缩放到有意义的值留给读者练习。缩放太小将不会施加足够的压力。太多可能会使事情变得不稳定。
0
从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
更新后将应用于变量的可选投影函数(例如,用于实现范数约束或图层权重的值约束)。该函数必须将代表变量值的未投影张量作为输入,并返回投影值的张量(必须具有相同的形状)。在进行异步分布式训练时,使用约束并不安全。
0
我最近也有这个问题。我发现您可以导入具有良好权重约束功能的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)
0
通过运行
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)
0
假设我们有权重
我们使用GD优化器:
我们如何实现例如权重的非负性?
我试着剪掉它们:
但是,这会使我的训练速度降低了50倍。
有人知道在TensorFlow中对权重实施此类约束的好方法吗?
PS:在等效的Theano算法中,
它运行顺利。