Deep Learning với Tensorflow Module 1 Phần 2 : Những khái niệm cơ bản - Lấy thông tin của tensors
There will be times when you'll want to get different pieces of information from your tensors, in particuluar, you should know the following tensor vocabulary: *Shape: The length (number of elements) of each of the dimensions of a tensor. *Rank: The number of tensor dimensions. A scalar has rank 0, a vector has rank 1, a matrix is rank 2, a tensor has rank n. *Axis or Dimension: A particular dimension of a tensor. *Size: The total number of items in the tensor.
You'll use these especially when you're trying to line up the shapes of your data to the shapes of your model. For example, making sure the shape of your image tensors are the same shape as your models input layer.
We've already seen one of these before using the ndim
attribute. Let's see the rest.
Create a rank 4 tensor (4 dimensions)
rank_4_tensor = tf.zeros([2, 3, 4, 5]) rank_4_tensor
result
<tf.Tensor: shape=(2, 3, 4, 5), dtype=float32, numpy= array([[[[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]], ... ... ... [[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]]]], dtype=float32)>
rank_4_tensor.shape, rank_4_tensor.ndim, tf.size(rank_4_tensor)
result
(TensorShape([2, 3, 4, 5]), 4, <tf.Tensor: shape=(), dtype=int32, numpy=120>)
Get various attributes of tensor
print("Datatype of every element:", rank_4_tensor.dtype) print("Number of dimensions (rank):", rank_4_tensor.ndim) print("Shape of tensor:", rank_4_tensor.shape) print("Elements along axis 0 of tensor:", rank_4_tensor.shape[0]) print("Elements along last axis of tensor:", rank_4_tensor.shape[-1]) print("Total number of elements (2*3*4*5):", tf.size(rank_4_tensor).numpy()) # .numpy() converts to NumPy array
result
# [out] Datatype of every element: <dtype: 'float32'> Number of dimensions (rank): 4 Shape of tensor: (2, 3, 4, 5) Elements along axis 0 of tensor: 2 Elements along last axis of tensor: 5 Total number of elements (2*3*4*5): 120
You can also index tensors just like Python lists.
# Get the first 2 items of each dimension rank_4_tensor[:2, :2, :2, :2]
result
<tf.Tensor: shape=(2, 2, 2, 2), dtype=float32, numpy= array([[[[0., 0.], [0., 0.]], [[0., 0.], [0., 0.]]], [[[0., 0.], [0., 0.]], [[0., 0.], [0., 0.]]]], dtype=float32)>
Get the dimension from each index except for the final one
rank_4_tensor[:1, :1, :1, :]
result
<tf.Tensor: shape=(1, 1, 1, 5), dtype=float32, numpy=array([[[[0., 0., 0., 0., 0.]]]], dtype=float32)>
# Create a rank 2 tensor (2 dimensions) rank_2_tensor = tf.constant([[10, 7], [3, 4]]) # Get the last item of each row rank_2_tensor[:, -1]
result
<tf.Tensor: shape=(2,), dtype=int32, numpy=array([7, 4], dtype=int32)>
You can also add dimensions to your tensor whilst keeping the same information present using tf.newaxis
.
# Add an extra dimension (to the end) rank_3_tensor = rank_2_tensor[..., tf.newaxis] # in Python "..." means "all dimensions prior to" rank_2_tensor, rank_3_tensor # shape (2, 2), shape (2, 2, 1)
result
(<tf.Tensor: shape=(2, 2), dtype=int32, numpy= array([[10, 7], [ 3, 4]], dtype=int32)>, <tf.Tensor: shape=(2, 2, 1), dtype=int32, numpy= array([[[10], [ 7]], [[ 3], [ 4]]], dtype=int32)>)
You can achieve the same using tf.expand_dims()
.
tf.expand_dims(rank_2_tensor, axis=-1) # "-1" means last axis
result
# [out] <tf.Tensor: shape=(2, 2, 1), dtype=int32, numpy= array([[[10], [ 7]], [[ 3], [ 4]]], dtype=int32)>