TensorFlow: Basic Exercises

Note: 以下绝大部分内容来自 Kyubyong 的GitHub

**-

Part 1:Constants, Sequences, and Random Values

import numpy as np
from scipy import misc
import tensorflow as tf
import matplotlib.pyplot as plt

sess = tf.InteractiveSession()
"""
Ex1. Create a tensor of the shape [2, 3] with all elements set to zero.
"""
X = tf.zeros([2,3])
print (X.eval())

"""
Ex2. Let x be a tensor of [[1,2,3], [4,5,6]]. 
     Create a tensor of the same shape and dtype as x with all elements set to zero.
"""
x = tf.convert_to_tensor(np.array([[1,2,3],[4,5,6]]))
# x = tf.constant([[1,2,3],[4,5,6]])
X = tf.zeros_like(x)
print (X.eval())

"""
Ex3. Create a tensor of the shape [3, 2], with all elements of 5.
"""
out1 = tf.ones([3,2])*5
out2 = tf.fill([3,2],5)
print (out1.eval())
print (out2.eval())

"""
Ex4. Create a constant tensor of [[1, 3, 5], [4, 6, 8]].
"""
out = tf.constant([[1,3,5],[4,6,8]])
print (out.eval())

"""
Ex5. Create a constant tensor of the shape [2, 3], with all elements set to 4.
"""
out = tf.constant(4, shape=[2,3])
print (out.eval())

"""
Ex6. Create a 1-D tensor of 50 evenly spaced elements between 5 and 10 inclusive.
"""
out = tf.linspace(5.0,10.0,50)
print (out.eval())

"""
Ex7. Create a tensor which looks like [10, 12, 14, 16, ..., 100].
"""
out = tf.range(10, limit=102, delta=2)          # [10, 102)
print (out.eval())    

"""
Ex8. Create a random tensor of the shape [3, 2], with elements from a normal distribution of mean=0, standard deviation=2.
"""
out = tf.random_normal([3,2], mean=0, stddev=2)
print (out.eval())

"""
Ex9. Create a random tensor of the shape [3, 2], with all elements from a uniform distribution that ranges from 0 to 2 (exclusive).
"""
out = tf.random_uniform([3,2], minval=0, maxval=2)      # [minval, maxval)
print (out.eval())

"""
Ex10. Let x be a tensor of [[1, 2], [3, 4], [5, 6]]. Shuffle x along its first dimension.
"""
x = tf.constant([[1,2],[3,4],[5,6]])
out = tf.random_shuffle(x)
print (x.eval())
print (out.eval())

"""
Ex11. Let x be a random tensor of the shape [10, 10, 3], with elements from a unit normal distribution.
Crop x with the size of [5, 5, 3].
"""
x = tf.random_normal([10,10,3])
out = tf.random_crop(x, [5,5,3])
print (out.eval())

# An image example
img = misc.imread('cat.png')
im = tf.Variable(img)
im_ = tf.random_crop(im, [100,100,3])
init = tf.global_variables_initializer()
sess.run(init)
ims = im.eval()
ims_ = im_.eval()
plt.subplot(1,2,1)
plt.imshow(ims)
plt.subplot(1,2,2)
plt.imshow(ims_)
plt.show()
Randomly crop

Part 2:Control Flow

import numpy as np
import tensorflow as tf

"""
Ex1. Let x and y be random 0-D tensors. Return x + y if x < y and x - y otherwise.
"""
x = tf.random_uniform([])
y = tf.random_uniform([])
out = tf.cond(tf.less(x,y), lambda: tf.add(x,y), lambda: tf.sub(x,y))
print (out.eval())


"""
Ex2. Let x and y be 0-D int tensors randomly selected from 0 to 5. Return x + y if x < y, x - y elif x > y, 0 otherwise.
"""
x = tf.random_uniform([], minval=0, maxval=5, dtype=tf.int32)
y = tf.random_uniform([], minval=0, maxval=5, dtype=tf.int32)
out = tf.case({tf.less(x,y): lambda: tf.add(x,y), tf.greater(x,y): lambda: tf.sub(x,y)},
              default=lambda: tf.constant(0), exclusive=True)
print (out.eval())

# Alternative
x = np.random.randint(0, 5)
y = np.random.randint(0, 5)
out = np.select([x > y, x < y, x == y], [x + y, x - y, 0])
print (out)


