网站 关键字 标签,圣沃工程建设工程公司网站,网站如何做浏览量,外包加工拿货网写在前面
基于亚马逊的MXNet库本专栏是对李沐博士的《动手学深度学习》的笔记#xff0c;仅用于分享个人学习思考以下是本专栏所需的环境#xff08;放进一个environment.yml#xff0c;然后用conda虚拟环境统一配置即可#xff09;刚开始先从普通的寻优算法开始#xff…写在前面
基于亚马逊的MXNet库本专栏是对李沐博士的《动手学深度学习》的笔记仅用于分享个人学习思考以下是本专栏所需的环境放进一个environment.yml然后用conda虚拟环境统一配置即可刚开始先从普通的寻优算法开始熟悉一下学习训练过程下面将使用梯度下降法寻优但这大概只能是局部最优它并不是一个十分优秀的寻优算法
name: gluon
dependencies:
- python3.6
- pip:- mxnet1.5.0- d2lzh1.0.0- jupyter1.0.0- matplotlib2.2.2- pandas0.23.4整体流程
生成训练数据集实际工程中需要从实际对象身上采集数据确定模型及其参数输入输出个数、阶次偏置等确定学习方式损失函数、优化算法学习率训练次数终止条件等读取数据集不同的读取方式会影响最终的训练效果训练模型
完整程序及注释
from IPython import display
from matplotlib import pyplot as plt
from mxnet import autograd, nd
import random
获取(生成)训练集input_num 2 # 输入个数
examples_num 1000 # 生成样本个数
# 确定真实模型参数
real_W [10.9, -8.7]
real_bias 6.5 features nd.random.normal(scale1, shape(examples_num, input_num)) # 标准差1均值缺省0
labels real_W[0]*features[:,0] real_W[1]*features[:,1] real_bias # 根据特征和参数生成对应标签
labels_noise labels nd.random.normal(scale0.1, shapelabels.shape) # 为标签附加噪声模拟真实情况# 绘制标签和特征的散点图矢量图
# def use_svg_display():
# display.set_matplotlib_formats(svg)# def set_figure_size(figsize(3.5,2.5)):
# use_svg_display()
# plt.rcParams[figure.figsize] figsize# set_figure_size()
# plt.scatter(features[:,0].asnumpy(), labels_noise.asnumpy(), 1)
# plt.scatter(features[:,1].asnumpy(), labels_noise.asnumpy(), 1)
# plt.show()# 创建一个迭代器确定从数据集获取数据的方式
def data_iter(batch_size, features, labels):num len(features)indices list(range(num)) # 生成索引数组random.shuffle(indices) # 打乱indices# 该遍历方式同时确保了随机采样和无遗漏for i in range(0, num, batch_size):j nd.array(indices[i: min(ibatch_size, num)]) # 对indices从i开始取取batch_size个样本并转换为列表yield features.take(j), labels.take(j) # take方法使用索引数组从features和labels提取所需数据
训练的基础准备# 声明训练变量并赋高斯随机初始值
w nd.random.normal(scale0.01, shape(input_num))
b nd.zeros(shape(1,))
# b nd.zeros(1) # 不同写法等价于上面的
w.attach_grad() # 为需要迭代的参数申请求梯度空间
b.attach_grad()# 定义模型
def linreg(X, w, b):return nd.dot(X,w)b# 定义损失函数
def squared_loss(y_hat, y):return (y_hat - y.reshape(y_hat.shape)) **2 /2# 定义寻优算法
def sgd(params, learning_rate, batch_size):for param in params:# 新参数 原参数 - 学习率*当前批量的参数梯度/当前批量的大小param[:] param - learning_rate * param.grad / batch_size# 确定超参数和学习方式
lr 0.03
num_iterations 5
net linreg # 目标模型
loss squared_loss # 代价函数损失函数
batch_size 10 # 每次随机小批量的大小
开始训练for iteration in range(num_iterations): # 确定迭代次数for x, y in data_iter(batch_size, features, labels):with autograd.record():l loss(net(x,w,b), y) # 求当前小批量的总损失l.backward() # 求梯度sgd([w,b], lr, batch_size) # 梯度更新参数train_l loss(net(features,w,b), labels)print(iteration %d, loss %f % (iteration1, train_l.mean().asnumpy()))
# 打印比较真实参数和训练得到的参数
print(real_w str(real_W) \n train_w str(w))
print(real_w str(real_bias) \n train_b str(b))具体程序解释
param[:] param - learning_rate * param.grad / batch_size 将batch_size与参数调整相关联的原因是为了使得每次更新的步长不受批次大小的影响 具体来说当计算一批数据的损失函数的梯度时实际上是将这批数据中每个样本对损失函数的贡献累加起来。这意味着如果批次较大梯度的模也会相应增大 故更新权值时使用的是数据集的平均梯度而不是总和