gpt4 book ai didi

python - TensorFlow strided_slice 不会在整个范围内向后迭代

转载 作者:行者123 更新时间:2023-12-01 07:56:51 25 4
gpt4 key购买 nike

我有以下测试。我想反转行,最后一行是第一行,依此类推。

    x_val = np.arange(3 * 2 * 3).astype(np.int64).reshape((3, 2, 3))
print(x_val)
x = tf.placeholder(tf.float32, x_val.shape, name='input')
x_ = tf.strided_slice(x, [3], [0], [-1])
_ = tf.identity(x_, name='output')
with tf.Session() as sess:
variables_lib.global_variables_initializer().run()
output_dict = []
for out_name in ['output:0']:
output_dict.append(sess.graph.get_tensor_by_name(out_name))
expected = sess.run(output_dict, feed_dict={"input:0": x_val})
print('test_strided_slice1', expected[0].shape, expected[0])

我期望我的输出是:

[
[
[12. 13. 14.]
[15. 16. 17.]
]
[
[ 6. 7. 8.]
[ 9. 10. 11.]
]
[
[ 0 1 2]
[ 3 4 5]
]
]

但是我得到:

[
[
[12. 13. 14.]
[15. 16. 17.]
]
[
[ 6. 7. 8.]
[ 9. 10. 11.]
]
]

正如您所看到的,现在应该是最后一行的第一行被错过了。

如果我像 0:3:1 那样逐步执行,我会得到所有行。但如果我反过来,我就会少一个。

不提供“结束”索引会导致测试失败。将“end”设置为 -1 也会导致输出为空。

关于如何完成这项工作有什么建议吗?

最佳答案

大多数情况下,使用 tf.strided_slice 更为方便通过Python索引语法,所以你可以这样做:

x_ = x[::-1]

但是,可以使用 tf.strided_slice 执行您想要的操作直接地。为此,您需要使用 end_mask 参数。在此整数值中,如果设置了第 i 位(从最低有效位开始),则忽略第 i 维对应的 end 值,并尽可能采取切片。所以你可以这样做:

x_ = tf.strided_slice(x, [3], [0], [-1], end_mask=1)

注意,我已将 begin 中的 4 更改为 3,因为这是切片开始处的实际索引(尽管它确实也可与 4 一起使用)。如果您只想从末尾到开头进行切片,也可以使用 start_mask,其工作方式与 end_mask 类似:

x_ = tf.strided_slice(x, [0], [0], [-1], start_mask=1, end_mask=1)

一个小例子:

import tensorflow as tf

with tf.Graph().as_default():
x = tf.reshape(tf.range(18), [3, 2, 3])
x_ = tf.strided_slice(x, [0], [0], [-1], start_mask=1, end_mask=1)
with tf.Session() as sess:
print(sess.run(x_))

输出:

[[[12 13 14]
[15 16 17]]

[[ 6 7 8]
[ 9 10 11]]

[[ 0 1 2]
[ 3 4 5]]]

关于python - TensorFlow strided_slice 不会在整个范围内向后迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55929708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com