"""
Ex3. Let x be a tensor [[-1, -2, -3], [0, 1, 2]] and y be a tensor of zeros with the same shape as x.
     Return a boolean tensor that yields Trues if x equals y element-wise.
"""
x = tf.constant([[-1,-2,-3], [0,1,2]])
y = tf.zeros_like(x)
out = tf.equal(x, y)
print (out.eval())


"""
Ex4. Let x be a tensor [[-1, -2, -3], [0, 1, 2]] and y be a tensor of zeros with the same shape as x.
     Return a boolean tensor that yields Trues if x does not equal y element-wise.
"""
x = tf.constant([[-1,-2,-3], [0,1,2]])
y = tf.zeros_like(x)
out = tf.not_equal(x, y)
print (out.eval())


"""
Ex5. Let x be a tensor [[-1, -2, -3], [0, 1, 2]] and y be a tensor of zeros with the same shape as x.
     Return a boolean tensor that yields Trues if x is greater than or equal to y element-wise.
"""
x = tf.constant([[-1,-2,-3], [0,1,2]])
y = tf.zeros_like(x)
out = tf.greater_equal(x, y)
print (out.eval())


"""
Ex6. Let x be a tensor [[-1, -2, -3], [0, 1, 2]] and y be a tensor of zeros with the same shape as x.
     Return a boolean tensor that yields Trues if x is less than or equal to y elementwise.
"""
x = tf.constant([[-1,-2,-3], [0,1,2]])
y = tf.zeros_like(x)
out = tf.less_equal(x, y)
print (out.eval())


"""
Ex7. Let x be a 0-D tensor randomly selected from -5 to 5. Return a boolean tensor that yields Trues if x
     is less than 3 and x is greater than 0.
"""
x = tf.random_uniform([], minval=-5, maxval=5)
out = tf.logical_and(x<3, x>0)
print (out.eval())


"""
Ex8. Let x be a tensor [[1, 2], [3, 4]], y be a tensor [[5, 6], [7, 8]], and z be a boolean tensor
     [[True, False], [False, True]]. Create a 2*2 tensor such that each element corresponds to x if True, otherise y.
"""
x = tf.constant([[1,2],[3,4]])
y = tf.constant([[5,6],[7,8]])
z = tf.constant([[True,False], [False,True]])
out = tf.select(z, x, y)
print (out.eval())


"""
Ex9. Let x be a tensor [1, 2, 3, ..., 100]. Extract elements of x greater than 30.
"""
x = tf.range(1, 101)
out = tf.gather_nd(x, tf.where(x>30))
print (out.eval())

Part 3:Math

import numpy as np
import tensorflow as tf

print (tf.__version__)      # 1.0.0

# ------  Arithmetic Operators  ------ #

"""
Ex1. Add x and y element-wise.
"""
x = tf.constant([1,2,3])
y = tf.constant([4,5,6])
out = tf.add(x,y)
# out = x + y
print (out.eval())

"""
Ex2. Subtract y from x element-wise.
"""
x = tf.constant([1,2,3])
y = tf.constant([4,5,6])
out = tf.subtract(x,y)
# out = x - y
print (out.eval())

"""
Ex3. Multiply x by y element-wise.
"""
x = tf.constant([1,2,3])
y = tf.constant([4,5,6])
out = tf.multiply(x,y)
# out = x * y
print (out.eval())

"""
Ex4. Multiply x by 5 element-wise.
"""
x = tf.constant([1,2,3])
out = tf.scalar_mul(5, x)
# out = 5 * x
print (out.eval())

"""
Ex5. Predict the result of this.
"""
x = tf.constant([9,11,13])
y = tf.constant([4,5,6])
out1 = tf.div(x,y)         # out1 = x//y
out2 = tf.truediv(x,y)     # out2 = x/y
print (out1.eval())
print (out2.eval())

"""
Ex6. Get the remainder of x / y element-wise.
"""
x = tf.constant([9,11,13])
y = tf.constant([4,5,6])
out = tf.mod(x,y)
# out = x % y
print (out.eval())

"""
Ex7. Compute the pairwise cross product of x and y.
"""
x = tf.constant([1,2,3])
y = tf.constant([4,5,6])
out = tf.cross(x, y)        # tf.cross == np.cross
print (out.eval())


# ------ Basic Math Functions ------ #

