TensorFlow2.0学习笔记 2.4:损失函数

损失函数:

在这里插入图片描述损失函数是前向传播计算出的结果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这两句,一次完成概率分布和交叉熵的计算

猜你喜欢

转载自blog.csdn.net/weixin_44145452/article/details/112995057