跟王小美与三岁一起学paddle — 王小美的第一个机器学习程序

简单有趣带你helloworld

跟王小美与三岁一起学paddle 第二讲

有的同学可能会疑惑,怎么没有讲广播机制?有关广播机制章节的内容我们会在用到的时候补充,敬请期待

致读者

在看这个notebook的你,对没错就是你

关注王小美喵,点个star⭐谢谢喵

王小美:
终于要开始学习深度学习了吗? 我已经迫不及待了(p≧w≦q)
三岁:
来我给你出个简单的编程题 ̄ω ̄=

出租车问题

我们乘坐出租车的时候,会有一个10元的起步价,只要上车就需要收取。出租车每行驶1公里,需要再支付每公里2元的行驶费用。当一个乘客坐完出租车之后,车上的计价器需要算出来该乘客需要支付的乘车费用。请你打印出乘客分别乘车从1公里到20公里费用

王小美:

这个简单我会 (★ᴗ★)

1
2
3
4
Kilometers = [1.0, 3.0, 5.0, 9.0, 10.0, 20.0]
for i in Kilometers:
money = 10 + 2*i
print(money)
12.0
16.0
20.0
28.0
30.0
50.0
三岁:
不错,看来你已经学会使用编程来解决问题了(★>U<★)

但是如果我没有告诉你计费规则,而是给你每个公里数对应的费用你们算出其他公里数对应的费用吗?\( ̄︶ ̄)/

王小美:
啊这? 我虽然可以自己找出规律,然后编写程序来解决这个问题,但是我不知道怎么让计算机找出规律,终究还是需要人脑的参与ε(┬┬﹏┬┬)3

░ ∗ ◕ ں ◕ ∗ ░ 所以三岁老师是不是要教我用机器学习的方法来解决这个问题了

三岁:
是的,让我们学起来吧!

使用深度学习方法解决问题

深度学习的步骤一般为以下几步哦!

1.数据处理

2.模型构建

3.训练调参

4.模型验证

5.模型部署

1.数据处理

数据处理一般有 划分数据集 数据增强等

1
2
3
4
5
6
7
8
9
10
# 导入paddle
import paddle
import numpy as np
paddle.__version__

# 编辑数据
x_data = paddle.to_tensor([[1.], [3.0], [5.0], [9.0], [10.0], [20.0]])
y_data = paddle.to_tensor([[12.], [16.0], [20.0], [28.0], [30.0], [50.0]])
print("x_data = ",x_data)
print("y_data = ",y_data)
x_data =  Tensor(shape=[6, 1], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [[1. ],
        [3. ],
        [5. ],
        [9. ],
        [10.],
        [20.]])
y_data =  Tensor(shape=[6, 1], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [[12.],
        [16.],
        [20.],
        [28.],
        [30.],
        [50.]])

2.模型构建

组网函数介绍

paddle.nn

paddle.nn 目录下包含飞桨框架支持的神经网络层和相关函数的相关API
详细内容请参考paddle的api文档

本次使用线性变换层(Linear)

paddle.nn.Linear

线性变换层。对于每个输入 Tensor X,计算公式为:

Out=XW+b

Linear 层只接受一个 Tensor 作为输入,形状为 [batch_size,∗,in_features],其中 ∗ 表示可以为任意个额外的维度。

该层可以计算输入 Tensor 与权重矩阵 W 的乘积,然后生成形状为 [batch_size,∗,out_features] 的输出 Tensor。 如果 bias_attr 不是 False,则将创建一个偏置参数并将其添加到输出中。

参数

in_features (int) – 线性变换层输入单元的数目。

out_features (int) – 线性变换层输出单元的数目。

weight_attr (ParamAttr,可选) – 指定权重参数的属性。默认值为 None,表示使用默认的权重参数属性,将权重参数初始化为 0。具体用法请参见 ParamAttr 。

bias_attr (ParamAttr|bool,可选) – 指定偏置参数的属性。bias_attr 为 bool 类型且设置为 False 时,表示不会为该层添加偏置。bias_attr 如果设置为 True 或者 >
None,则表示使用默认的偏置参数属性,将偏置参数初始化为 0。具体用法请参见 ParamAttr。默认值为 None。

