一个小练习:线性回归的模型:y=x1W1+x2W2+b
线性回归可以表示成一个单层的神经网络:输入层个数为2,输出层个数为1,由于输入层并不涉及计算,依照惯例,将输出层作为神经网络层数,故其层数为1
使用MXNet框架自带的包可以很容易地实现神经网络。
生成数据集:2个特征,1000例的数据集
from mxnet import autograd, nd
#生成数据集
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包来读取数据
#读取数据集
from mxnet.gluon import data as gdata
batch_size = 10
# 将训练数据的特征和标签组合
dataset = gdata.ArrayDataset(features, labels)
# 随机读取小批量的数据
data_iter = gdata.DataLoader(dataset, batch_size, shuffle=True)
# 试着读取并打印一个小批量数据集
for x, y in data_iter:
print(x, y)
break
定义模型:y=x1W1+x2W2+b
Gluon中提供了大量预定义的层,可以方便我们更好地实现神经网络
from mxnet.gluon import nn
# Sequential()为一个串联各层的容器
net = nn.Sequential()
net.add(nn.Dense(1))
# 初始化模型参数
from mxnet import init
net.initialize(init.Normal(sigma=0.01))
# 损失函数
from mxnet.gluon import loss as gloss
loss = gloss.L2Loss() # 平方损失又称L2范数损失
# 定义优化器,Trainer通过net.collect_params()获取net中的所有通过add函数添加的层的参数
from mxnet import gluon.Trainer
trainer = gluon.Trainer(net.collect_params(),'sgd',{'learning_rate':0.03})
训练神经网络:
autograd.record用来记录与求梯度有关的函数(模型),之后可通过backward函数自动求梯度。
trainer.step(batch_size)对模型中的全局变量w,b进行优化
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) # 指明批量大小
l = loss(net(features), labels)
print('epoch %d, loss:%f' %(epoch, l.mean().asnumpy()))
比较学到的模型参数和真实值的差别
# net[0]表示第一层网络
dense = net[0]
# 比较参数w,b的真实值与回归值
true_w, dense.weight.data()
true_b, dense.bias.data()