Python tf.slice和tf.stripped_切片

Python tf.slice和tf.stripped_切片,python,tensorflow,nlp,Python,Tensorflow,Nlp,试图理解tensorflow在一个又一个层面上大步前进 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:

试图理解tensorflow在一个又一个层面上大步前进

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.shape------------------
[3 2 3]
切片------------------------
[[[211 212 213]]
[[311 312 313]]]
跨步切片------------------------
[[[211 212 213]]]
[[[221 222 223]
[211 212 213]]]
221
ValueError:维度1的切片索引-1超出范围。对于输入形状为[3,2,3]、[3]、[3]、[3]、[3]、[3]且具有计算输入张量的“步态切面”(op:“步态切面”),输入[1]=,输入[2]=,输入[3]=。
对于tf.slice,我理解我们必须在每个维度中提到切片大小,因此超出范围的值是有意义的。但在跨步切片中,末端是张量索引,在张量本身中,怎么出来的大小值是有效的

例子取自

尝试从纸上实现折叠层部分

到目前为止,在网络的构造中,特征检测器应用于 句子矩阵s的一行可以有许多顺序和顺序 在多个要素中的相同行之间创建复杂的依赖关系 地图。然而,不同行中的特征检测器独立于 相互连接,直到顶部完全连接层。完全依赖 通过使等式5中的M为满,可以实现不同行之间的距离 矩阵,而不是对角线的稀疏矩阵。在这里,我们探索一个 称为折叠的更简单方法,不引入任何额外的 参数。在卷积层之后和(动态)k-max之前 池,在要素映射组件方面,每两行仅求和一次。 对于d行的映射,折叠返回d/2行的映射,从而减半 表示的大小。具有折叠层,是一种特征 第i阶检测器现在取决于两行特征值 在i阶的下映射中− 1.这就结束了对问题的描述 DCNN


产生的ValueError与对Strated_Slice的前2次调用无关。您在中使用的跨步_切片操作是正确的

打印(sess.run(tf.stripped_切片(x[1,0,0],[2,1,3],[1,1,1]))

打印(sess.run(tf.stripped_切片(x[1,-1,0],[2,-3,3],[1,-1,1]))

你的问题是打电话给

打印(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中的跨步切片、切片和数组索引的链接:


使用tf.split和tf.reduce_sum来实现两行之和,但我关于tf.stradded_切片的问题仍然有效。