损失函数:
损失函数是前向传播计算出的结果y与已知标准答案y_的差距
神经网络的优化目标就是找到某套参数,使得计算出来的结果y和已知标准答案y_无限接近,也就是他们的差距loss值最小
主流loss有三种计算方法:
均分误差(mse)
自定义
交叉熵(ce)
一、均分误差
是前向传播计算的结果y与已知标准答案y_之差的平方。再求平均
例子一:
我把代码分开来看
import tensorflow as tf
import numpy as np
SEED = 23455
rdm = np.random.RandomState(seed=SEED) # 生成[0,1)之间的随机数
x = rdm.rand(32, 2) # 生成32行2列的输入特征x,包含了32组0到1之间的随机数x1和x2
print(x)
y_ = [[x1 + x2 + (rdm.rand() / 10.0 - 0.05)] for (x1, x2) in x]
print(y_)
x = tf.cast(x, dtype=tf.float32) # x转变数据类型
print(x)
w1 = tf.Variable(tf.random.normal([2, 1], stddev=1, seed=1)) # 随机初始化参数w1,初始化为2行1列,并设置标准差是1
print(w1)
先生成随机数据,转换为张量
输出结果:
for epoch in range(epoch):
with tf.GradientTape() as tape:
y = tf.matmul(x, w1) # 求前向传播计算结果y, 矩阵x乘以矩阵w1
loss_mse = tf.reduce_mean(tf.square(y_ - y)) # 求均方误差损失函数loss_mse
grads = tape.gradient(loss_mse, w1) # 损失函数对带训练参数w1求偏导
w1.assign_sub(lr * grads) # 更新参数w1
if epoch % 500 == 0: # 每迭代500轮,打印当前的参数w1
print("After %d training steps,w1 is " % (epoch))
print(w1.numpy(), "\n")
print("Final w1 is: ", w1.numpy())
with tf.GradientTape() as tape 梯度带 Tensorflow自动求导API
二、自定义损失函数:
import tensorflow as tf
import numpy as np
SEED = 23455
COST = 1
PROFIT = 99
rdm = np.random.RandomState(SEED)
x = rdm.rand(32, 2)
y_ = [[x1 + x2 + (rdm.rand() / 10.0 - 0.05)] for (x1, x2) in x] # 生成噪声[0,1)/10=[0,0.1); [0,0.1)-0.05=[-0.05,0.05)
x = tf.cast(x, dtype=tf.float32)
w1 = tf.Variable(tf.random.normal([2, 1], stddev=1, seed=1))
epoch = 10000
lr = 0.002
for epoch in range(epoch):
with tf.GradientTape() as tape:
y = tf.matmul(x, w1)
loss = tf.reduce_sum(tf.where(tf.greater(y, y_), (y - y_) * COST, (y_ - y) * PROFIT))#让预测的y多了时损失成本,预测的y少了是损失利润
grads = tape.gradient(loss, w1)
w1.assign_sub(lr * grads)
if epoch % 500 == 0:
print("After %d training steps,w1 is " % (epoch))
print(w1.numpy(), "\n")
print("Final w1 is: ", w1.numpy())
# 自定义损失函数
# 酸奶成本1元, 酸奶利润99元
# 成本很低,利润很高,人们希望多预测些,生成模型系数大于1,往多了预测
拟合出的函数是 销量y=1.16X1+1.12X2,系数都偏大,都大于均方误差做损失函数时的系数
三、交叉熵损失函数:
交叉熵可以表示两个概率分布之间的距离。交叉熵,两个概率分布越远,交叉熵越小,两个概率分布越近
y_(1, 0)
标准答案的概率分布y_有两个元素,表示二分类。
第一个元素是1,表示第一种情况发生的概率是100%
第一个元素是0,表示第一种情况发生的概率是0
神经网络预测出了两组概率y1和y2,其中括号里的概率对应y_
我们在执行分类问题时,通常先用softmax函数,让输出结果符合概率分布,再求交叉熵损失函数
一分钟理解softmax函数(超简单)
TensorFlow给出了一个可以同时计算概率分布和交叉熵的函数
tf.nn.softmax_cross_entropy_with_logits(y_ ,y)
从这个例子可以看出,loss_ce2这一句可以替换y_pro和loss_ce1这两句,一次完成概率分布和交叉熵的计算