在学习了机器学习的基础知识后就会有一个问题,真正的程序该如何运用这些知识呢,希望下面的内容可以帮助到你...
一.普通程序和机器学习的区别
普通程序在解决问题时采用的是告诉计算机处理数据的规则和输入值x,让计算机根据已给的规则求出输出值y。eg.已知 y = 3*x+5,输入x = 3,求 y 值
机器学习则是给定输入值x后,让计算机自己通过学习来找到处理数据的规则,通常我们在训练机器找寻规则时,会给计算机一些输入(也可以叫做“特征”)和输出值(也可以叫做“标签label”),用这些数据来训练网络。最后用一些其他的数据来验证这个网络是否能真正解决问题。
eg.现在告诉 x,y 值如下
x | 1 | 2 | 5 | 9 | 10 |
y | 12 | 14 | 20 | 28 | 30 |
我们需要计算机知道x通过什么规则得到y,其实线性问题中就是解决y = w*x+b中的w和b值
其实我们最后期望计算机可以得到 y = 2*x + 10 ,即w = 2,b = 10
二.程序编写
我们现在在编写程序时其实比想象的要简便很多,有很多框架可以选择,比如Pytorch,百度的飞浆框架.....这些框架已经构建了很多方法,我们可以引用
1.首先,我们先对框架导入。
例如以下代码:
import paddle //事先在官网上安装完毕
print("paddle" + paddle._version_) //检查版本
import torch
print(torch._version_)
只要我们事先安装好相应环境,我们就可以直接引用啦
除此之外,我们还要导入numpy(numpy是Python的一个拓展库,支持大量的维度数组与矩阵运算,对数组运算提供大量函数)
2.准备数据
我们准备好简单的环境后就可以加载数据了,如果有数据集就可以引入,现在用几个数据举一个简单的例子
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]])
//这里用了飞浆框架(paddle)中提供的函数
//paddle.to_tensor把实例数据转换为paddle的Tensor数据
补充:Tensor一般译作张量,可以看作多维数组,标量是0维张量,向量是1维张量,矩阵是2维张量.....(大家可以详细了解一下)
3.用模型进行计算
我们在计算时可以引用一些神经网络,比如我们现在要解决的是一个线性问题(y = w * x +b),那么就可以用一个简单的线性变换层(eg.paddle.nn.Linear实现计算过程)来求出w和b。
但我们在解决问题时往往不是线性问题,因此就会需要更多类型,也更复杂的网络(比如目标检测,图像识别等问题都不是线性问题)
linear = paddle.nn.Linear(in_features=1, out_features=1)
4.准备好运行(飞浆框架)
我们可以在一开始让计算机猜一个w,b,这是一个初始值,我们后期可以不断训练网络,改变w,b
w_before_opt = linear.weight.numpy().item()
b_before_opt = linear.bias.numpy().item()
print("w before optimize: {}".format(w_before_opt))
print("b before optimize: {}".format(b_before_opt))
结果:
w before optimize: -1.251381754875183
b before optimize: 0.0
5.告诉计算机如何学习
我们前面定义了一个最简单的神经网络,但是还要告诉计算机如何去学习,得到参数w,b
因为我们开始猜的参数和实际有很大差距,我们要通过损失函数,来让结果越来越正确,这个就是机器学习的过程
这里举的例子用最简单的均方误差(mean square error)作为损失函数(paddle.nn.MSELoss
);和最常见的优化算法SGD(stocastic gradient descent)作为优化算法(传给paddle.optimizer.SGD
的参数learning_rate
,你可以理解为控制每次调整的步子大小的参数)。
mse_loss = paddle.nn.MSELoss()
sgd_optimizer = paddle.optimizer.SGD(learning_rate=0.001, parameters = linear.parameters())
6.运行优化算法
total_epoch = 5000
for i in range(total_epoch):
y_predict = linear(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()))
结果:
epoch 0 loss [1705.5599]
epoch 1000 loss [7.90143]
epoch 2000 loss [1.7666904]
epoch 3000 loss [0.39501688]
epoch 4000 loss [0.08832262]
finished training, loss [0.01977889]
7.得到最终结果
机器通过一段时间的学习,得到最后的结果
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.0181875228881836
b after optimize: 9.767448425292969
w,b很接近实际值,我们可以带入新的数据来验证学习到的参数
三.小结
我们在编写机器学习的程序时也可以按照这个思路去编写,希望大家通过这篇文章有一些收获!
这里的代码都参考了飞浆的教程,大家也可以去官网学习哦