预备知识
import tensorflow as tf
import numpy as np
# a = tf.constant([1,3,2,2,5])
# b = tf.constant([0,4,1,1,6])
# c = tf.where(tf.greater(a,b), a, b)#tf.where 若a > b则返回a, 否则返回b
# print("c:", c)
# rdm = np.random.RandomState(seed=1)#seed等于常数是使得每次产生的随机数相同
# a = rdm.rand()##不给参数,默认生成一个0到1之间的随机数
# b = rdm.rand(3,4)##生成一个二维的
# print(a)
# print(b)
# a = np.array([1,2,3])
# b = np.array([4,5,6])
# c = np.vstack((a,b))#纵向叠加
# d = np.hstack((a,b))#横向叠加
# print(c)
# print(d)
x,y = np.mgrid[1:3:1, 2:4:0.5]#1是起始, 到3不包含3,步长为1 后面的一样,返回一个二维的,列要保持一致
###.ravel()将其拉直为一维数组 c_将两个数组配成对输出
grid = np.c_[x.ravel(), y.ravel()]
print("x:", x)
print("y:", y)
print("grid:\n", grid)
学习率
###指数衰减学习率
#可以先用较大的学习率,快速得到较优解,然后逐步减小学习率,使模型在训练后期稳定
#指数衰减学习率 = 初始学习率 * 学习衰减率(当前轮数 / 多少轮衰减一次)
import tensorflow as tf
epoch = 20
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)
print("After %s epoch, w is %f, loss is %f, lr is %f"%(epoch, w.numpy(), loss, lr))
激活函数
import tensorflow as tf
###sigmoid函数,能归一化数据
#特点 1.易造成梯度消失 2.输出非0均值收敛慢 3.幂运算复杂,训练时间长
tf.nn.sigmoid()
###tanh函数 特点1.输出是0均值 2.易造成梯度消失 3.幂运算复杂,训练时间长
tf.nn.tanh()
###relu函数 x < 0时输出0 x >= 0时 输出x
#优点 1.解决了梯度消失问题 2.只需要判断输入是否大于0, 计算速度快 3.收敛速度远大于sigmoid与tanh
#缺点 1.输出非0均值,收敛慢 2.Dead ReIU问题:某些神经元可能永远不会被激活,导致相应的参数永远不能被更新
tf.nn.relu
###leaky_relu,relu的升级版,但在实际操作中不一定比relu好