Skip to main content
 首页 » 编程设计

python之更新 tensorflow 中的张量切片

2024年12月31日31Free-Thinker

我想更新 3 维张量的一部分。正在关注How to do slice assignment in Tensorflow我会做类似的事情

import tensorflow as tf 
 
with tf.Session() as sess: 
    init_val = tf.Variable(tf.zeros((2, 3, 3))) 
    indices = tf.constant([[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1]]) 
    update = tf.scatter_nd_add(init_val, indices, tf.ones(4)) 
 
    init = tf.global_variables_initializer() 
    sess.run(init) 
    print(sess.run(update)) 

这行得通,但由于我的实际问题更复杂,我想通过定义切片的开始和大小以某种方式自动生成索引集,例如,如果您使用 tf.slice(. ..)。你有什么想法?提前致谢!

我使用的是 TensorFlow 1.12,这是目前最新的版本。

请您参考如下方法:

tf.strided_slice支持传递一个 var 参数来指示切片引用的变量,所以当你传递它时它会返回一个可分配的对象(我不确定为什么他们不只是根据类型这样做输入的,但无论如何)。你可以这样做:

import tensorflow as tf 
import numpy as np 
 
var = tf.Variable(np.ones((3, 4), dtype=np.float32)) 
s = tf.strided_slice(var, [0, 2], [2, 3], var=var, name='var_slice') 
s2 = s.assign([[2], [3]]) 
init_op = tf.global_variables_initializer() 
with tf.Session() as sess: 
    sess.run(init_op) 
    print(sess.run(s2)) 

输出:

[[1. 1. 2. 1.] 
 [1. 1. 3. 1.] 
 [1. 1. 1. 1.]] 

请注意,在 tf.strided_slice 中您给出开始和结束索引(不包括结束),这与 tf.slice 不同。 ,你在哪里给开始和大小。此外,就目前的代码而言,您必须为切片或分配操作提供一个名称值(我认为这应该是一个错误并且会发生,因为 API 的那部分几乎只在内部使用)。