张量流对稀疏变量做渐变

时间:2016-12-15 04:30:37

标签: tensorflow sparse-matrix

我正在尝试在张量流中训练稀疏变量,据我所知,当前张量流不允许稀疏变量。

我找到了两个讨论类似问题的主题:enter image description hereusing-sparsetensor-as-a-trainable-variable。我不太明白答案,如果有任何示例代码

会很好

我尝试过的一种方法是:

# initialize the sparse variable sp_weights
# assuming w_s is the input sparse matrix contains indices information
dim=20
identity = tf.constant(np.identity(dim), dtype=tf.float32)
A=tf.sparse_tensor_dense_matmul(w_s, identity)  # convert w_s to dense
w_init = tf.random_normal([dim, dim], mean=0.0, stddev=0.1) 
w_tensor = tf.mul(A, w_init) # random initialize sparse tensor
vars['sp_weights'] = tf.Variable(w_tensor)

# doing some operations...

根据使用tf.IndexedSlices

update-only-part-of-the-word-embedding-matrix-in-tensorflow计算渐变
grad = opt.compute_gradients(loss)
train_op = opt.apply_gradients(
    [tf.IndexedSlices(grad, indices)]) # indices is extracted from w_s

上面的代码当然不起作用,我在这里很困惑。 tf.IndexedSlices使输入成为IndexedSlices实例,如何使用它来更新给定索引的渐变?此外,许多人提到使用tf.scatter_add / sub / update。官方文档不包含有关如何使用以及在何处使用渐变更新的示例代码。我应该使用tf.IndexedSlices还是tf.scatter?如果有任何示例代码,将会非常有用。谢谢!

1 个答案:

答案 0 :(得分:1)

我不熟悉IndexedSlices或稀疏变量,但我收集的是您尝试仅对某些变量切片应用渐变更新。如果这就是您正在做的事情,那么有一个简单的解决方法:使用

提取变量的副本
weights_copy = tf.Variable(weights_var.initialized_value()) # Copies the current value

,然后对整个变量应用渐变更新,然后使用tf.scatter()合并两者,将原始/更新的部分合并到任何地方。