损失函数
题目场景

思路
均方误差
关于这个思路就是我们通过广告+天气温度的数据可以得到对应的训练值,不用考虑其他的,所以损失函数如下:
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())
交叉熵

举例子


浙公网安备 33010602011771号