3.4 维度变换
tf.shape, tf.ndim
a = tf.random.normal([4, 28, 28, 3])
a.shape # TensorShape([4, 28, 28, 3])
a.ndim # 4 (int)
tf.reshape
a = tf.random.normal([4, 28, 28, 3])
a.shape # TensorShape([4, 28, 28, 3])
a.ndim # 4
tf.reshape(a, [4, 28*28, 3]).shape # TensorShape([4, 784, 3])
tf.reshape(a, [4, -1, 3]).shape # TensorShape([4, 784, 3])
tf.reshape(a, [4, 784*3]).shape # TensorShape([4, 2352])
tf.reshape(a, [4, -1]).shape # TensorShape([4, 2352])
# Reshape is flexible
tf.reshape(tf.reshape(a, [4, -1]),[4, 28, 28, 3]).shape # TensorShape([4, 28, 28, 3])
tf.reshape(tf.reshape(a, [4, -1]),[4, -1, 3]).shape # TensorShape([4, 784, 3])
Reshape could lead to potential bugs!
images: [4, 28, 28, 3]
[b, h, w, 3]
reshape to: [4, 784, 3]
[b, pixel, 3]
[4, 784, 3] ℎ???ℎ?: 28, ????ℎ: 28 [4, 28, 28, 3]
[4, 784, 3] ℎ???ℎ?: 14, ????ℎ: 56 [4, 14, 56, 3]
[4, 784, 3] ????ℎ: 28, ℎ???ℎ?: 28 [4, 28, 28, 3]
tf.transpose
a = tf.random.normal([4, 3, 2, 1])
a.shape # TensorShape([4, 3, 2, 1])
tf.transpose(a).shape # TensorShape([1, 2, 3, 4])
a = tf.random.normal([4, 28, 28, 3])
a.shape # TensorShape([4, 28, 28, 3])
tf.transpose(a, perm=[0,3,1,2]).shape # TensorShape([4, 3, 28, 28])
# tensorflow tensor to pytorch tensor
tf.expand_dim
- a: [classes, students, classes]
- [4, 35, 8]
- add school dim
- [1, 4, 35, 8] + [1, 4, 35, 8]
- [2, 4, 35, 8]
a = tf.ones([4,35,10])
a.shape # TensorShape([4, 35, 10])
tf.expand_dims(a, axis=0).shape # front TensorShape([1, 4, 35, 10])
tf.expand_dims(a, axis=-1).shape # behind TensorShape([4, 35, 10, 1])
tf.expand_dims(a, axis=-2).shape # behind TensorShape([4, 35, 1, 10])
tf.squeeze
-
Only squeeze for shape=1 dim
-
[4, 35, 8, 1]
-
[1, 4, 35, 8]
-
[1, 4, 35, 1]
a = tf.ones([1,4,1,35,1,10])
tf.squeeze(a).shape # # TensorShape([4, 35, 10])