首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

动手深度学习:线性回归

之前我们把 MXNet 环境配置中好了之后,我们今天来体验一下第一个实例:线性回归

你也许会问,线性回归也可以深度学习嘛?

其实线性模型是最简单的神经网络模型。神经网络是由若干节点(神经元)和有向边组成的集合,我们把其中一些节点作为层,每一层都从前一层获取输入,然后输出给后一层使用,而我们的线性回归就是一个两层神经网络。

换做数学公式就是:$$Y = Xw + b$$这里我们就用一个线性回归的栗子来体验一下 MXNet 模拟线性回归的过程,x 为长度 2 的向量,y 是长度为 1 的向量:

OK,Let‘s do it.

创建数据集

首先我们生成一堆数据集用来训练用,生成用上述的公式:

这里 noise 符合标准差为 0.01 的正态分布

我们生成 1000 个样本,代码如下:

解释一下

这里 函数负责帮我们根据向量形状随机生成样本值,例如上述:

首先根据 x 向量的形状生成 1000 组长度为 2 的 x 向量;

其次根据 y 的形状生成正太分布的 noise;

最后根据 x 向量和 noise 生成 y 向量。

好了,我们现在生成了 1000 组样本,我们可以用 Python 绘图包 ,分别生成 X[:,0]、X[:,1] 和 Y 的散点图:

形状大概是下面这个样子的。

读取数据

上面我们生成了样本集,我们现在需要从样本集中抽样进行训练,在 MXNet 框架中可以使用 gulon 的 data 模块来读取数据,假设我们一次从样本集合中取出 10 个样本进行计算。

定义模型

在 MXNet 中预定义了大量层,记得我们之前说过线性回归是一个两层神经网络,且就像之前画的图一样,所有输入的节点与后续节点相连,这样的线性模型在 MXNet 中对应的就是 层。

而我们在构建模型的时候只需要选择不同的层组合,并用一种方式让各层串联起来形成神经网络。MXNet 中有一种简单的连接方式叫做 Sequential 。

Sequential 会依次执行每一层,将上一层的输出作为输入提供给下一层

好了,我们现在来定义模型。首先定义一个使用 Sequential 的空模型。

然后我们在这个模型中加入层,也就是我们线性回归模型对应的 Dense 层。Dense 层唯一需要指定的就是输出节点的个数,咱们这个栗子中,输出节点就是 1。

注意,我们这里并没有指定这个层输入节点有多少,它会在我们给数据的时候自动识别。

初始化模型参数

原则上我们需要指定模型的各个参数,这里我们采用默认的随机初始化方法。

损失函数

我们需要定义一个损失函数来衡量预测目标和真实目标之间的差距,这里我们使用常见的平方误差。

优化

然后我们定义一个优化函数,我们可以把它理解成训练器,让预期目标不断接近真实目标。这里采用的是随机梯度下降(SGD)算法,并定义学习率是 0.1(PS:每一步,我们将模型参数沿着梯度的反方向走特定距离,这个距离一般叫学习率(learning rate)) 。

不理解随机梯度下降可以自行 Google 哟

训练

终于到了训练部分了,一般我们在训练的过程中需要迭代数据数次,每一次迭代中,我们随机读取固定个数据,计算梯度并更新模型的参数。在 MXNet 中我们用 函数来更新模型,这里我就迭代 5 次,每次取 10 组数据来训练一下。

训练结果

训练完我们来看看训练结果。

在咱们这个两层神经网络中,我们需要的是训练的 x 的参数,也就是第一层的参数。

结语

至此,我们的第一个深度学习栗子:线性回归就完成了。

完整代码在这里:https://github.com/MrNullPoint/MXNet/tree/master/LinearRegression

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180302G1M1E500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com