损失函数

题目场景

思路

均方误差

关于这个思路就是我们通过广告+天气温度的数据可以得到对应的训练值,不用考虑其他的,所以损失函数如下:

loss = tf.reduce_mean(tf.square(y_ - y))

自定义损失函数

之所以自定义损失函数的原因是,有些场景我们使用均方误差就不太合适了,比如,我们这道题。如果我们只是用了均方误差,那么我们将不会考虑成本和利润的计算。也就是我们没有考虑现实中的问题。毕竟买酸奶肯定是为了赚钱,那么肯定期望利润最大化啊。假设,一瓶酸奶成本是1元,利润是99元。如果我们按照均方误差的方式,获得广告数+天气温度的最佳销售数量,比如是70瓶,那么,当所需要的是大于70瓶呢?那么我们每瓶就会亏损99元,如果是低于70瓶,我们每瓶最多亏损1元。既然如此,那么我们肯定选择多生产啊,那么应该生成多少篇出来呢?这里我们就可以得到损失函数如下:

所以代码如下:

当预测值y大于真实值y_的时候,我们会损失成本
当预测值y小于真实值y_的时候,我们会损失本应该赚到的利润
loss = tf.reduce_sum(tf.where(tf.greater(y, y_), (y - y_) * COST, (y_ - y) * PROFIT))

完整代码

import tensorflow as tf
import numpy as np

epoch = 10000      # 训练20000次
Xcount = 32        # 样本个数
lr = 0.002         # 学习率
SEED = 22          # 随机种子
COST = 1          # 酸奶成本1元
PROFIT = 99         # 酸奶利润为99元

rdm = np.random.RandomState(seed = SEED)     # 定义可以生成[0, 1)之间的随机数的对象
x = rdm.rand(Xcount, 2)                      # 生成32个特征值(x1, x2),这些值的范围为[0, 1)
# noise = (rdm.rand() / 10.0 - 0.05)           # 生成(-0.5, 0.5)之间的值作为噪音
y_ = [[x1 + x2] for (x1, x2) in x]   # 生成标签

x = tf.cast(x, dtype=tf.float32)
w1 = tf.Variable(tf.random.normal([2, 1], stddev=1, seed=1))    # 我们使用1层神经网络

for epoch in range(epoch):
    with tf.GradientTape() as tape:
        y = tf.matmul(x, w1)
        # loss = tf.reduce_mean(tf.square(y_ - y))       # 均方误差
        loss = tf.reduce_sum(tf.where(tf.greater(y, y_), (y - y_) * COST, (y_ - y) * PROFIT))    # 自定义损失函数

    grads = tape.gradient(loss.w1)
    w1.assign_sub(lr * grads)

    if epoch % 500 == 0:
        print(f"训练{epoch}次后,w1的值为:\n{w1.numpy()}")

print("最终得到w1的值为:\n", w1.numpy())


交叉熵

举例子

posted @ 2023-10-16 11:11  影梦无痕  阅读(23)  评论(0)    收藏  举报