"""
Ex8. Add x, y, and z element-wise.
"""
x = tf.constant([1,2,3])
y = tf.constant([4,5,6])
z = tf.constant([7,8,9])
out = tf.add_n([x,y,z])
# out = x + y + z
print (out.eval())

"""
Ex9. Compute the absolute value of x.
"""
x = tf.constant([[-1,-2,-3],[4,-5,6]])
out = tf.abs(x)
print (out.eval())

"""
Ex10. Compute numerical negative value of x, elemet-wise.
"""
x = tf.constant([[-1,-2,-3],[4,-5,6]])
out = tf.negative(x)
# out = -x
print (out.eval())

"""
Ex11. Compute an element-wise indication of the sign of x, element-wise.
"""
x = tf.constant([-5,-3,0,3,5])
out = tf.sign(x)
print (out.eval())

"""
Ex12. Compute the reciprocal of x, element-wise.
"""
x = tf.constant([1,2,3], dtype=tf.float32)
out = tf.reciprocal(x)
# out = 1/x
print (out.eval())

"""
Ex13. Compute the square of x, element-wise.
"""
x = tf.constant([1,2,-3])
out = tf.square(x)
#out = x**2
print (out.eval())

"""
Ex14. Predict the results of this, paying attention to the difference among the family functions.
"""
x = tf.constant([2.1, 1.5, -2.5, -2.9])
out1 = tf.round(x)      # Rounds the values of a tensor to the nearest integer, element-wise.
out2 = tf.floor(x)      # Returns element-wise largest integer not greater than x.
out3 = tf.ceil(x)       # Returns element-wise smallest integer in not less than x.
print (out1.eval())
print (out2.eval())
print (out3.eval())

"""
Ex15. Compute square root of x element-wise.
"""
x = tf.constant([1., 2., 3., 4.], dtype=tf.float64)
# x = tf.constant([1., 2., 3., 4.])   # default: float32
out = tf.sqrt(x)       # Note: in TensorFlow, the input tensor must be a float, whereas in Numpy, an integer is okay.
print (out.eval())

"""
Ex16. Compute the reciprocal of square root of x element-wise.
"""
x = tf.constant([1.0,4,9])
out = tf.rsqrt(x)
print (out.eval())

"""
Ex17. Compute x^y, element-wise.
"""
x = tf.constant([[1,2,3],[4,5,6]])
y = tf.constant([[1,2,1],[2,1,2]])
out = tf.pow(x,y)         # tf.pow == np.power
print (out.eval())

"""
Ex18. Compute e^x, element-wise.
"""
x = tf.constant([[1,2,3],[4,5,6]], dtype=tf.float32)
out = tf.exp(x)          # tf.exp == np.exp
# out = tf.pow(np.e, x)
print (out.eval())

"""
Ex19. Compute natural logarithm of x element-wise.
"""
x = tf.constant([1, np.e, np.e**2])
out = tf.log(x)       # tf.log == np.log
print (out.eval())

"""
Ex20. Compute the max of x and y element-wise.
"""
x = tf.constant([1,3,5])
y = tf.constant([3,1,7])
out = tf.maximum(x, y)
# out = tf.where(x>y, x, y)
print (out.eval())

"""
Ex21. Compute the min of x and y element-wise.
"""
x = tf.constant([1,3,5])
y = tf.constant([3,1,7])
out = tf.minimum(x, y)
# out = tf.where(x<y, x, y)
print (out.eval())

"""
Ex22. Compuete the sine, cosine, and tangent of x, element-wise.
"""
x = tf.constant([-np.pi, np.pi, np.pi/2.0], dtype=tf.float64)
out1 = tf.sin(x)
out2 = tf.cos(x)
out3 = tf.tan(x)
print (out1.eval())
print (out2.eval())
print (out3.eval())

"""
Ex23. Compute (x - y)(x - y) element-wise.
"""
x = tf.constant([2, 3, 4])
y = tf.constant([1, 5, 1])
out = tf.squared_difference(x,y)
# out = tf.square(tf.subtract(x, y))
print (out.eval())


# ------ Matrix Math Functions ------ #

"""
Ex1. Create a diagonal tensor with the diagonal values of x.
"""
x = tf.constant([1,2,3,4])
out = tf.diag(x)
print (out.eval())

