Tensorflow基础
Tensor是什么
张量的维度也称作轴 (Axis)
一般把标量、向量、矩阵也统称为张量
TF中的数据类型
数值,布尔,字符串
1.数值类型
- 在tf中创建标量
使用.numpy
可以返回Numpy.array
类型的数据
- 在tf中创建向量
此时,必须使用List容器传值
- 在tf中创建矩阵
- 在tf中创建三维张量
2.字符串类型
不怎么用,Python内置的字符串方法已经足够
3.布尔类型
tf的布尔类型和Python内置的布尔类型不等价
类型转换
numpy ==> tensor
一般的,使用cast
函数可完成不同数据类型,数据精度之间的转换
int ==> bool
bool ==> int
待优化的张量
对于一些需要训练优化的参数,可设置tf.Variable
类型
比如神经网络中,输入的X不需要包装成该类型,而w和b需要
name和trainable是Variable特有的属性
创建张量
从数组,列表中创建
convert_to_tensor
和constant
作用一样,都是创建张量
创建全0或全1的张量
标量
向量
矩阵
可以使用tf.zeros_like()
与tf.ones_like()
创建一个与某张量维度一样的新的张量
创建自定义张量
创建服从标准正态分布的张量
创建服从普通正态分布的张量
创建服从均匀分布的张量
创建序列
和Python内置的range()
很相似
索引
创建一个张量:4张32*32的彩色图片
1 | x=tf.random.normal([4,32,32,3]) |
取第一张图片的数据
取第一张图片的第2行
取第 1 张图片,第 2 行,第 3 列的数据
取第 3 张图片,第 2 行,第 1 列的像素, B 通道(第 2 个通道)颜色强度值
切片
和Python自带的切片方法很相似,只不过维度较高
选取前两张图片
读取第一张图片
::
可以省略为一个:
切片方法汇总
和Python一样,step可为负
1 | x=tf.range(9) |
间隔选取与逆序间隔选取
行列逆序间隔选取第1张图片
取G通道数据
这样也可以取到G通道数据
读取第 1~2 张图片的 G/B 通道数据
读取最后两张图片
selective indexing
更灵活的切片方式
tf.gather
假设是4个班级,每个班级35个学生,每个学生有8门课的成绩
这里只是做演示,所以使用了随机生成的数据
1 | a=tf.random.normal([4,35,8]) |
选取第2和3班所有学生的所有成绩
它等价于
1 | a[2:4] |
选取每个班级中第2,3,7,9个学生的所有成绩
维度变换
改变视图
ndim
==> 查看张量的维数
shape
==> 查看张量的形状列表
当不确定某一维度大小时,可以写-1
,会自动推导出其值(类似numpy)
增删维度
注意,增删维度并不会改变存储的数据,只会改变数据的视图, 增加( 删除)维度只能增加(删除)长度为 1 的维度
增加维度
增加通道维度
增加图片数量维度
删除维度
删除图片数量维度
删除图片通道维度
交换维度
使用transpose
假设图片张量shape为[2,32,32,,3],分别代表[b,h,w,c]
现在想要改为[b,c,h,w]
则新的维度的索引号分别对应旧维度的[0,3,1,2]
所以perm=[0,3,1,2]
看,此时shape已经改变
复制数据
使用tf.tile()
复制向量
复制矩阵
但这种方式计算开销大,所以有了广播机制
Broadcasing(广播机制、自动扩展机制)
在逻辑上扩展张量数据的形状, 但是只会在需要时才会执行实际存储复制操作
效果同tf.tile()
该操作对用户透明:
在上面的操作中,b
的维度和x@w
的维度不一样,但是却能做运算
原因就是广播机制的存在
tf中的数学运算
矩阵乘法
在tf中,当张量维度大于2时,TF会选择两个张量的最后两个维度做矩阵乘法
A和B能够做矩阵相乘的条件是,A的倒数第一个维度长度(列)和B的倒数第二个维度长度(行)必须相等。
比如张量 a shape:[4,3,28,32]可以与张量 b shape:[4,3,32,2]可以进行矩阵相乘 ,因为[28,32]与[32,2]的矩阵可以做矩阵乘法
也支持广播机制
上述运算前,先将b扩展为shape:[4,32,16],再与a做批量形式的矩阵乘法