I am confused about the follow code:
import tensorflow as tf
import numpy as np
from tensorflow.python.framework import ops
from tensorflow.python.ops import array_ops
from tensorflow.python.ops import control_flow_ops
from tensorflow.python.ops import math_ops
from tensorflow.python.framework import dtypes
'''
Randomly crop a tensor, then return the crop position
'''
def random_crop(value, size, seed=None, name=None):
with ops.name_scope(name, "random_crop", [value, size]) as name:
value = ops.convert_to_tensor(value, name="value")
size = ops.convert_to_tensor(size, dtype=dtypes.int32, name="size")
shape = array_ops.shape(value)
check = control_flow_ops.Assert(
math_ops.reduce_all(shape >= size),
["Need value.shape >= size, got ", shape, size],
summarize=1000)
shape = control_flow_ops.with_dependencies([check], shape)
limit = shape - size + 1
begin = tf.random_uniform(
array_ops.shape(shape),
dtype=size.dtype,
maxval=size.dtype.max,
seed=seed) % limit
return tf.slice(value, begin=begin, size=size, name=name), begin
sess = tf.InteractiveSession()
size = [10]
a = tf.constant(np.arange(0, 100, 1))
print (a.eval())
a_crop, begin = random_crop(a, size = size, seed = 0)
print ("offset: {}".format(begin.eval()))
print ("a_crop: {}".format(a_crop.eval()))
a_slice = tf.slice(a, begin=begin, size=size)
print ("a_slice: {}".format(a_slice.eval()))
assert (tf.reduce_all(tf.equal(a_crop, a_slice)).eval() == True)
sess.close()
outputs:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99] offset: [46] a_crop: [89 90 91 92 93 94 95 96 97 98] a_slice: [27 28 29 30 31 32 33 34 35 36]
There are two tf.slice options:
(1). called in function random_crop, such as tf.slice(value, begin=begin, size=size, name=name)
(2). called as a_slice = tf.slice(a, begin=begin, size=size)
The parameters (values, begin and size) of those two slice operations are the same.
However, why the printed values a_crop and a_slice are different and tf.reduce_all(tf.equal(a_crop, a_slice)).eval() is True?
Thanks
EDIT1
Thanks @xdurch0, I understand the first question now.
Tensorflow random_uniform seems like a random generator.
import tensorflow as tf
import numpy as np
sess = tf.InteractiveSession()
size = [10]
np_begin = np.random.randint(0, 50, size=1)
tf_begin = tf.random_uniform(shape = [1], minval=0, maxval=50, dtype=tf.int32, seed = 0)
a = tf.constant(np.arange(0, 100, 1))
a_slice = tf.slice(a, np_begin, size = size)
print ("a_slice: {}".format(a_slice.eval()))
a_slice = tf.slice(a, np_begin, size = size)
print ("a_slice: {}".format(a_slice.eval()))
a_slice = tf.slice(a, tf_begin, size = size)
print ("a_slice: {}".format(a_slice.eval()))
a_slice = tf.slice(a, tf_begin, size = size)
print ("a_slice: {}".format(a_slice.eval()))
sess.close()
output
a_slice: [42 43 44 45 46 47 48 49 50 51] a_slice: [42 43 44 45 46 47 48 49 50 51] a_slice: [41 42 43 44 45 46 47 48 49 50] a_slice: [29 30 31 32 33 34 35 36 37 38]
tf.random_uniformreturns different values each time it is evaluated, so comparing things based on different evaluations of these random values is not sensible. - xdurch0A tensor of the specified shape filled with random uniform values.(tensorflow.org/api_docs/python/tf/random_uniform). But, it sounds like arandom generatorfor me now, notvalues.. But why `tf.reduce_all(tf.equal(a_crop, a_slice)).eval() is True? Thanks, - user200340runoreval. So evaluating thetf.equal(...)operation works because only one random value is generated and both slices are computed from it. If you use thetf.Sessionobject and callrun((a_crop, a_slice, tf.reduce_all(tf.equal(a_crop, a_slice)))you receive two equal arrays andTrue. - jdehesaSo evaluating the tf.equal(...) operation works because only one random value is generated and both slices are computed from it.Then why the printed out values are different betweena_cropanda_sliceifonly one random value is generated and both slices are computed from it? Thanks - user200340tf.Session.run, or.eval()). Whenever you call.eval(), that is one new computation, and a new random value is produced. Maybe you can see it more clearly like this, if you dotf.stack([a_crop, a_slice]).eval()you will get a tensor with to equal rows. If you calltf.Session.runwith multiple tensors, all the computations in that call will use the same random values. Does that make it any clearer? - jdehesa