Nimitz14
Nimitz14

Reputation: 2328

Tensorflow: Using tf.slice to split the input

I'm trying to split my input layer into different sized parts. I'm trying to use tf.slice to do that but it's not working.

Some sample code:

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_})

Output:

[[1 2]
 [3 4]
 [5 6]]

This works and is roughly what I want to happen, but I have to specify the first dimension (3 in this case). I can't know though how many vectors I'll be inputting, that's why I'm using a placeholder with None in the first place!

Is it possible to use slice in such a way that it will work when a dimension is unknown until runtime?

I've tried using a placeholder that takes its value from ph.get_shape()[0] like so: x = tf.slice(ph, [0, 0], [num_input, 2]). but that didn't work either.

Upvotes: 13

Views: 31119

Answers (3)

USS
USS

Reputation: 470

You can also try out this one

x = tf.slice(ph, [0,0], [3, 2])

As your starting point is (0,0) second argument is [0,0]. You want to slice three raw and two column so your third argument is [3,2].

This will give you desired output.

Upvotes: 1

nessuno
nessuno

Reputation: 27042

You can specify one negative dimension in the size parameter of tf.slice. The negative dimension tells Tensorflow to dynamically determine the right value basing its decision on the other dimensions.

import tensorflow as tf
import numpy as np

ph = tf.placeholder(shape=[None,3], dtype=tf.int32)

# look the -1 in the first position
x = tf.slice(ph, [0, 0], [-1, 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_}))

Upvotes: 24

r0n9
r0n9

Reputation: 2729

For me, I tried another example to let me understand the slice function

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)

It outputs:

[[[21 22 23]]]

[[[31 32]]
 [[41 42]]
 [[51 52]]]

[[[12]]
 [[22]]
 [[32]]
 [[42]]]

[]

[[[33]
  [36]]
 [[43]
  [46]]
 [[53]
  [56]]]

The parameter begin indicates which element you are going to start to cut. The size parameter means how many element you want on that dimension.

Upvotes: 5

Related Questions