DEEPLearning — простая реализация линейной регрессии

глубокое обучение

Создайте свой собственный набор данных

где функции - это функции обучающих данных,

ярлыки есть ярлыки

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的样子(因为是矩阵乘法所以可知))进去

После операции признаками являются входные значения, соответствующие входному формату.
метки - экспериментальные результаты, используемые для корректировки 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