本文是书籍《TensorFlow深度学习》的学习笔记之一
数据类型
TF中的数据类型分为标量Scalar、向量Vector、矩阵Matrix、张量Tensor,0维的张量就是标量,1维的张量就是向量,2维的张量就是矩阵,大于等于3维的张量没有名称,统一叫做张量。
a = tf.constant(1.2) # 创建标量
b = tf.constant([1, 2., 3.3]) # 创建向量
c = tf.constant([[1, 2], [3, 4]]) # 创建矩阵
x = tf.constant([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) # 创建张量,3维,2*2*2
str_ = tf.constant('hello,deep learning') # 字符串
bool_ = tf.constant(True)
数值精度
tf.constant(12345678, dtype=tf.int16)
a = tf.constant([-1, 0, 1, 2])
tf.cast(a, tf.bool)
待优化张量
TF专门增加了一种专门的数据类型来支持梯度信息的记录,tf.Variable
。如神经网络的输入X,设置为普通张量即可;如果是网络层的参数W和b,需要tf.Variable
包装来跟踪梯度等相关信息。如
a = tf.Variable([[1,2],[3,4]])
创建张量
- 从列表对象中创建:
tf.convert_to_tensor([1,2.])
- 从数组对象中创建:
tf.convert_to_tensor(np.array([[1,2.],[3,4]]))
- 创建全0/1的向量、矩阵:
tf.zeros([1])
a = tf.ones([2,2])
tf.ones_like(a)
- 创建自定义张量:
tf.fill([2,2],99)
,创建2行2列,元素全为99的矩阵 - 创建已知分布的张量:
tf.random.normal([2,2])
,创建标准正态分布的张量,tf.random.uniform([2,2],maxval=10)
,创建采样自[0,10]均匀分布的2*2矩阵 - 创建序列:
tf.range(10)
,创建0~10,步长为1的整型序列
tf.range(1,10,delta=2)
,创建1~10,步长为2的整型序列:[1,3,5,7,9]
切片
通过start:end:step切片可以方便地提取一段数据,step为步长
x = tf.random.normal([4,32,32,3])
x[1:3]#读取第二三张图片
x[0,::]#读取第一张图片
x[1,9,2,1]#读第2张图片,第10行,第3列,第二个通道的数据
step=-1时,表示逆序读取,
x=tf.range(9)
x[8:0:-1]#从8读取到0,逆序,不包含0
x[::-1]#逆序全部元素
维度变换
通过维度变换可以将数据任意地切换形式,满足不同场合的运算需求。
改变视图
使用reshape,把向量改成了4维张量,可以理解为2张图片,每张图片4行4列,每个点有3个RGB通道,也可以理解为2张图片,图片的特征是443。
>>> x=tf.range(96)
>>> x=tf.reshape(x,[2,4,4,3])#改变x的视图,获得4D张量
>>> x
<tf.Tensor: shape=(2, 4, 4, 3), dtype=int32, numpy=
array([[[[ 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