"""
Ex2. Extract the diagonal of x.
"""
x = tf.constant([[1,0,0,0],[0,2,0,0],[0,0,3,0],[0,0,0,4]])
out = tf.diag_part(x)
print (out.eval())

"""
Ex3. Permutate the dimensions of x (2, 3, 4) such that the new tensor has shape (3, 4, 2).
"""
x = tf.random_normal([2,3,4])
out = tf.transpose(x, [1,2,0])
print (out.get_shape())

"""
Ex4. Construct a 3 by 3 identity matrix.
"""
out = tf.eye(3)
print (out.eval())

"""
Ex5. Predict the result of this.
"""
x = tf.constant([[1,2,3,4],[5,6,7,8]])
out1 = tf.matrix_diag(x)
out2 = tf.matrix_diag_part(out1)
print (out1.eval())
print (out2.eval())

"""
Ex6. Transpose the last two dimensions of x.
"""
x = tf.random_normal([2,3,4])
out = tf.matrix_transpose(x)
# out = tf.transpose(x, [0,2,1])
print (out.eval().shape)

"""
Ex7. Multiply x by y.
"""
x = tf.constant([[1,2,3], [4,5,6]])
y = tf.constant([[1,1], [2,2], [3,3]])
out = tf.matmul(x,y)
print (out.eval())

"""
Ex8. Multiply slices of x and y in batches.
"""
x = tf.constant([[[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]]])
y = tf.constant([[[1,1],[2,2],[3,3]], [[1,1],[2,2],[3,3]]])
out = tf.matmul(x,y)
print (out.eval())

"""
Ex9. Compute the determinant of x.
"""
_x = np.arange(1, 5, dtype=np.float32).reshape((2, 2))
x = tf.convert_to_tensor(_x)
out = tf.matrix_determinant(x)
print (out.eval())

"""
Ex10. Compute the inverse of x.
"""
x = tf.constant([[1,2],[3,4]], dtype=tf.float64)
out = tf.matrix_inverse(x)
print (out.eval())

"""
Ex11. Compute the eigenvalues and eigenvectors of x.
"""
x = tf.diag(tf.constant([1,2,3], dtype=tf.float32))
eigenvals, eigenvecs = tf.self_adjoint_eig(x)
print (eigenvals.eval())
print (eigenvecs.eval())

"""
Ex12. Compute the singular values of x.
"""
x = tf.constant([[1, 0, 0, 0, 2],[0, 0, 3, 0, 0],[0, 0, 0, 0, 0],[0, 2, 0, 0, 0]], dtype=tf.float32)
s = tf.svd(x, compute_uv=False)
print (s.eval())


# ------ Reduction ------ #

"""
Ex13. Predict the results of these.
"""
x = tf.constant([[1, 2, 3, 4],[5, 6, 7, 8]])
outs = [tf.reduce_sum(x),
        tf.reduce_sum(x, axis=0),
        tf.reduce_sum(x, axis=1, keep_dims=True),
        "",
        tf.reduce_prod(x),
        tf.reduce_prod(x, axis=0),
        tf.reduce_prod(x, axis=1, keep_dims=True),
        "",
        tf.reduce_min(x),
        tf.reduce_min(x, axis=0),
        tf.reduce_min(x, axis=1, keep_dims=True),
        "",
        tf.reduce_max(x),
        tf.reduce_max(x, axis=0),
        tf.reduce_max(x, axis=1, keep_dims=True),
        "",
        tf.reduce_mean(x),
        tf.reduce_mean(x, axis=0),
        tf.reduce_mean(x, axis=1, keep_dims=True)]

for out in outs:
    if out == "": print ()
    else:
        print ("->", out.eval())

"""
Ex14. Predict the results of these.
"""
x = tf.constant([[True,True],[False,False]])
outs = [tf.reduce_all(x),           # logical and
        tf.reduce_all(x, axis=0),
        tf.reduce_all(x, axis=1, keep_dims=True),
        "",
        tf.reduce_any(x),           # logical or
        tf.reduce_any(x, axis=0),
        tf.reduce_any(x, axis=1, keep_dims=True),
        ]

for out in outs:           # If you remove the common suffix "reduce_", you will get the same result in numpy.
    if out == "": print ()
    else: print ("->", out.eval())

"""
Ex15. Predict the results of these.
"""
x = tf.constant([[0,1,0],[1,1,0]])
outs = [tf.count_nonzero(x),
        tf.count_nonzero(x, axis=0),
        tf.count_nonzero(x, axis=1, keep_dims=True)]

