试图理解tensorflow strided_slice和slice
x = tf.constant(np.array( [[[111, 112, 113], [121, 122, 123]],
[[211, 212, 213], [221, 222, 223]],
[[311, 312, 313], [321, 322, 323]]]))
with tf.Session() as sess:
print("tf.shape ------------------")
print(sess.run(tf.shape(x)))
print("tf.slice ------------------------")
print(sess.run((tf.slice(x, [1, 0, 0], [2, 1, 3]) )))
print("tf.strided_slice ------------------------")
print(sess.run(tf.strided_slice(x, [1, 0, 0], [2, 1, 3], [1, 1, 1])))
print(sess.run(tf.strided_slice(x, [1, -1, 0], [2, -3, 3], [1, -1, 1])))
print(sess.run(x[1,-1,0]))
print(sess.run(x[2,-3,3]))
输出
tf.shape ------------------
[3 2 3]
tf.slice ------------------------
[[[211 212 213]]
[[311 312 313]]]
tf.strided_slice ------------------------
[[[211 212 213]]]
[[[221 222 223]
[211 212 213]]]
221
ValueError: slice index -1 of dimension 1 out of bounds. for 'strided_slice_8' (op: 'StridedSlice') with input shapes: [3,2,3], [3], [3], [3] and with computed input tensors: input[1] = <2 -3 3>, input[2] = <3 -2 4>, input[3] = <1 1 1>.
对于tf.slice我明白我们必须提到每个维度中的切片大小,因此超出范围值是有意义的。但是在strided slice中,末尾是张量本身的张量指数,超出值的大小是有效的。
示例取自 https://www.tensorflow.org/api_docs/python/tf/strided_slice
尝试从纸张A Convolutional Neural Network for Modelling Sentences
实施折叠图层部分到目前为止,在网络的配方中,应用了特征检测器 句子矩阵s的单个行可以有许多顺序和 在多个要素中的相同行中创建复杂的依赖关系 地图。然而,不同行中的特征检测器是独立的 彼此直到顶部完全连接的层。完全依赖 在Eq中可以实现不同行之间的行。 5满了 矩阵而不是稀疏的对角线矩阵。在这里我们探索一个 称为折叠的简单方法,不引入任何额外的 参数。在卷积层之后和之前(动态)k-max pooling,只是在一个特征映射中按行分组。 对于d行的地图,折叠返回d / 2行的地图,从而减半 表示的大小。具有折叠层,功能 i阶的检测器现在依赖于两行特征值 在顺序i - 1的较低地图中。这结束了对的描述 DCNN。
答案 0 :(得分:1)
产生的ValueError与对Strided_Slice的前两个调用没有任何关系。您在
中正确使用了Strided_Slice操作print(sess.run(tf.strided_slice(x,[1,0,0],[2,1,3],[1,1,1])))
print(sess.run(tf.strided_slice(x,[1,-1,0],[2,-3,3],[1,-1,1])))
您的问题在于致电
print(sess.run(x [2,-3,3]))
python数组中的负索引反向遍历该数组。
例如,给定这样的数组
arr = ['a', 'b', 'c', 'd', 'e', 'f']
调用arr [-1]将产生'f'。同样,对arr [-4]的调用将产生'c'。如果我们尝试致电arr [-7],会发生什么?这将试图访问索引-1,这将引发错误。
请记住,Python中的数组具有基于0的索引。您对x [ 2 ,-3,3]的调用最初将访问外部数组中索引2(第3个元素)处的元素,即
[[311, 312, 313], [321, 322, 323]]
现在,在此外部数组中,有2个元素。但是,您的调用x [2, -3 ,3]尝试从数组末尾进行迭代时访问索引-1处的元素。这就是产生错误的原因
第1维维度的切片索引-1
注意:您尝试在x [2,-3, 3 ]中访问的最后一个索引也会产生ValueError,因为它试图访问的索引不是在数组中。要解决此问题,您的呼叫可能是x [2,-2,2]。
以下是有关Python中Strided Slicing,Slicing和数组索引的一些链接: https://www.tensorflow.org/api_docs/python/tf/strided_slice