【问题标题】:Update a subset of weights in TensorFlow更新 TensorFlow 中的权重子集
【发布时间】:2016-01-21 22:20:28
【问题描述】:

有谁知道如何更新前向传播中使用的权重子集(即仅一些索引)?

我的猜测是,在应用 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 中的元组列表做一些事情。

【问题讨论】:

    标签: python machine-learning tensorflow


    【解决方案1】:

    您可以使用gatherscatter_update 的组合。这是一个将位置 02 的值加倍的示例

    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)]
    

    【讨论】:

    • 谢谢,我可以将它与一维张量一起使用。那么二维矩阵(在我的例子中是权重)呢?
    • 整形为一维向量,计算线性索引,整形回矩阵
    • 如果我这样做 data = tf.Variable([[1,2,3],[4,5,6]]) data = tf.reshape(data, [-1]) 我会得到 TypeError: Input 'ref' of 'ScatterUpdate' Op requires l-value input
    • 嗯...好点。一种解决方法是将变量保留为一维向量,并在需要时将其应用为矩阵
    【解决方案2】:

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

    显然这很慢,而且对训练没有真正的用处,但它确实有效。

    【讨论】:

    • 真的很棒!也许这种方式会慢一点,但如果不是在训练循环中使用,而只是在开始时,在权重矩阵的子部分上塑造自定义值,这是一种非常有效且简单的初始化方法。
    【解决方案3】:
    # 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)
    

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 2017-09-08
      • 2017-07-15
      相关资源
      最近更新 更多