for out in outs:
    print ("->", out.eval())

"""
Ex16. Complete the einsum function that would yield the same result as the given function.
"""
_x = np.arange(1, 7).reshape((2, 3))
_y = np.arange(1, 7).reshape((3, 2))

x = tf.convert_to_tensor(_x, dtype=tf.float32)
y = tf.convert_to_tensor(_y, dtype=tf.float32)

# Matrix multiplication
out1 = tf.einsum('ij,jk->ik', x, y)
out1_ = tf.matmul(x, y)
assert np.allclose(out1.eval(), out1_.eval())

# Dot product
flattened = tf.reshape(x, [-1])              # shape: (6,)
out2 = tf.einsum('i,i->', flattened, flattened)
out2_ = tf.reduce_sum(tf.multiply(flattened, flattened))
assert np.allclose(out2.eval(), out2_.eval())

# Outer product
    """
    The operation tf.expand_dims() is useful if you want to add a batch dimension to 
    a single element. For example, if you have a single image of shape 
    [height, width, channels], you can make it a batch of 1 image with 
    expand_dims(image, 0), which will make the shape [1, height, width, channels].
    """
expanded_a = tf.expand_dims(flattened, 1)    # shape: (6, 1)
expanded_b = tf.expand_dims(flattened, 0)    # shape: (1, 6)
out3 = tf.einsum('i,j->ij', flattened, flattened)
out3_ = tf.matmul(expanded_a, expanded_b)
assert np.allclose(out3.eval(), out3_.eval())

# Transpose
out4 = tf.einsum('ij->ji', x)     # shape: (3, 2)
out4_ = tf.transpose(x)
assert np.allclose(out4.eval(), out4_.eval())


# ------ Scan ------ #

"""
Ex1. Compute the cumulative sum of x along axis 1.
"""
x = tf.constant([[1,2,3], [4,5,6]])
out = tf.cumsum(x, axis=1)       # tf.cumsum == np.cumsum
print (out.eval())

"""
Ex2. Compute the cumulative product of x along axis 1.
"""
x = tf.constant([[1,2,3], [4,5,6]])
out = tf.cumprod(x, axis=1)      # tf.cumprod == np.cumprod
print (out.eval())


# ------ Segmentation ------ #

"""
Ex3. Compute the sum along the first two elements and the last two elements of x separately.
"""
x = tf.constant([[1,2,3,4],
                  [-1,-2,-3,-4],
                  [-10,-20,-30,-40],
                  [10,20,30,40]])
out = tf.segment_sum(x, [0, 0, 1, 1])
print (out.eval())

"""
Ex4. Compute the product along the first two elements and the last two elements of x separately.
"""
x = tf.constant([[1,2,3,4],
                 [1,1/2,1/3,1/4],
                 [1,2,3,4],
                 [-1,-1,-1,-1]])
out = tf.segment_prod(x, [0, 0, 1, 1])
print (out.eval())

"""
Ex5. Compute the minimum along the first two elements and the last two elements of x separately.
"""
x = tf.constant([[1,4,5,7],
                 [2,3,6,8],
                 [1,2,3,4],
                 [-1,-2,-3,-4]])
out = tf.segment_min(x, [0, 0, 1, 1])
print (out.eval())

"""
Ex6. Compute the mean along the first two elements and the last two elements of x separately.
"""
x = tf.constant([[1,4,5,7],
                 [2,3,6,8],
                 [1,2,3,4],
                 [-1,-2,-3,-4]], dtype=tf.float32)
out = tf.segment_mean(x, [0, 0, 1, 1])
print (out.eval())

"""
Ex7. Compute the sum along the second and fourth and the first and third elements of x separately in the order.
"""
x = tf.constant([[1,4,5,7],
                 [2,3,6,8],
                 [1,2,3,4],
                 [-1,-2,-3,-4]])
out = tf.unsorted_segment_sum(x, [1, 0, 1, 0], num_segments=2)
print (out.eval())


# ------ Sequence Comparison and Indexing ------ #

"""
Ex8. Get the indices of maximum and minimum values of x along the second(row) axis.
"""
_x = np.random.permutation(10).reshape(2, 5)
print (_x)
x = tf.convert_to_tensor(_x)
out1 = tf.argmax(x, axis=1)    # Returns the index with the largest value across axes of a tensor.
out2 = tf.argmin(x, axis=1)
print (out1.eval())
print (out2.eval())