name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None。

属性

weight

本层的可学习参数,类型为 Parameter 。

bias

本层的可学习偏置,类型为 Parameter 。

三岁:
让我们来试试吧 ٩(◕‿◕。)۶
1
linear = paddle.nn.Linear(in_features=1, out_features=1)  # 定义初始化神经网络
1
2
3
4
5
6
7
8
9
# 查看初始化策略
# w 的值会先进行随机生成
# b 的值会先以0进行代替

w_before_opt = linear.weight.numpy().item() # 获取w的值
b_before_opt = linear.bias.numpy().item() # 获取b的值

print("w before optimize: {}".format(w_before_opt))
print("b before optimize: {}".format(b_before_opt))
w before optimize: 0.21255211532115936
b before optimize: 0.0

损失函数

现在的神经网络类似于我们的无情答卷人疯狂做题但是有不知道对错,怎么办???

现在需要一个损失函数:相当于改卷人

需要一个优化策略:相当于看到错误进行反思然后进行修改的好孩子

损失函数就是预测值与结果的偏差

此处使用的:

损失函数(平均方差(mseloss)):paddle.nn.loss.MSELoss(reduction=’mean’) 参考地址

优化算法(随机梯度下降(SGD)):class paddle.optimizer.SGD(learning_rate=0.001, parameters=None, weight_decay=None, grad_clip=None, name=None)

1
2
3
# 定义损失函数和优化策略
mse_loss = paddle.nn.MSELoss(reduction='mean')
sgd_optimizer = paddle.optimizer.SGD(learning_rate=0.001, parameters = linear.parameters())

3.训练和调参

1
2
3
4
5
6
7
8
9
10
11
12
total_epoch = 10000  # 运行轮数
for i in range(total_epoch):
y_predict = linear(x_data)
loss = mse_loss(y_predict, y_data)
loss.backward() # 自动对损失函数求导(梯度)
sgd_optimizer.step() # 更新w和bias
sgd_optimizer.clear_grad() # 每轮都清除一次导数(梯度)

if i%1000 == 0: # 每1000轮输出一次
print("epoch {} loss {}".format(i, loss.numpy()))

print("finished training, loss {}".format(loss.numpy()))
epoch 0 loss [0.00101089]
epoch 1000 loss [0.00022613]
epoch 2000 loss [5.0662904e-05]
epoch 3000 loss [1.13599e-05]
epoch 4000 loss [2.6291857e-06]
epoch 5000 loss [6.5847786e-07]
epoch 6000 loss [1.5586754e-07]
epoch 7000 loss [1.5586754e-07]
epoch 8000 loss [1.5586754e-07]
epoch 9000 loss [1.5586754e-07]
finished training, loss [1.5586754e-07]
三岁:
可以看到在7000 epoch 的时候loss就已经保持不变了 所以在7000 epoch 的时候效果最好
1
2
3
4
5
# 4.模型验证
w_after_opt = linear.weight.numpy().item()
b_after_opt = linear.bias.numpy().item()
print("w after optimize: {}".format(w_after_opt))
print("b after optimize: {}".format(b_after_opt))
w after optimize: 2.0000507831573486
b after optimize: 9.999356269836426
三岁:

我们来对一下答案

b为bias 既出租车起步价 w为权重 既出租车每公里加价

原题目中 b为10 w为2
可以看到我们的输出结果已经非常接近了

王小美:
原来如此谢谢三岁老师,原来机器是这样学习的啊 ( ̄▽ ̄)ノ

我以后也要炼出厉害的ai

4.模型部署

这块内容可以通过看别人的部署项目来了解

这边推荐大家一个paddle的快速部署套件fastdeploy

作者简介

ID:Flose(是不迷失的意思,拖延症有点严重想让自己自律点)

School:浙大宁波理工学院

专业:自动化

深度学习菜狗,正在不断努力,咱们一起加油