Python 更新TensorFlow中的权重子集

Python 更新TensorFlow中的权重子集,python,machine-learning,tensorflow,Python,Machine Learning,Tensorflow,是否有人知道如何更新前向传播中使用的权重子集(即仅某些索引) 我的猜测是,在应用compute_梯度后,我可能可以这样做,如下所示: optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate) grads_vars = optimizer.compute_gradients(loss, var_list=[weights, bias_h, bias_v]) …然后对grads\u vars中的元组列表执行

是否有人知道如何更新前向传播中使用的权重子集(即仅某些索引)

我的猜测是,在应用compute_梯度后,我可能可以这样做,如下所示:

optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
grads_vars = optimizer.compute_gradients(loss, var_list=[weights, bias_h, bias_v])

…然后对
grads\u vars

中的元组列表执行一些操作。您可以使用
聚集
分散更新
的组合。下面是一个将位置
0
2

indices = tf.constant([0,2])
data = tf.Variable([1,2,3])
data_subset = tf.gather(data, indices)
updated_data_subset = 2*data_subset
sparse_update = tf.scatter_update(data, indices, updated_data_subset)
init_op = tf.initialize_all_variables()

sess = tf.Session()
sess.run([init_op])
print "Values before:", sess.run([data])
sess.run([sparse_update])
print "Values after:", sess.run([data])
你应该看到

Values before: [array([1, 2, 3], dtype=int32)]
Values after: [array([2, 2, 6], dtype=int32)]

最简单的方法是使用
npvar=sess.run(tfvar)
tf.Variable
拉入python(作为一个numpy数组),然后对其执行一些操作,例如
npvar[1,2]=-10
。然后可以使用
sess.run(tfvar.assign(npvar))
将修改后的数据上传回tensorflow


显然,这是非常缓慢的,对于训练来说并不是很有用,但它确实有效。

谢谢,我可以用1D张量。二维矩阵(在我的例子中是权重)怎么样?重塑为一维向量,计算线性指数,重塑回矩阵如果我做
data=tf.Variable([[1,2,3],[4,5,6]])data=tf.reforme(data,[-1])
我得到
类型错误:'ScatterUpdate'Op的输入'ref'需要l值输入
Hm…很好。解决方法之一是将变量保持为一维向量,并在需要时将其作为矩阵应用重塑真的很棒!也许这种方法会稍微慢一点,但如果不在训练循环中使用,而只是在一开始,在权重矩阵的子部分上形成自定义值,那么这是一种非常有效和简单的初始化方法。