Python 如何限制TensorFlow中的权值不改变符号?

Python 如何限制TensorFlow中的权值不改变符号?,python,tensorflow,Python,Tensorflow,我看过几篇关于向TensorFlow权重变量添加简单约束(即非负性)的文章,但没有一篇是关于如何防止权重改变符号的。例如,如果我有 W=tf.get_变量('W1',[512,256],初始值设定项=初始值设定项,dtype=tf.float32) 如何添加一个约束,使初始化后W[I,j]无法更改符号?在tf.get_variable()中,我看不到使用“constraint”选项的明确方法 我解决这个问题的方法如下 对于每个重量,存储初始标志。这可以使用以下代码完成 w1 = tf.get_v

我看过几篇关于向TensorFlow权重变量添加简单约束(即非负性)的文章,但没有一篇是关于如何防止权重改变符号的。例如,如果我有
W=tf.get_变量('W1',[512,256],初始值设定项=初始值设定项,dtype=tf.float32)

如何添加一个约束,使初始化后
W[I,j]
无法更改符号?在tf.get_variable()中,我看不到使用“constraint”选项的明确方法

我解决这个问题的方法如下

对于每个重量,存储初始标志。这可以使用以下代码完成

w1 = tf.get_variable('W1', [512, 256], initializer=initializer, dtype=tf.float32)
w1_sign = tf.zeros_like(w1)
store_sign = tf.assign(w1_sign, tf.sign(w1))
当权重打破符号约束时,可以使用以下代码使权重为0

constraint_op = tf.assign(w1, tf.where(w1_sign * w1 >= 0, w1, 0))
现在可以按如下方式运行上述代码

sess = tf.Session()
sess.run(tf.global_variables_initializer())
sess.run(store_sign)
for _ in range(train_itr):
    sess.run(some_train_op)
    sess.run(constraint_op)
请注意,在上述代码中,您仅运行一次op
store\u sign
,并且在每次运行
train\u op
之后运行op
constraint\u op


同样的思想也可以应用于
tf.get\u变量
约束
参数

我想知道在什么样的情况下,这可能是一个有用的约束。如果你能在你的问题中加入这一点,这将对社区有所帮助。