MXNET:监督学习

线性回归

给定一个数据点集合 X 和对应的目标值 y,线性模型的目标就是找到一条使用向量 w 和位移 b
描述的线,来尽可能地近似每个样本X[i] 和 y[i]。

数学公式表示为\(\hat{y}=Xw+b\)

目标函数是最小化所有点的平方误差 \(\sum_{i=1}^{n} (\hat{y_i}-y_i)^2\)

?个神经?络就是?个由节点(神经元)和有向边组成的集合。我们? 般把?些节点组成层,每?层先从下??层的节点获取输?,然后输出给上?的层使?。要计算? 个节点值,我们需要将输?节点值做加权和(权数值即w),然后再加上?个激活函数(activation function)。这里的激活函数是\(f(x)=x\)

创建数据集: \(y=2*x[0] - 3.4*x[1] + 4.2 +noise\)

# -*- coding: utf-8 -*-
from mxnet import ndarray as nd
from mxnet import autograd

num_inputs = 2
num_examples = 1000

true_w = [2, -3.4]
true_b = 4.2

X = nd.random_normal(shape=(num_examples, num_inputs))
y = true_w[0] * X[:, 0] + true_w[1] * X[:, 1] + true_b
y += .01 * nd.random_normal(shape=y.shape)

print 'dataset'

import matplotlib.pyplot as plt
plt.scatter(X[:, 1].asnumpy(),y.asnumpy())
plt.show()

当我们开始训练神经?络的时候,我们需要不断读取数据块。这?我们定义?个函数它每次返回 batch_size 个随机的样本和对应的?标。

import random
batch_size = 10
def data_iter():
    # 产??个随机索引
    idx = list(range(num_examples))
    random.shuffle(idx)
    for i in range(0, num_examples, batch_size):
        j = nd.array(idx[i:min(i+batch_size,num_examples)])
        yield nd.take(X, j), nd.take(y, j)

for data, label in data_iter():
    print(data, label)

随机初始化模型参数,之后训练时我们需要对这些参数求导来更新它们的值,使损失尽量减小;因此我们需要创建它们的梯度。

w = nd.random_normal(shape=(num_inputs, 1))
b = nd.zeros((1,))
params = [w, b]

for param in params:
    param.attach_grad()

定义网络

def net(X):
    return nd.dot(X, w) + b

定义损失函数

def square_loss(yhat, y):
    # 注意这?我们把 y 变形成 yhat 的形状来避免矩阵形状的?动转换
    return (yhat - y.reshape(yhat.shape)) ** 2

定义优化方案,我们这?通过随机梯度下降来求解。每?步,我们将模型参数沿着梯度的反?向走特定距离,这个距离?般叫学习率(learning rate)lr

def SGD(params, lr):
    for param in params:
        param[:] = param - lr * param.grad

现在我们可以开始训练了。训练通常需要迭代数据数次,在这?使? epochs表?迭代总次数; ?次迭代中,我们每次随机读取固定数个数据点,计算梯度并更新模型参数。

epochs = 5
learning_rate = .001
niter = 0
moving_loss = 0
smoothing_constant = .01
# 训练
for e in range(epochs):
    total_loss = 0
    for data, label in data_iter():
        with autograd.record():
            output = net(data)
            loss = square_loss(output, label)
        loss.backward()
        SGD(params, learning_rate)
        total_loss += nd.sum(loss).asscalar()
        # 记录每读取?个数据点后,损失的移动平均值的变化;
        niter +=1
        curr_loss = nd.mean(loss).asscalar()
        moving_loss = (1 - smoothing_constant) * moving_loss + (smoothing_constant * curr_loss)
        if (niter + 1) % 100 == 0:
            print("Epoch %d, batch %d. Average loss: %f" % (
                epochs, niter, moving_loss))
print(params)
# output
[[ 1.99952257]
 [-3.39969802]]
<NDArray 2x1 @cpu(0)>,
[ 4.19949913]
<NDArray 1 @cpu(0)>

线性回归-使用Gluon

这里我们将使用MXNet提供的Gluon接口更方便地实现线性回归的训练。

首先生成数据集

