有谁知道如何更新前向传播中使用的权重的子集(即只有一些索引)?
我的猜测是,我可以在应用compute_gradients之后执行此操作,如下所示:
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
grads_vars = optimizer.compute_gradients(loss, var_list=[weights, bias_h, bias_v])
...然后使用grads_vars
中的元组列表执行某些操作。
答案 0 :(得分:9)
您可以使用gather
和scatter_update
的组合。这是一个将位置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)]
答案 1 :(得分:1)
最简单的方法是使用tf.Variable
将npvar = sess.run(tfvar)
拉入python(作为numpy数组),然后对其执行某些操作,例如npvar[1, 2] = -10
。然后,您可以使用sess.run(tfvar.assign(npvar))
将修改后的数据上传回tensorflow。
显然这很慢,对培训没有用,但确实有效。
答案 2 :(得分:0)
# in TF2.0 you can solve with "tensor_scatter_nd_update"
# for example:
tensor = [0, 0, 0, 0, 0, 0, 0, 0] # tf.rank(tensor) == 1
indices = [[1], [3], [4], [7]] # num_updates == 4, index_depth == 1
updates = [9, 10, 11, 12] # num_updates == 4
print(tf.tensor_scatter_nd_update(tensor, indices, updates))
# tf.Tensor([ 0 9 0 10 11 0 0 12], shape=(8,), dtype=int32)