概述
本文记录了 Tensorflow 中线性回归的实现方法及如何使用梯度下降算法,仅为框架用法,其理论与底层实现不做介绍,有需要请移步往期深度学习专题博文,搭配食用更佳 深度学习(一)Logistics 回归与梯度下降。
一、准备工作
1. 包
确保你已经安装好 tensorflow 及接下来会使用到的包 pandas 及 matplotlib。
2. Jupyter notebook
打开 Jupyter notebook 新建一个 Python 3 文件以编写与测试代码。
3. 数据
本篇以受教育年数与工作收入作为模型训练数据,以期实现一个由受教育年数来预测工作收入的简单模型。将以下数据放入记事本中,改后缀为 Income.csv 得到测试用数据,将文件放在新建的 Python 3 文件的同级目录或方便读取的目录。
,Education,Income
1,10.000000 ,26.658839
2,10.401338 ,27.306435
3,10.842809 ,22.132410
4,11.244147 ,21.169841
5,11.645449 ,15.192634
6,12.086957 ,26.398951
7,12.048829 ,17.435307
8,12.889632 ,25.507885
9,13.290970 ,36.884595
10,13.732441 ,39.666109
11,14.133779 ,34.396281
12,14.635117 ,41.497994
13,14.978589 ,44.981575
14,15.377926 ,47.039595
15,15.779264 ,48.252578
16,16.220736 ,57.034251
17,16.622074 ,51.490919
18,17.023411 ,51.336621
19,17.464883 ,57.681998
20,17.866221 ,68.553714
21,18.267559 ,64.310925
22,18.709030 ,68.959009
23,19.110368 ,74.614639
24,19.511706 ,71.867195
25,19.913043 ,76.098135
26,20.354515 ,75.775216
27,20.755853 ,72.486055
28,21.167191 ,77.355021
29,21.598662 ,72.118790
30,22.000000 ,80.260571
二、读入数据
1 | # 导入 pandas 包用于读取 csv 数据 |
由 图2-1 输出可知数据包含两列,分别是 Education 与 Income。
1 | # 导入 matplotlib 包用于数据可视化 |
由 图2-2 可知分别以 Education 和 Income 为横轴坐标轴的数据分布基本呈现线性关系。
三、模型搭建与训练
1. 创建模型实例
1 | # 建立序贯模型(最简单的线性),返回一个 Model 实例 |
其中 tf.keras.layers.Dense()
返回一个常规的神经网络层(NN Layer),其第一个参数为 unit 正整数,指明输出矩阵维度,此处 1 表明该层的输出是 $\n times 1$ 的。
第二个参数 input_shape 指明输入形状,input_shape=[1] 指明输入样本的特征数为 1(此例输入即 data.Education),而该层输入参数是 2 个(应该分别是一维的权重 $w$ 和偏置 $b$ 吧)。
此外,查官方文档可知 input_shape 参数继承自 Layer 类,其实质是一个 TensorShape 类型的实例。
因此也可写作 model.add(tf.keras.layers.Dense(1, input_shape=tf.TensorShape([1])))
此外,Dense 层也有其他参数,如可在构造函数中为 activation 赋值以指明本层激活函数,详细可以去看看文档。
1 | # 输出此时模型信息 |
使用 summary 可以看出,此时 model 拥有了一个 Layer,这个 layer 的输出形状是 $None \times 1$ 的。经查阅 Tensorflow 官方文档,tf 中的输入输出形状均描述为形如 (batch_size, ..., input/output_dim)
的结构,即输出形状 $m \times n$ 的意义是 $m$ 个样本的输出,每个样本的输出维度为 $n$,这与往期深度学习博文中的抽象数学定义也是相符的。None 猜测一下应该是表示输出数待定,待定为我们输入样本的个数。
2. 配置模型
1 | # 编译模型 |
在训练模型之前还需对模型进行一些配置,例如指明优化方法、损失函数等,compile 就是用于指明这些配置,详细的可配置参数请移步 compile 函数文档。
optimizer 指明优化方法,该参数接受优化方法名,也接受优化方法的实例(tf.keras.optimizers),adam 即使用梯度下降作为优化方法。
loss 指明 LossFunction,同样接受损失函数名或损失函数实例(tf.keras.losses),mse 即使用均方差作为损失函数。
3. 训练模型
1 | # 以 data.Education 和 data.Income 作为输入参数,训练模型 5000 轮 |
详细可选参数移步官方文档:tf.keras.Model.fit
四、模型预测
1 | # 使用刚才训练好的模型对训练集进行预测 |
1 | # 计算预测值与真实值之间的差距 |
1 | # 绘制差距图 |
Tensorflow 线性回归核心步骤:
- 创建序贯模型:
model = tf.keras.Sequential()
- 为神经网络添加层:
model.add(tf.keras.layers.Dense(输出维数, input_shape=[特征数]))
- 配置神经网络:
model.compile(optimizer='优化方法名', loss='损失函数名')
- 训练神经网络:
model.fit(特征输入, 期望输出, epochs=训练轮次)
- 使用训练好的模型进行预测:
model.predict(特征输入)