开发者学堂课程【Tensorflow2.0入门与实战:Tf.keras 实现线性回归】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/664/detail/11099
Tf.keras 实现线性回归
内容介绍
一.如何使用 tf.keras 来建立模型
二.如何使用 tf.keras 来实现通过受教育年限预测收入情况
一. 建立模型
上节课引入了 tensorflow 版本为2.0,读取了 Income 数据集。
1、首先把变量和因变量x和y写出来,变量 x=data.Education 受教育年限,y=data.Income。
2、建立一个模型需要一种顺序模型。顺序模型指有一个输入和一个输出,他们之间的网络是顺序搭建的。就像一个积木要一层一层的搭建。这种模型叫model=tf.keras.Sequential,这个模型为初始化模型没有任何东西。
3、可以通过 model.add 添加层。tf.keras.layers. 有很多层帮助我们使用,最常用的层为 Dense 层,Dense 有两个要注意的参数,第一个输出数据的维度。因为方程是f(x)=ax+b,输出的维度是1,Dense 的输出数据为1。
输入的数据 input_shape 的形状,输入的数据为1维的数据,x=data.Education只有一个变量,所以 input_shape=(1,)))模型建立完成。
x=data.Education
y=data.Income
model =tf.keras.Sequential()
model.add(tf.keras.layers.Dense(1,input_shape=(1)))
4、Model.summary() 会反映模型正确的形状。模型为 Dense 层,Out Shape 显示为(None,1),对于(None,1)这个神经网络的第一个维度代表样本的维度。如果输入样本100个那么 None 为100。输入的样本不一定,如果做成一个批次一个批次的输进去,比如50,50那么就会变成50。
注意第一个维度代表样本的个数,在建立模型时不需要去考虑,第二个维度代表输出的维度。Param 有两个参数,输出为1。
Dense 根据输入把维度1的变换成 ax+b,初始化了两个变量第一个作为权重乘以参数 w+ 自己初始化的变量得到一个输出值。输出是预测值。建立好一个 model。
model.add(tf.keras.layers.Dense(1,input_shape=(1,)))
model.summary()
Model:"sequential"
5、对 model 进行编译,编译可认为是一个配置的过程,使用梯度下降算法对损失函数进行优化,梯度下降算法的原理和方法后面会讲到。model.compile使用(optimizer=‘adam‘)tensorflow 有很多优化方法,沿着梯度下降的方法会计算梯度去改变变量的值从而求出变量的最小值,最常用的 adam 方法需要知道优化的损失函数 loss 值是什么,使用均方差简写 mse,优化的目标是 loss 全部抽象化,直接用字符串标志使用的方法。模型编译完成。
模型训练使用 history=model.fit(x,y),输入x,y值,训练的过程是不断逼近a,b最小值的过程,所以训练的循环要多次。epochs 代表所有数据的训练次数 history=model.fit(x,y,epochs=5000)。loss 的值开始是6073会不停的下降,到5000次下降到248。通过优化算法使得 loss 的值下降。
model.compile(optimizer='adam',
loss=' mse'
)
history=model.fit(x,y,epochs=5000)
Epoch 1/5000
30/30[==============================]-0s2ms/sample-loss:6073.6528
Epoch 2/5000
30/30[==============================]-0s327us/sample-loss:6070.9722
Epoch 3/5000
30/30[==============================]-0s53us/sample-loss:6068.2915
Epoch 4/5000
30/30[==============================]-0s32us/sample-loss:6065.6123
Epoch 4997/5000
30/30[==============================]-0s33us/sample-loss:249.2703
Epoch 4998/5000
30/30[==============================]-0s33us/sample-loss:249.0830
Epoch 4999/5000
30/30[==============================]-0s33us/sample-loss:248.8958
Epoch 5000/5000
30/30[==============================]-0s33us/sample-loss:248.7089
二.预测收入
使用 model 来预测用 model.predict(x),loss 的值是一种 pd.Series。
In : model.predict(x)
Out:array([[27.074318],
[28.011703],
[29.042831],
[29.980217],
[30.917603],
[31.948729],
[32.886112],
[33.8235 ],
预测未知年限使用 model.predict(pd.Series)([20])
model.predict(pd.Series([20]))
array([[50.430862]],dtype=float32)