Tensorflow 2.0基础知识
1.创建Tensor
import tensorflow as tf
tf.constant
tensorflow 支持常见的bool string float double类型数据
#声明一个tf的常量(数)
a = tf.constant(1,dtype=tf.float32)
#声明一个tf的常量(矩阵)
a = tf.constant([1,2],dtype=tf.float32) #[1., 2.]
a = tf.constant([[1],[2]],dtype=tf.float32)#[[1.],[2.]]
#通过dtype指定创建的常量类型(不指定时系统会自动判定)
#常见有tf.double(tf.float64) tf.float16 tf.float32 tf.int16 tf.int32 tf.int36 tf.bool
#将一个Tensor类型转换为一个numpy类型
a.numpy()
tf.convert_to_tensor
#将一个numpy类型转换为一个Tensor类型(dtype指定类型,返回新Tensor)
tf.convert_to_tensor([1,2,3],dtype=tf.float32)#[1,2,3]为一个numpy类型
tf.cast
#转换Tensor类型(通过dtype重新指定类型,返回新Tensor)
tf.cast(a,dtype=tf.float64)
tf.ones
#生成全为1的Tensor shape指定生成的形状(x*y*z的一个矩阵)
a = tf.ones(shape=(x,y,z))
#生成形状与e相同的全为1的Tensor
a = tf.ones_like(e)
tf.zeros
#生成全为0的Tensor shape指定生成的形状(x*y*z的一个矩阵)
a = tf.zeros(shape=(x,y,z))
#生成形状与e相同的全为0的Tensor
a = tf.zeros_like(e)
tf.fill
#用指定变量e填充生成Tensor,shape指定生成的形状(x*y*z的一个矩阵)
tf.fill([x,y,z],e)
tf.range
#生成指定范围的Tensor
tf.range(1,6)
#结果:<tf.Tensor: id=73, shape=(5,), dtype=int32, numpy=array([1, 2, 3, 4, 5])>
tf.range(8)
#结果:<tf.Tensor: id=77, shape=(8,), dtype=int32, numpy=array([0, 1, 2, 3, 4, 5, 6, 7])>
tf.random
#正态分布(均值为v,方差为d)随机初始化一个Tensor,shape指定生成的形状(x*y*z的一个矩阵)
tf.random.normal(shape=(x,y,z),mean=v,stddev=d)
#从截断的正态分布中输出随机值。 shape表示生成张量的维度,mean是均值,stddev是标准差。(一般情况下比normal有着更好性能)
tf.random.truncated_normal(shape=(x,y,z),mean=v,stddev=d)
#均匀分布,shape表示生成张量的维度,minval是最小值,maxval是最大值。
tf.random.uniform(shape=(x,y,z),minval=0,maxval=1)
#随机打散Tensor
#b = [0, 1, 2, 3, 4, 5, 6, 7]
tf.random.shuffle(b)
#结果:<tf.Tensor: id=82, shape=(8,), dtype=int32, numpy=array([6, 7, 3, 0, 1, 2, 4, 5])>
tf.gather
#给定一个位置矩阵b,从a中依此拼接这些位置的点成为一个新的Tensor
#b = [1, 4, 3, 2, 5, 0, 6, 7],a = [11, 22, 5, 6, 1, 4, 44, 47]
tf.gather(a,b)
#结果:[22, 1, 6, 5, 4, 11, 44, 47]
#tf.one_hot编码,depth为Tensor宽度
#b = [0, 1, 2]
tf.one_hot(b,depth=2)
"""
结果:<tf.Tensor: id=108, shape=(3, 2), dtype=float32, numpy=
array([[1., 0.],
[0., 1.],
[0., 0.]], dtype=float32)>
"""
tf.one_hot(b,depth=4)
"""
结果:<tf.Tensor: id=112, shape=(3, 4), dtype=float32, numpy=
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.]], dtype=float32)>
"""
tf.reduce_mean(均值)
#f = [[1., 2., 3.],
# [4., 5., 6.]]
#求整体均值
tf.reduce_mean(f)
#结果:<tf.Tensor: id=126, shape=(), dtype=float32, numpy=3.5>
#求列均值
tf.reduce_mean(f,0)
#结果: <tf.Tensor: id=128, shape=(3,), dtype=float32, numpy=array([2.5, 3.5, 4.5], dtype=float32)>
#求行均值
tf.reduce_mean(f,1)
#结果:<tf.Tensor: id=136, shape=(2,), dtype=float32, numpy=array([2., 5.], dtype=float32)>
tf.keras.losses.mse(均方误差)
#b = [[2., 2.],
# [2., 2.],
# [2., 2.]]
#out = [[0., 0.],
# [0., 0.],
# [0., 0.]]
tf.keras.losses.mse(out,b)
#结果:<tf.Tensor: id=151, shape=(3,), dtype=float32, numpy=array([4., 4., 4.], dtype=float32)>
2.选着创建Tensor使用的设备
with tf.device("cpu"):
a.tf.constant([1])
with tf.device("gpu"):
b.tf.constant([1])
#a创建在cpu上,b创建在gpu上
#注意只用创建在同一设备上时可以进行运算
3.修改查看创建Tensor使用的设备
#可以通过device查看常量的使用的设备
a.device
#'/job:localhost/replica:0/task:0/device:CPU:0'
#可以通过device("gpu") , device("cpu")修改所使用的设备
a.device("gpu")#使用gpu设备
4.查看常量信息
#a 为一个2X1矩阵(Tensor类型):[[1.],[2.]]
a.ndim
#结果:2
tf.rank(a)
#结果:<tf.Tensor: id=18, shape=(), dtype=int32, numpy=2>
#查看Tensor的形状
a.shape
#结果: TensorShape([2, 1])
#判断一个变量是否为Tensor类型
tf.is_tensor(a)
#结果:True
#查看常量类型(可用来判断两个Tensor类型是否相同)
a.dtype
#结果:tf.float32
5. tf.Variablea类型(为神经网络服务)
只有Tensor被声明为Variablea类型,系统才会自动记录梯度信息,才可以对该Tensor自动求导。
# name属性(1.0版本)
b = tf.Variablea(a,name="XXXX")
# 查看当前常量的name
b.name
#查看当前常量是否支持训练(True,False)
b.trainable
6.索引与切片
- 在TensorFlow 中Tensor的维度为一个一位向量例如:
[1,2,3] 的一个Tensor,它的一个shape属性为[3],是一个长度为3的向量;
[[1,2,3]] 的一个Tensor,它的一个shape属性为[1,3],是一个1*3的矩阵;
[[1,2,3],[1,2,3]] 的一个Tensor,它的一个shape属性为[2,3],是一个长度为2*3的矩阵;
shape返回的结果为该Tensor的维度信息。
- Tensor支持常见的python风格的数组索引方式,来读取Tensor的每一元素。
a = tf.constant([[1],[2]],dtype=tf.float32)#[[1.],[2.]]
#a[0][0]的值为1.,a[1][0]的值为2.
- 同时Tensor还有自己的一种读取方法:多维度间可以用","来分割
例如:a[1][2][3] 等价 a[1,2,3]
- Tensor支持像python一样的分段读取Tensor内容:
- 多维度,读取某一个维度全部元素时可以省略start与end只写":"
* 每个维度可以使用:start :end :step这种格式来控制起始读取位置(start),终止位置(end),步幅(step,相邻元素的间距,step为负数可起到逆序的功能)
多维度Tensor中"…“可以起到省略中间的”:"的作用
tf.gather
根据提供的indices(int类型的向量)在axis这个轴上对params进行索引,拼接成一个新的张量
tf.gather(
params, # 需要被索引的张量
indices, # 索引
validate_indices=None,
name=None,
axis=0
)
tf.gather_nd
tf.gather_nd类似于tf.gather,不过后者只能在一个维度上进行索引,而前者可以在多个维度上进行索引
tf.gather_nd(
params, # 待索引输入张量
indices, # 索引
name=None
)
tf.boolean_mask
axis指定提取的维度,mask(为一个bool类型的向量,用True来标记需要提取的元素,False标记舍弃的元素)
7.维度变换
tf.reshape
改变Tensor的维度(-1由系统自动确定该维度的信息)
tf.transpose
求Tensor的转置,可以设置perm来设置转置后的维度排列顺序
tf.expand_dims
扩充Tensor的维度(一次只能增加一个维度),axis指定扩充维度的位置
tf.squeeze
默认删除所有高度1的维度,axis指定要删除维度(只能指定高度为1的维度)
8.Broadcasting(广播机制)
9.基本数学运算符号
+ - * / % //
tf.math.log
功能:tf.math.log(N) = logeN
数学公式:logAN = logeN/logeA
tf.exp
tf.exp(N) = eN
tf.pow
求解Tensor A 的N次方:tf.pow(A,N)
tf.sqrt
开方Tensor A:tf.sqrt(A)
tf.matmul
矩阵乘法,a与b相乘可表示为 tf.matmul(a,b) = a@b
tf.nn.relu
relu函数,Tensorflow的内建实现方法