• shape, ndim

  • reshape

  • expand_dims/squeeze

  • transpose

  • broadcast_to

import tensorflow as tf

view1-4不同的数据理解方式,不改变原有数据的content,并且数据全部使用。

  • view1: [b, 28, 28]

    图片包含行列信息

  • view2: [b, 28*28]

    图片的数据不变,理解方式改变, 没有了行列信息,常用于全连接层的输入

  • view3: [b, 2, 14*28]

    图片的上下两部分

  • view4: [b, 28, 28, 1]

    增加一个通道,channel概念,仅仅增加view1的理解方式,并未修改content

1. reshape

a = tf.random.normal([4, 28, 28, 3]) # [batch, row, col, channel] 行列理解方式
a.shape, a.ndim
(TensorShape([4, 28, 28, 3]), 4)
tf.reshape(a, [4, 28*28, 3]).shape   # [batch, pixel, channel]  像素理解方式(抹掉行列信息)
TensorShape([4, 784, 3])
tf.reshape(a, [4, -1, 3]).shape
TensorShape([4, 784, 3])
tf.reshape(a, [4, 28*28*3]).shape    # [batch, data_point]   数据点方式(抹掉行列和通道信息)
TensorShape([4, 2352])
tf.reshape(a, [4, -1]).shape
TensorShape([4, 2352])

reshape is flexible

2. tf.transpose

改变content

b = tf.random.normal([4, 28, 28, 3])
b.shape
TensorShape([4, 28, 28, 3])
tf.transpose(b).shape                      # [b, h, w, c]
TensorShape([3, 28, 28, 4])
tf.transpose(b, perm=[0, 2, 1, 3]).shape   # [b, w, h, c]
TensorShape([4, 3, 1, 2])
tf.transpose(b, perm=[0, 3, 2, 1]).shape   # [b, c, w, h]
TensorShape([4, 3, 28, 28])

3. tf.expand_dims

e.g.

  • a: [班级,学生, 成绩]

    [4, 35, 8] 4个班级,35个学生,8门课成绩

  • 增加学校维度dim=axis

    [1 ,4, 35, 8] + [1, 4, 35, 8]

axis增加方式:正数在轴前,负数在轴后

c = tf.random.normal([4, 35, 8])
tf.expand_dims(c, axis=0).shape
TensorShape([1, 4, 35, 8])
tf.expand_dims(c, axis=3).shape
TensorShape([4, 35, 8, 1])
tf.expand_dims(c, axis=-3).shape    # axis=0 vs -3
TensorShape([4, 1, 35, 8])

4. tf.squeeze

只能squeeze shape=1的维度

tf.squeeze(tf.zeros([1, 2, 1, 1, 5])).shape
TensorShape([2, 5])
d = tf.zeros([1, 2, 1, 3])
tf.squeeze(d, axis=0).shape, tf.squeeze(d, axis=2).shape, tf.squeeze(d, axis=-4).shape, tf.squeeze(d, axis=-2).shape
(TensorShape([2, 1, 3]),
 TensorShape([1, 2, 3]),
 TensorShape([2, 1, 3]),
 TensorShape([1, 2, 3]))

Share on: TwitterFacebookEmail

Comments


Related Posts


Published

Category

Programming

Tags

Contact