DEEPLearning——线性回归的简单实现

674 阅读2分钟

自己生成数据集

其中features是训练数据特征,

labels是标签

from mxnet import autograd,nd
num_inputs =2 #二维数据
num_examples =1000 #数据总量
true_w =[2,-3.4] #W实际值
true_b=4.2 # b实际值
features = nd.random.normal(scale=1,shape=(num_examples,num_inputs)) #随机生成1000个标准差为1的数据
labels=true_w[0]*features[:,0]+true_w[1]*features[:,1]+true_b 
#实际函数定义为上述 
labels +=nd.random.normal(scale=0.01,shape=labels.shape)
# 同时添加噪音(标准差为0.01,大小就是labes的样子(因为是矩阵乘法所以可知))进去

经过操作以后features就是符合输入格式的输入值
labels 就是实验结果用来调整w用

读取数据集

from mxnet.gluon import data as gdata

batch_size =10
# 将训练数据的特征和标签组合
dataset = gdata.ArrayDataset(features,labels)
# 随机读取小批量
data_iter = gdata.DataLoader(dataset,batch_size,shuffle=True)
#shuffle随机排序

定义模型

nn就是神经网络模块,Sequential是一个串联各个层的容器。在构建的时候就是往里面加层。当数据输入时,容器中的每一层都将以此计算并将输出作为下一层的输入。

from mxnet.gluon import nn
net =nn.Sequential()
net.add(nn.Dense(1))#线性回归的输出层又叫全连接层。顾连接层是一个Dense实例,我们定义该输出个数为1

初始化模型参数

将权重参数初始化为均值为0,标准差为0.01的正太分布。 偏差参数默认值为0.00

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

定义损失函数

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

选用平方损失又称为L2范数损失

定义优化算法

利用gluon创造Trainer实例,用collect_params获取全部参数,
选用sgd(小批量随机梯度下降)优化算法

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

训练模型

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() #l.backward()就是求其雅克比矩阵,各参数的梯度,以此学习
        trainer.step(batch_size)
    l= loss(net(features),labels)
    print("epoch %d, loos:%f" % (epoch,l.mean().asnumpy()))

把l.backward()删除后

UserWarning                               Traceback (most recent call last)
<ipython-input-14-dd30099604ae> in <module>
      5             l = loss(net(X),y)
      6 
----> 7         trainer.step(batch_size)
      8     l= loss(net(features),labels)
      9     print("epoch %d, loos:%f" % (epoch,l.mean().asnumpy()))

c:\programdata\miniconda3\envs\gluon\lib\site-packages\mxnet\gluon\trainer.py in step(self, batch_size, ignore_stale_grad)
    289 
    290         self._allreduce_grads()
--> 291         self._update(ignore_stale_grad)
    292 
    293     def allreduce_grads(self):

c:\programdata\miniconda3\envs\gluon\lib\site-packages\mxnet\gluon\trainer.py in _update(self, ignore_stale_grad)
    371                             "call step with ignore_stale_grad=True to suppress this "
    372                             "warning and skip updating of Parameters with stale gradient" \
--> 373                             %(param.name, str(data.context)))
    374 
    375             if self._kvstore and self._update_on_kvstore:

UserWarning: Gradient of Parameter `dense0_weight` on context cpu(0) has not been updated by backward since last `step`. This could mean a bug in your model that made it only use a subset of the Parameters (Blocks) for this iteration. If you are intentionally only using a subset, call step with ignore_stale_grad=True to suppress this warning and skip updating of Parameters with stale gradient