num_inputs = 2
num_examples = 1000
true_w = [2, -3.4]
true_b = 4.2
features = nd.random_normal(scale=1, shape=(num_examples, num_inputs))
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += nd.random_normal(scale=0.01, shape=labels.shape)

读取数据,使用Gluon提供的data模块来读取数据。在每一次迭代中,我们将随机读取包含10个数据样本的小批量。

from mxnet.gluon import data as gdata
batch_size = 10
dataset = gdata.ArrayDataset(features, labels)
data_iter = gdata.DataLoader(dataset, batch_size, shuffle=True)

在前面我们需要定义模型参数,并使用它们一步步描述模型是怎样计算的。当模型结构变得更复杂时,这些步骤将变得更加繁琐。其实,Gluon提供了大量预定义的层,这使我们只需关注使用哪些层来构造模型。
首先,导入nn模块。我们先定义一个模型变量net,它是一个Sequential实例。在Gluon中,Sequential实例可以看做是一个串联各个层的容器。在构造模型时,我们在该容器中依次添加层。当给定输入数据时,容器中的每一层将依次计算并将输出作为下一层的输入。
线性回归的输出层又叫全连接层。在Gluon中,全连接层是一个Dense实例。我们定义该层输出个数为1。

from mxnet.gluon import nn
net = nn.Sequential()
net.add(nn.Dense(1))

值得一提的是,在Gluon中我们无需指定每一层输入的形状,例如线性回归的输入个数。当模型看见数据时,例如后面执行net(X)时,模型将自动推断出每一层的输入个数。

初始化模型参数,从MXNet中导入init模块,并通过init.Normal(sigma=0.01)指定权重参数每个元素将在初始化时随机采样于均值为0标准差为0.01的正态分布。偏差参数全部元素初始化为零。

from mxnet import init
net.initialize(init.Normal(sigma=0.01))

定义损失函数,从gluon引入loss模块

from mxnet.gluon import loss as gloss
loss = gloss.L2Loss()

定义优化算法,在导入Gluon后,我们可以创建一个Trainer实例,并且将模型参数传递给它。

from mxnet.gluon import Trainer
trainer = Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.03})

训练模型,我们通过调用step函数来迭代模型参数。由于变量l是batch_size维的NDArray,执行l.backward()等价于l.sum().backward()。按照小批量随机梯度下降的定义,我们在step函数中提供batch_size,以确保小批量随机梯度是该批量中每个样本梯度的平均。

num_epochs = 3
for epoch in range(1, num_epochs + 1):
    for X, y in data_iter:
        with autograd.record():
            l = loss(net(X), y)
        l.backward()
        trainer.step(batch_size)
    print("epoch %d, loss: %f"
          % (epoch, loss(net(features), labels).asnumpy().mean()))

dense = net[0]
print true_w, dense.weight.data()
print true_b, dense.bias.data()

可以从net获得需要的层,并访问其权重和位移。学到的和真实的参数很接近。

原文地址:https://www.cnblogs.com/houkai/p/9519802.html

时间: 2024-08-06 00:03:26

MXNET:监督学习的相关文章

人工智能AI:Keras PyTorch MXNet 深度学习实战(不定时更新) &#97725;

原文: http://blog.gqylpy.com/gqy/415 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

机器学习 一 监督学习和无监督学习的区别

前话: 最近一直想学机器学习的东西,无奈自己的书太多但无法专心看一本,纯理论的东西看了感觉不记下来就忘记类,所以我想理论学习和实践一起. 所以最近想把机器学习实战这本书看完,并做好记录.加油.!~ 一:什么是监督学习? 监督学习(supervised learning):通过已有的训练样本(即已知数据以及其对应的输出)来训练,从而得到一个最优模型,再利用这个模型将所有新的数据样本映射为相应的输出结果,对输出结果进行简单的判断从而实现分类的目的,那么这个最优模型也就具有了对未知数据进行分类的能力.

从零开始学习MXnet(五)MXnet的黑科技之显存节省大法

