第一节:从线性回归入手
参考《简明的tensorflow2》
基础理论:深度学习学得的模型是为了拟合一个任务在真实世界分布,即:
真实世界:, 神经网络: , 希望两个分布尽可能相似:~
而为了衡量这两个分布,各种损失函数被创造出,比如最常见的,让预测值的分布与真实值更相近
问题描述,商铺item在2013-2017年间的销售额如下,预测商品在2018年的销售
| 年份 | 2013 | 2014 | 2015 | 2016 | 2017 |
|---|---|---|---|---|---|
| 销售额 | 12000 | 14000 | 15000 | 16500 | 17500 |
首先,倒入我们需要的包
import numpy as np
import tensorflow as tf
第二,我们要拟合分布的预测任务:一件商品六年的销售额
x_raw = np.array([2013, 2014, 2015, 2016, 2017], dtype=np.float32)
y_raw = np.array([12000, 14000, 15000, 16500, 17500], dtype=np.float32)
第三,数据预处理,进行归一化,并转换成为tensorflow的张量
x = (x_raw - x_raw.min()) / (x_raw.max() - x_raw.min())
y = (y_raw - y_raw.min()) / (y_raw.max() - y_raw.min())
x=tf.constant(x)
y=tf.constant(y)
第四,设计你的模型需要的参数,因为tf2.x中tape计算时是给所有变量加梯度,所以用列表打包所有参数
a=tf.Variable(initial_value=0.)
b=tf.Variable(initial_value=0.)
variable=[a,b]
第五,设计迭代次数与优化方法,这里使用随机梯度下降的方法
epoch=1000
optimizer=tf.keras.optimizers.SGD(learning_rate=1e-3)
第六,开始训练!
for e in range(epoch):
with tf.GradientTape() as tape:
y_pred=a*x+b
loss=tf.reduce_sum(tf.square(y_pred-y))
grads=tape.gradient(loss,variable)
optimizer.apply_gradients(grads_and_vars=zip(grads,variable))
print(loss)
tips:tf2.x中提供tf.GradientTape()作为梯度反向传播空间,其中的参数均是需要求导的参数,通过tape.gradient方法,计算tape空间中两个张量间的梯度,最终放进优化器中optimizer.apply_gradients,进行参数优化。
最后,得到我们的预测值啦!
x_pred = tf.constant((2018 - x_raw.min()) / (x_raw.max() - x_raw.min()),dtype=tf.float32)
print(a * x_pred + b)