"""
Ex9. Find the unique elements of x that are not present in y.
"""
x = tf.constant([1,2,3,4,5])
y = tf.constant([0,1,2,3])
out, idx = tf.setdiff1d(x, y)
print (out.eval())
print (idx.eval())

"""
Ex10. Return the elements of x, if x < 4, otherwise x*10.
"""
_x = np.arange(1, 10).reshape(3, 3)
x = tf.convert_to_tensor(_x)
out = tf.where(x < 4, x, x*10)     # # tf.where == np.where
print (out.eval())

"""
Ex11. Get unique elements and their indices from x.
"""
_x = np.array([1, 2, 6, 4, 2, 3, 2])
x = tf.convert_to_tensor(_x)
out, indices = tf.unique(x)
print (out.eval())
print (indices.eval())
# Note that tf.unique keeps the original order, whereas np.unique sorts the unique members.
_out, _indices = np.unique(_x, return_inverse=True)
print ("sorted unique elements =", _out)
print ("indices =", _indices)

"""
Ex12. Compute the edit distance between hypothesis and truth.
"""
hypothesis = tf.SparseTensor([[0, 0],[0, 1],[0, 2],[0, 4]],
                             ["a", "b", "c", "a"], (1, 5))
# Note that this is equivalent to the dense tensor: [["a", "b", "c", 0, "a"]]

truth = tf.SparseTensor([[0, 0],[0, 2],[0, 4]],
                        ["a", "c", "b"], (1, 6))
# This is equivalent to the dense tensor: [["a", 0, "c", 0, "b", 0]]
out1 = tf.edit_distance(hypothesis, truth, normalize=False)
out2 = tf.edit_distance(hypothesis, truth, normalize=True)
print (out1.eval())    # 2 <- one deletion ("b") and one substitution ("a" to "b")
print (out2.eval())    # 0.6666 <- 2 / 6

Part 4:Tensor Transformations

import numpy as np
import tensorflow as tf

print (tf.__version__)      # 1.0.0

sess = tf.InteractiveSession()

"""
Ex1. Let x be a tensor of [["1.1", "2.2"], ["3.3", "4.4"]]. Convert the datatype of x to float32.
"""
x = tf.constant([["1.1", "2.2"], ["3.3", "4.4"]])    # Defaults to tf.float32
out = tf.string_to_number(x)
print out.eval()

"""
Ex2. Let x be a tensor [[1, 2], [3, 4]] of int32. Convert the data type of x to float64.
"""
x = tf.constant([[1, 2], [3, 4]], dtype=tf.int32)
out1 = tf.to_double(x)      # Casts a tensor to type float64.
out2 = tf.cast(x, tf.float64)
assert np.allclose(out1.eval(), out2.eval())
print out1.eval()

"""
Ex3. Let x be a tensor [[1, 2], [3, 4]] of int32. Convert the data type of x to float32.
"""
x = tf.constant([[1, 2], [3, 4]], dtype=tf.int32)
out1 = tf.to_float(x)      # Casts a tensor to type float32.
out2 = tf.cast(x, tf.float32)
assert np.allclose(out1.eval(), out2.eval())
print out1.eval()

"""
Ex4. Let x be a tensor [[1, 2], [3, 4]] of float32. Convert the data type of x to int32.
"""
x = tf.constant([[1, 2], [3, 4]], dtype=tf.float32)
ou
t1 = tf.to_int32(x)      # Casts a tensor to type int32.
out2 = tf.cast(x, tf.int32)
assert np.allclose(out1.eval(), out2.eval())
print out1.eval()

"""
Ex5. Let x be a tensor [[1, 2], [3, 4]] of float32. Convert the data type of x to int64.
"""
x = tf.constant([[1, 2], [3, 4]], dtype=tf.float32)
out1 = tf.to_int64(x)      # Casts a tensor to type int64. 
out2 = tf.cast(x, tf.int64)
assert np.allclose(out1.eval(), out2.eval())
print out1.eval()
assert np.allclose(out1.eval(), arr.astype(np.int64))

"""
Ex6. Let x be a tensor of [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]. 
     Create the tensor representing the shape of x.
"""
x = tf.constant([[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]])
out = tf.shape(x)
print out.eval()

