• 线性回归从0实现——mxnet


     1 %matplotlib inline
     2 from IPython import display
     3 from matplotlib import pyplot as plt
     4 from mxnet import autograd, nd
     5 import random
     6 
     7 num_inputs = 2
     8 num_examples = 1000
     9 true_w = [2, -3.4]
    10 true_b = 4.2
    11 features = nd.random.normal(scale=1, shape=(num_examples, num_inputs))
    12 labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
    13 
    14 def use_svg_display():
    15     # 用矢量图显示
    16     display.set_matplotlib_formats('svg')
    17 
    18 def set_figsize(figsize=(3.5, 2.5)):
    19     use_svg_display()
    20     # 设置图的尺寸
    21     plt.rcParams['figure.figsize'] = figsize
    22 
    23 set_figsize()
    24 plt.scatter(features[:, 1].asnumpy(), labels.asnumpy(), 1);  # 加分号只显示图
    25 
    26 
    27 # 本函数已保存在d2lzh包中方便以后使用
    28 def data_iter(batch_size, features, labels):  #数据迭代器,用来存储遍历所有的子集样本
    29     num_examples = len(features)
    30     indices = list(range(num_examples))
    31     random.shuffle(indices)  # 样本的读取顺序是随机的
    32     for i in range(0, num_examples, batch_size):
    33         j = nd.array(indices[i: min(i + batch_size, num_examples)])
    34         yield features.take(j), labels.take(j)  # take函数根据索引返回对应元素
    35 
    36 batch_size=10
    37 for x,y in data_iter(batch_size,features,labels):
    38     print(x,y)
    39     break
    40 
    41 w=nd.random.normal(scale=0.01,shape=(num_inputs,1))  #c初始化模型参数
    42 b=nd.zeros(shape=(1,))
    43 
    44 w.attach_grad()
    45 b.attach_grad()  #申请求导内存
    46 
    47 def linreg(X,w,b):    #定义模型y^
    48     return nd.dot(X,w)+b
    49 
    50 def squared_loss(y_hat,y):  #定义损失函数的类型,此处为平方损失,把上面的y^放到这里,即 
    51                                #y_hat
    52     return (y_hat - y.reshape(y_hat.shape))**2/2
    53 
    54 
    55 def sgd(params,lr,batch_size):  #定义参数的更新方法,lr:学习率,params指参数有多个。
    56     for param in params:
    57         param[:]=param-lr*param.grad/batch_size
    58 
    59 ##前面定义好了所有的东西,数据读取,参数处世权值,模型,损失函数,参数更新;最后揉到一起完成训练过程。
    60 lr=0.03
    61 num_epochs = 3    #epoch,即训练一次,完成一次反向传播的过程。
    62 net = linreg
    63 loss = squared_loss
    64 for epoch in range(num_epochs):
    65     for X, y in data_iter(batch_size, features, labels):
    66         with autograd.record():
    67             l = loss(net(X, w, b), y)  # l是有关小批量X和y的损失  每一个样本求一个loss,然后给参数更新一下,最终的参数是将所有的梯度加在一起了。
    68         l.backward()  # 小批量的损失对模型参数求梯度
    69         sgd([w, b], lr, batch_size)  # 使用小批量随机梯度下降迭代模型参数
    70     train_l = loss(net(features, w, b), labels)    #最后一次迭代的损失,也即一轮结束后的损失。
    71     print('epoch %d , loss %f' % (epoch + 1, train_l.mean().asnumpy()))
  • 相关阅读:
    plsql developer中各个window的作用【转】
    回忆java输入输出流,走出误区
    JDBC中的元数据
    对于Oracle、mysql和sql server中的部分不同理解
    我对数据库事务的理解(MYSQL中)
    关于mysql的备份和恢复
    mysql触发器学习
    mysql存储过程学习
    JavaScript位运算符
    【JavaScript】数组随机排序 之 Fisher–Yates 洗牌算法
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12725322.html
Copyright © 2020-2023  润新知