我正在尝试将输入图层拆分为不同大小的部分。我正在尝试使用tf.slice来做到这一点,但它无法正常工作。
一些示例代码:
import tensorflow as tf
import numpy as np
ph = tf.placeholder(shape=[None,3], dtype=tf.int32)
x = tf.slice(ph, [0, 0], [3, 2])
input_ = np.array([[1,2,3],
[3,4,5],
[5,6,7]])
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print sess.run(x, feed_dict={ph: input_})
输出:
[[1 2]
[3 4]
[5 6]]
这很有用,大致是我想要发生的事情,但我必须指定第一个维度(在这种情况下为3
)。我不知道我输入了多少向量,这就是为什么我首先使用placeholder
None
的原因!
是否有可能以这样的方式使用slice
,直到运行时维度未知时它才会起作用?
我尝试使用placeholder
ph.get_shape()[0]
,其价值来自x = tf.slice(ph, [0, 0], [num_input, 2])
,如此:gcc
。但这也不起作用。
答案 0 :(得分:16)
您可以在size
的{{1}}参数中指定一个负维度。负维度告诉Tensorflow根据其他维度决定动态确定正确的值。
tf.slice
答案 1 :(得分:2)
对我来说,我尝试了另一个例子来让我理解切片功能
input = [
[[11, 12, 13], [14, 15, 16]],
[[21, 22, 23], [24, 25, 26]],
[[31, 32, 33], [34, 35, 36]],
[[41, 42, 43], [44, 45, 46]],
[[51, 52, 53], [54, 55, 56]],
]
s1 = tf.slice(input, [1, 0, 0], [1, 1, 3])
s2 = tf.slice(input, [2, 0, 0], [3, 1, 2])
s3 = tf.slice(input, [0, 0, 1], [4, 1, 1])
s4 = tf.slice(input, [0, 0, 1], [1, 0, 1])
s5 = tf.slice(input, [2, 0, 2], [-1, -1, -1]) # negative value means the function cutting tersors automatically
tf.global_variables_initializer()
with tf.Session() as s:
print s.run(s1)
print s.run(s2)
print s.run(s3)
print s.run(s4)
输出:
[[[21 22 23]]]
[[[31 32]]
[[41 42]]
[[51 52]]]
[[[12]]
[[22]]
[[32]]
[[42]]]
[]
[[[33]
[36]]
[[43]
[46]]
[[53]
[56]]]
参数begin表示您要开始剪切的元素。 size参数表示您在该维度上需要多少元素。
答案 2 :(得分:0)
你也可以尝试这个
x = tf.slice(ph, [0,0], [3, 2])
因为你的起点是(0,0)
,所以第二个参数是[0,0]
。
你想要切三个原始列和两个列,所以你的第三个参数是[3,2]
。
这将为您提供所需的输出。