损失函数、反向传播
损失函数:预测值和正确值的差距。
目的:想找到一组参数w和b,使得损失函数最小。
梯度:函数对各参数求偏导后的向量。函数梯度下隆方向是函数减小方向。
梯度下降法:沿损失函数梯度下降的方向,寻找损失函数的最小值,得到最优参数的方法。
上面这些概念在高数中已有接触了,但鄙人才疏学浅,还是不明白。
反向传播:从后向前,逐层求损失函数对每层神经元参数
的偏导数,迭代更新所有参数。
这里有个例子:
import tensorflow as tf
w = tf.Variable(tf.constant(5, dtype=tf.float32))
lr = 0.2
epoch = 40
for epoch in range(epoch): # for epoch 定义顶层循环,表示对数据集循环epoch次,此例数据集数据仅有1个w,初始化时候constant赋值为5,循环100次迭代。
with tf.GradientTape() as tape: # with结构到grads框起了梯度的计算过程。
loss = tf.square(w + 1)
grads = tape.gradient(loss, w) # .gradient函数告知谁对谁求导
w.assign_sub(lr * grads) # .assign_sub 对变量做自减 即:w -= lr*grads 即 w = w - lr*grads
print("After %s epoch,w is %f,loss is %f" % (epoch, w.numpy(), loss))
# lr初始值:0.2 请自改学习率 0.001 0.999 看收敛过程
# 最终目的:找到 loss 最小 即 w = -1 的最优参数w
在Anaconda中运行结果如图:
经过40次迭代,找到了是损失函数最小的w值。
张量
这里就简单总结一下:
0维张量到2维张量分别就是我们熟知的标量、向量、矩阵,对应阶是0、1、2。3维及更高阶的就称作n阶张量。
import tensorflow as tf
a = tf.constant([1, 5], dtype=tf.int64)
print("a:", a)
print("a.dtype:", a.dtype)
print("a.shape:", a.shape)
# 本机默认 tf.int32 可去掉dtype试一下 查看默认值
创建一个一维张量
import tensorflow as tf
a = tf.constant([1, 5], dtype=tf.int64)
print("a:", a)
print("a.dtype:", a.dtype)
print("a.shape:", a.shape)
# 本机默认 tf.int32 可去掉dtype试一下 查看默认值
输出
如果把代码中[1,5]改成1,那么创建的就是0阶张量,改成[1,2],[2,5] 就是二维。
三维张量如图:
shape值为(2,2,1),第一个2表示第一个维度有两个元素,第二个2表示第二个维度有两个元素,1表示第三个维度有一个元素。
numpy数据类型转换成TensorFlow数据类型
import tensorflow as tf
import numpy as np
a = np.arange(0, 5)
b = tf.convert_to_tensor(a, dtype=tf.int64)
print("a:", a)
print("b:", b)
输出:
创建特殊的张量
a = tf.zeros([2, 3])
b = tf.ones(4)
c = tf.fill([2, 2], 9)
print("a:", a)
print("b:", b)
print("c:", c)
输出:
上面三个方法的圆括号内参数是维度:
一维直接写个数
二维用[行,列]
多维用[n,m,j…]
如:创建全为零的一维张量a = tf.zeros(4)
生成正态分布的随机数,默认均值为0,标准差为1。tf. random.normal (维度,mean=均值, stddev=标准差)
r生成截断式正态分布的随机数tf. random.truncated normal (维度,mean=均值, stddev=标准差)
d = tf.random.normal([2, 2], mean=0.5, stddev=1)
print("d:", d)
e = tf.random.truncated_normal([2, 2], mean=0.5, stddev=1)
print("e:", e)
生成均匀分布随机数[ minval, maxval )
tf. random. uniform(维度,minval=最小值,maxval=最大值)
f= tf.random.uniform([2, 2], minval=0, maxval=1)
print(f)
输出: