MXNet学习6——Linear Regression

本文介绍如何使用MXNet实现线性回归模型。通过准备训练数据、定义模型、训练模型等步骤,展示MXNet的基本使用流程。并演示如何评估模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要

前面的文章介绍了MXNet的基础知识,类似于语法知识,这一节介绍MXNet使用机器学习的一个基本模型–线性回归。线性回归内部的具体实现不会涉及,我们是在上层使用,而MXNet这类的深度学习框架意义就在这里。官方代码请点击这里

正文

import numpy as np
import mxnet as mx

准备数据

MXNet使用的数据是Data Iterators形式,下面的代码展示了如何将数据集编码成MXNet可以使用的迭代器。在示例中使用的数据是由二维数据点与相应的整数标签构成。需要学习的函数是:

y=x1+2x2
其中 (x1,x2) 是一组数据训练数据,y是对应的标签

#Training data
train_data = np.array([[1,2],[3,4],[5,6],[3,2],[7,1],[6,9]])
train_label = np.array([5,11,17,7,9,24])
batch_size = 1

#Evaluation Data
eval_data = np.array([[7,2],[6,10],[12,2]])
eval_label = np.array([11,26,16])

上面的代码中我们生成了训练的数据,接下来我们需要将其装载如一个迭代器中,同时制定一些参数,比如定义数据迭代器每次迭代的数据量的 ‘batch_size’,以及是否将数据打乱的 ‘shuffle’。

###请注意使用最新版本的MXNet,0.7版本下面的代码会报错
train_iter = mx.io.NDArrayIter(train_data,train_label, batch_size, shuffle=True,label_name='lin_reg_label')
eval_iter = mx.io.NDArrayIter(eval_data, eval_label, batch_size, shuffle=False)

我们使用了NDArrayIterater,这个会迭代生成一个numpy 数组。一般的,根据数据形式的不同,MXNet中可选择多种不同的迭代器,详细了解请点击这里

MXNet Classes

这里我们稍微复习一下基础的内容,如果之前没有讲到正好这里说明一下

  • 模型种类(Model Class):MXNet中用来定义模型的实体整体。它包含我们想要最小化的变量,训练数据和标签以及一些额外的参数,如学习率和优化算法,而这些是在模型层面定义的。
  • 符号(Symbols):实际的MXNet的网络是用符号来定义的。MXNet有许多不同类型的符号,比如数据占位符,神经网络层,损失函数等,这些是根据需要来的
  • IO:正如我们已经见到的一样,IO 类作用于数据并且执行操作,例如将数据分成批和打乱

Defining the Model

MXNet使用符号来定义模型,符号是模型的组件用来构建不同的模型。一些符号定义如下:

  • 变量(Variables):变量是数据的占位符,用来事先定义一个之后训练网络时会填充训练数据或标签的地方
  • 神经网络层(Neural Network Layers):神经网络层或任何其他类型的模型也由符号定义。神经网络层使用上一个符号作为输入,在其上做一些转换然后生成一个输出。一个符号的例子是”Fully Connected”,它定义了一个网络的一个全连接层
  • 输出符号(Output Symbols):MXNet中用来定义损失。名称的后缀会带上”Output”,比如SoftmaxOutput 层。用户可以自己定义损失函数。已存的一些损失函数包括LinearRegressionOutput,计算输入符号和实际标签间的L2损失;SoftmaxOut,计算交叉熵

上面描述的那些,以及其他符号被一个接一个地链接,作为彼此的输入,以创建网络拓扑。
符号一个个连接起来,彼此的输出作为下一个的输出,构成整个网络拓扑。关于不同符号的更多信息请点这里

X = mx.sym.Variable('data')
Y = mx.symbol.Variable('lin_reg_label')
fully_connected_layer  = mx.sym.FullyConnected(data=X, name='fc1', num_hidden = 1)
lro = mx.sym.LinearRegressionOutput(data=fully_connected_layer, label=Y, name="lro")

上面的网络使用了如下层:

  • 全连接(FullyConnected):表示神经网络的一个全连接层,中间没有激活函数,本质上是作用在输入参数上的线性回归,参数如下:
    • data:层的输入
    • num_hidden:隐藏层的维数,这里明确了输出层的大小
  • 线性回归输出层:在MXNet中输出层旨在实现损失的计算。在这个例子中,损失是实际标签和计算结果标签的L2损失,参数如下:
    • data:层的输入
    • Label:训练标签,用来计算L2损失

注意–命名约定:标签变量的名称应该与训练参数迭代器中的 label_name 参数相同。默认的值是 ‘sofmax_label’,但是我们这里定义的是 ‘lin_reg_label’。可以看到Y = mx.symbol.Variable(‘lin_reg_label’) 和 train_iter = mx.io.NDArrayIter(…, label_name=”lin_reg_label”)中的名称是一样的

最后,网络存储在Module上。Module中定义将要被最小化的符号值(比如这里的 lro 或者 lin_reg_output),优化过程中的学习率和训练模型时迭代的次数

model = mx.mod.Module(
    symbol = lro ,
    data_names=['data'], 
    label_names = ['lin_reg_label']# network structure    
)

看看网络长什么样子

mx.viz.plot_network(symbol=lro).view()

这里写图片描述

Training the model

一旦我们定义好模型,接下来就是训练参数了,我们使用Module class中的fit()函数

model.fit(train_iter, eval_iter,
            optimizer_params={'learning_rate':0.01, 'momentum': 0.9},
            num_epoch=1000,
            batch_end_callback = mx.callback.Speedometer(batch_size, 2))

Using a trained model: (Testing and Inference)

一旦我们训练好一个模型,我们就可以在上面做很多事情了。我们可以用来预测,在测试集上评价模型好坏。

#Inference
print(model.predict(eval_iter).asnumpy())

array([[ 11.],
[ 26.],
[ 16.]], dtype=float32)

我们也可以用一些评价指标来评价模型,这里我们使用均方误差来评价

#Evaluation
metric = mx.metric.MSE()
model.score(eval_iter, metric)
print(metric.get())

[(‘mse’, 0.0)]

上面的测试数据都是十分完美的,现在我们加入一些噪声,然后看看均方误差的变化

#Evaluation Data
eval_data = np.array([[7,2],[6,10],[12,2]])
eval_label = np.array([11.1,26.1,16.1]) #Adding 0.1 to each of the values 
eval_iter = mx.io.NDArrayIter(eval_data, eval_label, batch_size, shuffle=False)

model.score(eval_iter, metric)
print(metric.get())

[(‘mse’, 0.010000076144933701)]

当然,你也可以自己定义评价指标,更多的信息请点击这里

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值