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获得需要的层,并访问其权重和位移。学到的和真实的参数很接近。
MXNET:监督学习的更多相关文章
- mxnet:背景介绍
学习的过程 使用mxnet作为教程的深度学习库,重点介绍高层抽象包gluon 双轨学习法,既教授大家从零实现,也教授大家使用gluon实现模型:前者为了理解深度学习的底层设计,后者将大家从繁琐的模型设 ...
- 监督学习 VS 无监督学习
监督学习 就是人们常说的分类,通过已有的训练样本(即已知数据以及其对应的输出)去训练得到一个最优模型(这个模型属于某个函数的集合,最优则表示在某个评价准则下是最佳的),再利用这个模型将所有的输入映射为 ...
- ubantu16.04+mxnet +opencv+cuda8.0 环境搭建
ubantu16.04+mxnet +opencv+cuda8.0 环境搭建 建议:环境搭建完成之后,不要更新系统(内核) 转载请注明出处: 微微苏荷 一 我的安装环境 系统:ubuntu16.04 ...
- MXNet设计和实现简介
原文:https://github.com/dmlc/mxnet/issues/797 神经网络本质上是一种语言,我们通过它来表达对应用问题的理解.例如我们用卷积层来表达空间相关性,RNN来表达时间连 ...
- MXNET手写体识别的例子
安装完MXNet之后,运行了官网的手写体识别的例子,这个相当于深度学习的Hello world了吧.. http://mxnet.io/tutorials/python/mnist.html 运行的过 ...
- MXNET安装过程中遇到libinfo导入不了的问题解决
今天尝试安装windows版本的MXNET,在按照官网的运行了python的setup之后,import mxnet时出现如下错误:cannot import name libinfo,在网上查找发现 ...
- MXNet学习~试用卷积~跑CIFAR-10
第一次用卷积,看的别人的模型跑的CIFAR-10,不过吐槽一下...我觉着我的965m加速之后比我的cpu算起来没快多少..正确率64%的样子,没达到模型里说的75%,不知道问题出在哪里 import ...
- MXNet学习~第一个例子~跑MNIST
反正基本上是给自己看的,直接贴写过注释后的代码,可能有的地方理解不对,你多担待,看到了也提出来(基本上对未来的自己说的),三层跑到了97%,毕竟是第一个例子,主要就是用来理解MXNet怎么使用. #导 ...
- 【Mxnet】----1、使用mxnet训练mnist数据集
使用自己准备的mnist数据集,将0-9的bmp图像分别放到0-9文件夹下,然后用mxnet训练. 1.制作rec数据集 (1).制作list
随机推荐
- hdu 2063 过山车【匈牙利算法】(经典)
<题目链接> RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partne ...
- 001.Linux网路配置
一 Linux的IP别名功能 1.1 简介 一块网卡具有多个IP地址的功能称为IP别名,即一块网卡可以绑定多个IP地址. 1.2 实现 [root@master ~]# vi /etc/sysconf ...
- Luogu
dalao们的博客a http://hzwer.com //Orz %%% https://oi-wiki.org //Orz https://www.cnblogs.com/-guz/p/9 ...
- 数据恢复工具PhotoRec
数据恢复工具PhotoRec PhotoRec是一款文件恢复工具.它可以从硬盘.光驱.记忆卡中恢复视频.文档.压缩包等文件.该工具绕开文件系统,采用文件特征码机制,直接进行底层数据扫描,尝试恢复文件. ...
- Python3.x使用PyMysql连接MySQL数据库
Python3.x使用PyMysql连接MySQL数据库 由于Python3.x不向前兼容,导致Python2.x中的很多库在Python3.x中无法使用,例如Mysqldb,我前几天写了一篇博客Py ...
- Spark MLlib 之 Vector向量深入浅出
Spark MLlib里面提供了几种基本的数据类型,虽然大部分在调包的时候用不到,但是在自己写算法的时候,还是很需要了解的.MLlib支持单机版本的local vectors向量和martix矩阵,也 ...
- Android 获得手机屏幕真实的宽高
http://stackoverflow.com/questions/1016896/get-screen-dimensions-in-pixels WindowManager w = activit ...
- iOS:针对固定数据源,更好的封装cell
一.介绍 在iOS开发中,tableView非常常用,能将其展示出来,它的数据源必不可少.当然数据源有动态下发的,有固定写死的,这里我只探讨固定写死的情况.对于死数据,我们在项目中经常遇到的场景就是我 ...
- Fibratus:一款功能强大的Windows内核漏洞利用和跟踪工具
今天给大家介绍的是一款名叫Fibratus的开源工具,广大研究人员可以使用这款功能强大的工具来进行Windows内核漏洞利用.挖掘与跟踪. Fibratus这款工具能够捕捉到绝大多数的Windows内 ...
- boost python3依赖安装
之前写过python dlib依赖的安装,当时是使用了系统默认的python2.7安装的boost.Python,如果自己编译好python3,想安装支持python3的boost.Python也是可 ...