tensorflow
张量的创建
- 创建张量
//格式 tf.constant(张量内容, dtype=数据类型(可选)) //示例 tf.constant([1,5], dtype=tf.int64)
- 数据转换
//格式 tf.convert_to_tensor(数据名, dtype=数据类型(可选)) //示例 a = np.arange(0, 5) b =tf.convert_to_tensor(a, dtype=tf.int64)
- 特殊张量
//创建全0张量 tf.zeros(维度) //创建全1张量 tf.ones(维度) //创建指定值张量 tf.fill(维度指定值)
- 正态分布张量
//正态分布随机张量,默认均值:0,标准差:1 tf.random.normal(维度, mean=均值, stddev=标准差) //截断式正态分布随机张量 tf.random.truncated_normal(维度, mean=均值, stddev=标准差)
- 均匀分布随机张量
//均匀分布随机数张量 tf.random.uniform(维度, minval=最小值, maxval=最大值)
常见函数
axis
在二维张量或数组中,通过调整axis(0或1)控制执行计算的维度,axis=0表示沿着行计算(down),axis=1表示沿着列计算(across)。
- 强制类型转换
tf.cast(张量名称,dtype=数据类型)
- 最值求解
//计算张量维度最小值 tf.reduce_min(张量名称) //计算张量维度最小值 tf.reduce_max(张量名称)
- 计算平均值及和
//计算张量沿指定维度的平均值 tf.reduce_mean(张量名称, axis=操作轴) //计算张量沿指定维度的和 tf.reduce_sum(张量名称, axis=操作轴)
- 变量创建
//将变量标记为可训练变量,被标记的变量会在反向传播中记录梯度信息 tf.Variable(初始值) //格式 tf.Variable(tf.random.normal([2,2], mean=0-, stddev=1)) //示例
- 张量数学运算
对应元素的四则运算函数:tf.add(),tf.subtract(),tf.multiply(),tf.divide()
平方、次方、开方:tf.square(),tf.pow(),tf,sqrt()
矩阵乘法:tf.matmul()//对应张量维度相同 //张量对应元素相加 tf.add(张量1,张量2) //张量对应元素相减 tf.substract(张量1,张量2) //张量对应元素相乘 tf.multiply(张量1,张量2) //张量元素对应相除 tf.divide(张量1,张量2) //张量元素平方 tf.square(张量名称) //张量元素n次方 tf.pow(张量名称, n) //张量元素开方 tf.sqrt(张量名称) //矩阵乘法 tf.matmul(矩阵1,矩阵2)
- 数据集制作
//构造特征-标签数据集(Numpy、Tensor格式) //格式 tf.data.Dataset.from_tensor_slices((输入特征, 标签)) //示例 features = tf.constant([12,23,10.,17]) labels = tf.constant([0,1,1,0]) dataset = tf.data.Dataset_from_tensor_slices((features, labels))
- 求导运算
//求张量梯度 //格式 with tf.GradientTape() as tape: //计算图 grad = tape.gradient(函数, 求导对象) //示例: with tf.GradientTape() as tape: w = tf.Variable(tf.constant(3.0)) loss = tf.pow(w,2) gread = tape.gradient(loss,w)
- 枚举函数
//遍历(列表、元组、字符串)中的元素,组合输出:索引、元素 //格式 enumerate(列表名称) //示例 seq = ['one','two','three'] for i,element in enumerate(seq): print(i,element)
- 独热编码
分类问题中,常用独热码做标签,标签类别:1表示是,0表示非。//将代转数据,转换成one-hot形式输出 //格式 tf.one_hot(待转换数据, depth=几种分类) //示例 classes = 3 labels = tf.constant([1,0,2]) output = tf.one_hot(labels, depth=classes)
- 概率映射
S o f t m a x ( y i ) = e y i ∑ t = 0 n e y t Softmax(y_i)=\frac{e^{y_i}}{\sum_{t=0}^ne^{y_t}} Softmax(yi)=∑t=0neyteyi//概率映射函数,输出符合的概率分布,即输出值转换成0-1之间的概率值且概率值之和是1 //格式 tf.nn.softmax(x) //示例 y = tf.constant([1.01,2.01,-0.66]) y_pro = tf.nn.softmax(y)
- 自减函数
//自减变量要求是可训练变量 //格式 w.assign_sub(w要自减的内容) //示例:w = w-1 w = tf.Variable(4) w.assign_sub(1)
- 检索最大值
//沿张量指定维度检索最大值的索引 //格式 tf.argmax(张量名称, axis=操作轴) //示例 test = np.array([[1,2,3],[2,3,4],[5,4,3],[8,7,2]]) max_v alue_row = tf.argmax(test,axis=0) max_value_column = tf.argmax(test,axis=1) //输出 test: [[1 2 3] [2 3 4] [5 4 3] [8 7 2]] max_value_row = [3 3 1] max_value_column = [2 2 0 0]
- 条件判断
//条件判断语句,真返回A,假返回B //格式 tf.where(条件语句, A,B) //示例 a = tf.constant([1,2,3,1,1]) b = tf.constant([0,1,3,4,5]) c = tf.where(tf.greater(a,b), a, b) //若a>b,返回a对应位置的元素,否则返回b对应位置的元素 //输出 c:[1,2,3,4,5]
- 创建随机数
//创建0<=random<1 //格式 np.random.RandomState.rand(维度) //示例 rdm = np.random.RandomState(seed=1) a = rdm.rand() //维度为空返回标量 b = rdm.rand(2,3) //返回维度为2行3列的随机数矩阵
- 数组叠加
//将两个数组以垂直方向叠加 //格式 np.vstack((a,b)) //示例 a = np.array([1,2,3]) b = np.array([4,5,6]) c = np.vstack((a,b)) //输出 c:[[1,2,3] [4,5,6]]
- 网格坐标点
//返回若干组维度相同的等差数组 //格式 np.mgrid[起始值:结束值:步长, 起始值:结束值:步长, ...] //示例 x,y = np.mgrid[1:3:1, 2:4:0.5] //输出 x = [[1. 1. 1. 1.] [2. 2. 2. 2.]] y = [[2. 2.5 3. 3.5] [2. 2.5 3. 3.5]] //将多维数组x转换一维数组 x.ravel() //将多个数组元素配对后输出 np.c_[数组1,数组2,...] //示例 grid = np.c_[x.ravel(), y.ravel()] //输出 grid = [[1. 2.] [1. 2.5] [1. 3.] [1. 3.5] [2. 2.] [2. 2.5] [2. 3.] [2. 3.5]]
常见技巧
- 定义指数衰减学习率
l e a r n i n g _ r a t e = L E A R N I N G _ R A T E _ B A S E ∗ L E A R N I N G _ R A T E _ D E C A Y g l o b a l _ s t e p ( L E A R N I N G _ R A T E _ S T P E ) learning\_rate = LEARNING\_RATE\_BASE * LEARNING\_RATE\_DECAY^{\frac{global\_step}{(LEARNING\_RATE\_STPE)}} learning_rate=LEARNING_RATE_BASE∗LEARNING_RATE_DECAY(LEARNING_RATE_STPE)global_step
LEARNING_RATE_BASE:学习率初始值
LEARNING_RATE_DECAY:学习率衰减率(0,1)
LEARNING_RATE_STPE:神经网络训练多少轮后更新学习率
L E A R N I N G _ R A T E _ S T P E = 总 样 本 数 量 / B A T C H _ S I Z E LEARNING\_RATE\_STPE = 总样本数量 / BATCH\_SIZE LEARNING_RATE_STPE=总样本数量/BATCH_SIZE
程序实现如下:epoch = 40 LR_BASE = 0.2 LR_DECAY = 0.99 LR_STEP = 1 for epoch in range(epoch): lr = LR_BASE*LR_DECAY**(epoch/LR_STEP) with tf.GradientTape() as tape: loss = tf.square(w+1) grads = tape.gradient(loss,w) w.assign_sub(lr*grads)
- 损失函数
(1) 均方误差损失函数mse:
M S E ( y _ , y ) = ∑ i = 0 n ( y − y _ ) 2 n MSE(y\_, y) = \frac{\sum_{i=0}^n(y-y\_)^2}{n} MSE(y_,y)=n∑i=0n(y−y_)2
程序实现如下:
(2) 交叉熵损失函数CE:表征两个概率分布之间的距离:loss_mse = tf.reduce_mean(tf.square(y_-y))
H ( y _ , y ) = − ∑ y _ ∗ l n y H(y\_, y) = -\sum y\_*lny H(y_,y)=−∑y_∗lny
程序实现如下://计算交叉熵损失函数 loss_ce = tf.losses.categorical_crossentropy(y_, y) //先将预测结果做Softmax,再计算交叉熵损失函数 loss_ce = tf.nn.softmax_cross_entropy_with_logits(y_, y)
- 正则化
l o s s = l o s s ( y , y _ ) + R E G U L A R I Z E R ∗ l o s s ( w ) loss=loss(y, y\_)+REGULARIZER*loss(w) loss=loss(y,y_)+REGULARIZER∗loss(w)
程序实现如下:loss_regularization = [] loss_regularization.append(tf.nn.l2_loss(w1)) loss_regularization.append(tf.nn.l2_loss(w2)) loss_regularization = tf.reduce_sum(loss_regularization) loss = loss + 0.03 * loss_regularization