以一元线性回归为例入门飞浆

引文

假如出租车费用计算如下:

1
费用 = 2 * 里程 + 2

那么,有以下里程数:

1
x = [1.], [3.0], [5.0], [9.0], [10.0], [20.0]

根据里程数和此规则,可以计算出价格:

1
y = [12.], [16.0], [20.0], [28.0], [30.0], [50.0]

这是已知自变量和对应关系,求因变量的问题。

而机器学习,是已知自变量、因变量,从中学习对应规则的问题。

因此,已知以下数据:

1
2
x = [1.], [3.0], [5.0], [9.0], [10.0], [20.0]
y = [12.], [16.0], [20.0], [28.0], [30.0], [50.0]

使用飞桨,求他们的对应关系。

导包

只使用了飞桨的包,导入命名如下:

1
2
3
import paddle
import paddle.nn as nn
import paddle.fluid as fluid

构造网络

因为是线性模型,所以使用paddle.nn.Linear

__init__函数中,随机初始化参数。w是一个随机值,b0.0

forword函数中,进行前向计算,即y = wx + b

1
2
3
4
5
6
7
8
9
10
class linearNet(nn.Linear):
def __init__(self, in_features, out_features, weight_attr=None, bias_attr=None, name=None):
super().__init__(in_features, out_features, weight_attr, bias_attr, name)
self.w_before_opt = self.weight.numpy().item()
self.b_before_opt = self.bias.numpy().item()
print("w before optimize: {}".format(self.w_before_opt))
print("b before optimize: {}".format(self.b_before_opt))

def forward(self, input):
return self.weight * input + self.bias

开始训练

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if __name__ == '__main__':
with fluid.dygraph.guard():
linear_net = linearNet(in_features=1, out_features=1, name="linear")
linear_net.train()

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]])

mse_loss = nn.MSELoss()
sgd_optimizer = paddle.optimizer.SGD(learning_rate=0.001, parameters=linear_net.parameters())

total_epoch = 5000
for i in range(total_epoch):
y_predict = linear_net(x_data)
loss = mse_loss(y_predict, y_data)
loss.backward()
sgd_optimizer.step()
sgd_optimizer.clear_grad()
if i % 1000 == 0:
print("epoch {} loss {}".format(i, loss.numpy()))
print("finished training, loss {}".format(loss.numpy()))

w_after_opt = linear_net.weight.numpy().item()
b_after_opt = linear_net.bias.numpy().item()

print("w after optimize: {}".format(w_after_opt))
print("b after optimize: {}".format(b_after_opt))
1
2
3
4
5
6
7
8
9
10
w before optimize: -0.7358073592185974
b before optimize: 0.0
epoch 0 loss [1306.1525]
epoch 1000 loss [7.9669347]
epoch 2000 loss [1.7813568]
epoch 3000 loss [0.398295]
epoch 4000 loss [0.08905686]
finished training, loss [0.01994304]
w after optimize: 2.0179829597473145
b after optimize: 9.770061492919922

从训练结果可以看到,w被预测为2.0179829597473145b被预测为9.770061492919922。接近于真实的wb210)。如果调整训练的epoch,效果可能会更好。

epoch5000增加到10000的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
w before optimize: 1.22589910030365
b before optimize: 0.0
epoch 0 loss [285.37732]
epoch 1000 loss [8.218707]
epoch 2000 loss [1.837638]
epoch 3000 loss [0.41088742]
epoch 4000 loss [0.09187372]
epoch 5000 loss [0.02054264]
epoch 6000 loss [0.0045935]
epoch 7000 loss [0.00102726]
epoch 8000 loss [0.00022973]
epoch 9000 loss [5.1476392e-05]
finished training, loss [1.1549835e-05]
w after optimize: 2.0004327297210693
b after optimize: 9.994466781616211

本文完。


下面是一些乱七八糟的碎碎念和笔记

PaddleX进行模型训练,然后生成训练好的模型,再部署到PaddleHub

任务类型 增强方法
图像分类 RandomCropRandomHorizontalFlipRandomVerticalFlipRandomRotateRandomDistort

流行的图像分类增强方法:

  • 裁剪(Crop):与缩放不同,我们只是从原始图像中随机抽样一个部分。然后,我们将此部分的大小调整为原始图像大小。这种方法通常称为随机裁剪。

  • 翻转(Flip):水平和垂直翻转

  • 旋转(Rotation):一个关键性的问题是当旋转之后图像的维数可能并不能保持跟原来一样

  • 高级增强技术:生成对抗网络

  • 缩放比例(Scale):图像可以向外或向内缩放。向外缩放时,最终图像尺寸将大于原始图像尺寸。大多数图像框架从新图像中剪切出一个部分,其大小等于原始图像。
  • 移位(Translation)
  • 高斯噪声(Gaussian Noise)

Paddle Lite:轻量化推理引擎,用于手机、IOT等

Paddle Serving:服务化部署方案

PaddleClas:图像分类套件,打通了模型开发、训练、压缩、部署全流程

开发思路:Paddle Hub -> 各领域的开发套件 -> 模型库

Paddle Hub -> PaddleClas -> 模型库

PaddleHub

PaddleClas

ResNet模型库

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×