tf.slice和tf.strided_slice

时间:2017-08-26 22:39:57

标签: python tensorflow nlp

试图理解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。

1 个答案:

答案 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

https://www.tensorflow.org/api_docs/python/tf/slice

Negative list index?