"""
Ex7. Let x be a tensor of [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]) and y be a tensor [10, 20]. 
     Create a list of tensors representing the shape of X and Y.
"""
x = tf.constant([[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]])
y = tf.constant([10, 20])
out_x, out_y = tf.shape_n([x, y]) 
print out_x.eval(), out_y.eval()

"""
Ex8. Let x be a tensor of [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]. 
     Create a tensor representing the size (total number of elements) of x.
"""
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]])
x = tf.constant(arr)
out = tf.size(x)
print out.eval()
assert out.eval() == arr.size

"""
Ex9. Let x be a tensor of [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]. 
     Create a tensor representing the rank (number of dimensions) of x.
"""
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]])
x = tf.constant(arr)
out = tf.rank(x)
print out.eval()
assert out.eval() == arr.ndim

"""
Ex10. Let x be tf.ones([2, 2, 3]). Reshape x so that the size of the second dimension equals 6 (means the size is [2,6]).
"""
x = tf.ones([2, 2, 3])
out = tf.reshape(x, [-1, 6])
print out.eval()

"""
Ex11. Let x be tf.ones([10, 10, 1, 1]). Remove all the dimensions of size 1 in x.
"""
x = tf.ones([10, 10, 1, 1])
out = tf.squeeze(x)      # Removes dimensions of size 1 from the shape of a tensor.
print out.eval().shape
assert np.allclose(out.eval(), np.squeeze(np.ones([10, 10, 1, 1])))

"""
Ex12. Let X be tf.ones([10, 10, 1, 1]). Remove the third and fourth dimensions in x.
"""
x = tf.ones([10, 10, 1, 1])
out = tf.squeeze(x, [2,3])
print out.eval().shape

"""
Ex13. Let x be a tensor:
      [[[1, 1, 1], [2, 2, 2]],
       [[3, 3, 3], [4, 4, 4]],
       [[5, 5, 5], [6, 6, 6]]].
      Extract the [[3, 3, 3], [4, 4, 4]] from x.
"""
arr = np.array([[[1, 1, 1],
                 [2, 2, 2]],
                [[3, 3, 3],
                 [4, 4, 4]],
                [[5, 5, 5],
                 [6, 6, 6]]])
x = tf.constant(arr)
out = tf.slice(x, [1, 0, 0], [1, 2, 3])   # tf.slice(input_, begin, size, name=None)
print out.eval()
assert np.allclose(out.eval(), arr[1, :, :])

"""
Ex14. Let x be a tensor of
      [[1 2]
       [3 4]
       [5 6]
       [7 8]
       [9 10]].
      Extract the [[1, 2], [5, 6], [9, 10]]] from x.
"""
x = tf.reshape(tf.range(1, 11), [5, 2])
out = tf.strided_slice(x, [0], [5], [2])    # tf.strided_slice(input_, begin, end, strides=None, ...)
print out.eval()
arr = np.reshape(np.arange(1, 11), [5, 2])
assert np.allclose(out.eval(), arr[[0, 2, 4]])

"""
Ex15. Let x be a tensor of
      [[1 2 3 4  5]
       [6 7 8 9 10]].
      Split x into 5 tensors along the second dimension.
"""
x = tf.reshape(tf.range(1, 11), [2, 5])
out = tf.split(x, num_or_size_splits=5, axis=1)
print [each.eval() for each in out]

"""
Ex16. Lex X be a tensor
      [[1 2 3]
       [4 5 6].
      Create a tensor looking like 
      [[1 2 3 1 2 3 1 2 3 ]
       [4 5 6 4 5 6 4 5 6 ]].
"""
x = tf.reshape(tf.range(1, 7), [2, 3])
out = tf.tile(x, [1, 3])
print out.eval()

"""
Ex17. Lex x be a tensor 
      [[1 2 3]
       [4 5 6].
      Pad 2 0's before the first dimension, 3 0's after the second dimension.
"""
x = tf.reshape(tf.range(1, 7), [2, 3])
out = tf.pad(x, [[2, 0], [0, 3]])   # paddings=[[2, 0], [0, 3]] indicates [[上,下],[左,右]]
print out.eval()