写完发现名字有点拗口..- -# 大家在做deep learning的时候,应该都遇到过显存不够用,然后不得不去痛苦的减去batchszie,或者砍自己的网络结构呢? 最后跑出来的效果不尽如人意,总觉得自己被全世界针对了..遇到这种情况怎么办? 请使用MXnet的天奇大法带你省显存! 鲁迅曾经说过:你不去试试,怎么会知道自己的idea真的是这么糟糕呢? 首先是传送门附上 mxnet-memonger,相应的paper也是值得一看的 Training Deep Nets with Sublinea

Win10 + Python + MXNet + VS2015配置

项目需要使用MTCNN来检测.对齐.剪切出人脸,它是使用MXNet作为框架的,但是我自己的Ubuntu里各种框架乱成一团,不想再添乱就铁了心要在windows里配一个.无奈网上的资料不多,挣扎了几天之后决定留下这么一份文档. 首先我们使用的不是DMLC在github上发布的那一套MXNet,它那个的windows版2016年就不更新了,现在负责维护的地址是这个: https://github.com/yajiedesign/mxnet/releases 这是一个日更的版本,非常新.巧的是MTCN

机器学习的动机与应用,监督学习与无监督学习

先抛出个例子,根据房子的面积来判断房子的价格. 什么是监督学习,大概了解就是有标准答案的训练,比如上面那个房子的问题,之前给的training examples都是一个x对应特定的y,就相当于有标准答案,这就是监督学习.supervised learning(我理解的) 无监督学习就是没有标准答案的,往往是会根据数据的某些特征分类,分群.(clustering) 强化学习 reinforcement learning,又称奖励学习,评价学习,key reward function.原理和训练狗一

什么是有监督学习和无监督学习

监督学习,就是人们常说的分类,通过已有的训练样本(即已知数据以及其对应的输出)去训练得到一个最优模型(这个模型属于某个函数的集合,最优则表示在某个评价准则下是最佳的),再利用这个模型将所有的输入映射为相应的输出,对输出进行简单的判断从而实现分类的目的,也就具有了对未知数据进行分类的能力.在人对事物的认识中,我们从孩子开始就被大人们教授这是鸟啊.那是猪啊.那是房子啊,等等.我们所见到的景物就是输入数据,而大人们对这些景物的判断结果(是房子还是鸟啊)就是相应的输出.当我们见识多了以后,脑子里就慢慢地

2nd Class_监督学习_线性回归算法

感谢博临天下,笔记太好,我就直接搬过来再添加了.http://www.cnblogs.com/fanyabo/p/4060498.html 一.引言 本材料参考Andrew Ng大神的机器学习课程 http://cs229.stanford.edu,以及斯坦福无监督学习UFLDL tutorial http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial 机器学习中的回归问题属于有监督学习的范畴.回归问题的目标是给定D维输入变量x,并且每一个

监督学习中关于线性回归问题的系统讨论

前言 本文将系统的介绍机器学习中监督学习的回归部分,系统的讲解如何利用回归理论知识来预测出一个分类的连续值. 显然,与监督学习中的分类部分相比,它有很鲜明的特点:输出为连续值,而不仅仅是标称类型的分类结果. 基本线性回归解决方案 - 最小二乘法 “给出一堆散点,求出其回归方程." -> 对于这个问题,很多领域都碰到过,而其中最为经典普遍的做法通常是: 1. 用式子表示出各个散点到回归线之间的距离之和: m 为散点数量,yi 为散点值,xi 为散点坐标,w 为回归系数向量. 2. 对上式以向

有监督学习和无监督学习

有监督学习:对具有概念标记(分类)的训练样本进行学习,以尽可能对训练样本集外的数据进行标记(分类)预测.这里,所有的标记(分类)是已知的.因此,训练样本的岐义性低. 无监督学习:对没有概念标记(分类)的训练样本进行学习,以发现训练样本集中的结构性知识.这里,所有的标记(分类)是未知的.因此,训练样本的岐义性高.聚类就是典型的无监督学习 附: 机器学习中的方法或范式(paradigm)有很多种分类体系,例如从学习的方式分,有例子中学习.类比学习.分析学习等,但一般来说,现在研究得最多.被认为最有用