Tensorflow2.0学习(3)---基础 一、常量 二、数值精度 三、待优化张量 四、创建张量 五、索引与切片 六、维度变换 七、广播机制Broadcasting 八、数学运算 九、矩阵操作
tf.constant([1.2,3.3])
1、标量:
2、向量:
3、矩阵
4、字符串
5、布尔
二、数值精度
tf.constant(12,dtype=tf.int16)
1、类型
张量可保存为不同字节长度的精度,常用类型:tf.int16、tf.int32、tf.int64、tf.float16、tf.float32、tf.float64(即tf.double)等。
2、 应用场景
3、读取精度:a.dtype
4、类型转换:tf.case(a,tf.bool)
三、待优化张量
tf.Variable(a)或者tf.Variable([1,2],[3,4])
四、创建张量
1、从数组、列表对象创建
tf.convert_to_tensor(np.array([1,2],[3,4]))或者tf.constant([1,2])
2、创建全0或全1张量
tf.zeros([ ])和tf.ones([ ])
新建与某个张量shape一致,内容全0或全1的张量:tf.zeros_like(a)和tf.ones_like(a) ----> tf.zeros(a.shape)
3、创建自定义数值张量
创建全为自定义数值的张量,形状为shape:tf.fill(shape,value)
4、创建已知分布的张量
正态分布:tf.random.normal()
均匀分布:tf.random.uniform()
5、创建序列
创建[0,limit) ,步长为delta=1的整型序列:tf.range(limit, delta)
(1)
(2)
(3)
五、索引与切片
1、创建张量:x = tf.random.normal([4,32,32,3])
2、索引:x[0][2][1][1]
3、切片:
冒号:
- x[: ,1:3, 0:28 , :]、
- x[0,::] 第一维所有元素
- x[::-1] 逆序全部元素
- x[::-2] 逆序间隔采样
- x[0,::-2,::-2] 行、列逆序间隔采样
省略号…
- x[0:2,…,1:] 相当于x[0:2,:,:,1:]
- x[2:, …] 相当于 x[2:]
- x[..., :2] 相当于x[:,:,:,:2]
六、维度变换
基本的维度变换操作函数包含了
- 改变视图 reshape、
- 插入新维度 expand_dims,
- 删除维 度 squeeze、
- 交换维度 transpose、
- 复制数据 tile
等函数。
1、改变视图
tf.reshape(x,new_shape)
2、增删维度
增加维度:tf.expand_dims(x,axis),在指定的axis处可插入一个新的维度
删除维度:tf.squeeze(x,axis),axis为待删除的维度索引号。
交换维度:tf.transpose(x,perm),作用shape = [b,c,h,w] 变成shape = [b,h,w,c],perm参数表示新维度的顺序List。
复制数据:tf.tile(x,multiples),mutiples分别指定了每个维度上面的复制倍数,对应位置为1表明不复制,为2表明新长度为原来长度的2倍……
七、广播机制Broadcasting
对于所有长度为1的维度,broadcasting效果和tf.tile一样,都能在此维度上复制若干份。
区别:
- tf.tile会创建一个新的张量,执行复制 IO 操作,并保存复制后的张量数据。
- Broadcasting不会立即复制数据,它会在逻辑上改变张量的形状,使得视图上变成了复制后的形状。因此,broadcasting节省了大量的计算资源,推荐使用。
原理介绍:
x@w的shape=【2,3】
b的shape=【3】
直接将 x@w + b ,shape【2,3】 + shape【3】,为何不报错?
因为它会自动调用Broadcasting函数 tf.broadcast_to(x,new_shape) ,将两者shape扩张为相同的 [2,3],即上式可以等效为:y = x@w + tf.broadcast_to (b,[2,3]) 【操作符+在遇到 shape 不一致的 2 个张量时,会自动考虑将 2 个张量自动扩展到 一致的 shape,然后再调用 tf.add 完成张量相加运算】
核心思想:普适性,即同一份数据能普遍适合于其他位置。
在验证普适性之前,需要先将张量 shape 靠右对齐,然后进行普适性判断:
对于长度为 1 的维 度,默认这个数据普遍适合于当前维度的其他位置;
对于不存在的维度,则在增加新维度 后默认当前数据也是普适于新维度的,从而可以扩展为更多维度数、任意长度的张量形 状。
示意图:
八、数学运算
- 加减乘除:tf.add (+)、tf.subtract(-) 、tf.multiply( *)、tf.divide(/)
- 整除和余除:// 和%
- 平方和平方根:tf.square(x)和tf.sqrt(x)
- 乘方指数:tf.pow(x,a) 或者 **,tf.exp(x)
- 自然对数(即logex):tf.math.log(x)
- 其他对数(换底公式,a为底):tf.math.log(x) / tf.math.log(a)
- 矩阵相乘:tf.matmul(a,b)或者@
- 范数:tf.norm(x,ord=1)----L1范数,ord=2----L2范数,ord=np.inf----∞范数
- 最值、均值、和:tf.reduce_max(x,axis)、tf.reduce_min(x,axis)、tf.reduce_mean(x,axis)、tf.reduce_sum(x,axis)
-
前向传播过程:
九、矩阵操作
1、合并
将多个张量在某个维度上合并为一个张量。如合并两个班级的成绩表。
——拼接:tf.concat(tensors, axis),不会产生新的维度,仅在现有的维度上合并。axis指在该维度合并。
——堆叠:tf.stack(tensors,axis),创建新维度。tf.stack要求所有合并的张量shape完全一致才能合并。
2、分割
tf.split()
3、复制与填充
(1)填充:tf.pad(x,paddings)
paddings参数包含了多个【Left Padding,Right Padding】的嵌套方案List,
如 [ [0,0], [2,1], [1,2] ] 表示
第一个维度不填充,
第二个维度左边(起始处)填充两个单元,右边(结束处)填充一个单元,
第三个维度左边填充一个单元,右边填充两个单元。
keras.preprocessing.sequence.pad_sequences(x, maxlen = , truncating , padding = ) ,可以快速完成句子的填充和截断工作,设置句子长度为maxlen,短的则填充,长的则截断。
(2)复制:tf.tile()
4、数据限幅
- tf.maxinum(x,a) 实现数据的下限幅,即x∈[a,+∞]
- tf.mininum(x,a) 实现数据的上限幅,即x∈[-∞,a]
- tf.mininum(tf.maxinum(x,a),b) 实现数据的上下限幅,即x∈[a,b]
- tf.clip_by_value(x,a,b) 实现数据的上下限幅,即x∈[a,b]
5、高级操作
- tf.gather(x,[ 索引号],axis=):实现根据索引号收集数据的目的。
- tf.gather_nd(x,[ 多维坐标索引号]):(没有axis)可以通过指定每次采样点的多维坐标来实现采样多个点的目的。
-
tf.boolean_mask(x,mask,axis):可以通过给定掩码(Mask)的方式进行采样。
- tf.where(cond,a,b):可以根据cond条件的真假从参数A或B中读取数据,条件判定规则如下:
- tf.scatter_nd(indices,updates,shape):刷新张量的部分数据,但这个函数只能在全0的白板张量上面执行刷新操作。
- tf.meshgrid:生成二维网络的采样点坐标,方便可视化。
摘自:《Tensor flow深度学习》