"""
Ex18. Lex x be a tensor 
      [[1 2 3]
       [4 5 6]]
      and y be a tensor
      [[7 8 9]
       [10 11 12]]
      Concatenate x and y so that a new tensor looks like 
      [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]].
"""
x = tf.constant([[1, 2, 3], [4, 5, 6]])
y = tf.constant([[7, 8, 9], [10, 11, 12]])
out = tf.concat([x, y], axis=1)     # equal np.concatenate((x, y), axis=1))
print out.eval()

"""
Ex19. Let x be a tensor [1, 4], y be a tensor [2, 5], and z be a tensor [3, 6]. 
      Create a single tensor from these such that it looks [[1, 2, 3], [4, 5, 6]].
"""
x = tf.constant([1, 4])
y = tf.constant([2, 5])
z = tf.constant([3, 6])
out = tf.stack([x, y, z], axis=1)   # tf.stack([x, y, z], axis=0) ==> [[1, 4], [2, 5], [3, 6]]
print out.eval()

"""
Ex20. Let x be a tensor [[1, 2, 3], [4, 5, 6]]. Convert X into 3 tensors: 
      [1, 4], [2, 5], [3, 6].
"""
x = tf.constant([[1, 2, 3], [4, 5, 6]])
out = tf.unstack(x, axis=1)
print [each.eval() for each in out]

"""
Ex21. Let X = tf.resahpe(tf.range(1, 1*2*3*4+1), [1, 2, 3, 4]). Reverse the last dimension.
      [[[[ 1  2  3  4]                  [[[[ 4  3  2  1]
         [ 5  6  7  8]                     [ 8  7  6  5]
         [ 9 10 11 12]]                    [12 11 10  9]]
                              ===>
        [[13 14 15 16]                    [[16 15 14 13]
         [17 18 19 20]                     [20 19 18 17]
         [21 22 23 24]]]]                  [24 23 22 21]]]]
"""
X = tf.reshape(tf.range(1, 1*2*3*4+1), [1, 2, 3, 4])
out = tf.reverse(X, axis=[3])
print out.eval()

"""
Ex22. Let x = tf.constant([[1, 2, 3], [4, 5, 6]]). Transpose x.
"""
x = tf.constant([[1, 2, 3], [4, 5, 6]])
out = tf.transpose(x)
print out.eval()

"""
Ex23. Let x be a tensor [[1, 2, 3], [4, 5, 6], [7, 8, 9]]. Get the first, and third rows.
"""
x = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
out1 = tf.gather(x, [0, 2])
out2 = tf.gather_nd(x, [[0], [2]])
assert np.allclose(out1.eval(), out2.eval())
print out1.eval()

"""
Ex24. Let x be a tensor [[1, 2, 3], [4, 5, 6], [7, 8, 9]]. Get the 5 and 7.
"""
x = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
out = tf.gather_nd(x, [[1, 1], [2, 0]])
print out.eval()

"""
Ex25. Let x be a tensor [2, 2, 1, 5, 4, 5, 1, 2, 3]. Get the unique elements and their counts.
      e.g. # tensor 'x' is [1, 1, 2, 4, 4, 4, 7, 8, 8]
           y, idx, count = unique_with_counts(x)
           y ==> [1, 2, 4, 7, 8]
           idx ==> [0, 0, 1, 2, 2, 2, 3, 4, 4]
           count ==> [2, 1, 3, 1, 2]
"""
x = tf.constant([2, 2, 1, 5, 4, 5, 1, 2, 3])
out1, _, out2 = tf.unique_with_counts(x)
print out1.eval(), out2.eval()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • Sets and Maps 我们知道ES6之前,array是唯一的集合类型,数组是数字索引(numeric ind...
    JamesSawyer阅读 516评论 0 0
  • 今天下午,我在荡秋千,我发现今天的云朵比上年我看到的云还好看,于是我...
    夏儿笔阅读 353评论 0 0
  • 看《善生经》和[古惑仔电影],你就会明白,社会福利果报改变和世间善恶因果报应是冥冥之中自有感应的。
    同事阅读 516评论 0 0
  • 明天要去找房了。又要搬家了。 真的非常不喜欢这种感觉,住所不稳定,工作不稳定,生活不稳定。 不过,这里确实也没什么...
    晴川阁阅读 188评论 0 0
  • 不到60天,2017年行将结束。一年的碌碌无为,也是一年的收获满满。 整个2017年,时间都是自己的,自由度很大,...
    玥玥她爹阅读 216评论 0 0