今天学习深度学习基础。
第一节讲述的是线性回归。之前看论文的时候就见过损失函数这个名词,这一次真正了解了它的定义,在优化算法中,注意到解析解和数值解两种,其中数值解的优化算法,常用的是小批量随机梯度下降,这也是在读论文的过程中,遇到过的。
第二节是讲线性回归从零开始。对这一节的部分地方做一下笔记。
(一)首先在生成数据集的操作中,
mxnet.ndarray.random.normal(loc=0, scale=1, shape=_Null, dtype=_Null, ctx=None, out=None, **kwargs)
从正态(高斯)分布中抽取随机样本。
样本根据正态分布参数进行分布loc(平均值)和scale(标准偏差)。
(二)然后是生成散点图的操作,前面两个def操作是将use_svg_display函数和set_figsize函数定义在d2lzh包里。
由于plt在d2lzh包中是一个全局变量,我们在作图前只需要调用d2lzh.set_figsize()即可打印矢量图并设置图的尺寸。
①plt.scatter()函数原型为
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None, **kwargs)
参数的解释:
x,y:表示的是大小为(n,)的数组,也就是我们即将绘制散点图的数据点
s:是一个实数或者是一个数组大小为(n,),这个是一个可选的参数。
c:表示的是颜色,也是一个可选项。默认是蓝色’b’,表示的是标记的颜色,或者可以是一个表示颜色的字符,或者是一个长度为n的表示颜色的序列等等,感觉还没用到过现在不解释了。但是c不可以是一个单独的RGB数字,也不可以是一个RGBA的序列。可以是他们的2维数组(只有一行)。
marker:表示的是标记的样式,默认的是’o’。
cmap:Colormap实体或者是一个colormap的名字,cmap仅仅当c是一个浮点数数组的时候才使用。如果没有申明就是image.cmap
norm:Normalize实体来将数据亮度转化到0-1之间,也是只有c是一个浮点数的数组的时候才使用。如果没有申明,就是默认为colors.Normalize。
vmin,vmax:实数,当norm存在的时候忽略。用来进行亮度数据 的归一化。
alpha:实数,0-1之间。
linewidths:也就是标记点的长度。
②asnumpy().的用处是:
返回一个numpy.ndarray对象,其值从该数组中复制
(三)读取数据操作
①range(start, stop ,[step])
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
②list:列表(即动态数组)
③mxnet.ndarray.random.shuffle(data, **kwargs)
随机洗牌。
这将沿着第一轴洗牌。每个子阵列中元素的顺序不变。例如,如果给定了2D数组,行的顺序会随机改变,但每行中元素的顺序不会改变。
④yield:总的来说,yield就是一个生成器,yield和return差不多,但是yield可以记住上一次返回的位置,下一次调用接着往下执行。
⑤take:mxnet.ndarray.take(a=None, indices=None, axis=_Null, mode=_Null, out=None, name=None, **kwargs)
Takes elements from an input array along the given axis.
沿轴取数组中的元素。
当axis不是None时,此函数与“fancy”索引(使用数组索引数组 )的功能相同;但是,如果需要沿给定的元素,这样更容易使用。
如a.take(m,1)代表取每一行第m个值;a.take(m,0)代表取第m行。
总结来看这个函数的功能,将数据集均匀分开成小批量数据,每个小批量个数相同,每个批量的特征形状为(n, m),分别对应批量大小和输入个数;标签形状为批量大小。函数返回每个批量的特征和标签。
(四)最后训练模型
过程大致就是,
首先设置超参数,Ir即正数β,num_epochs是需要迭代的周期
根据小批量随机梯度下降迭代模型的过程,在每一次迭代中需要完成的是:
利用data_iter函数得到特征数组和标签数组X,y;
利用loss函数计算关于X和y的损失;
利用backward函数对l求关于模型参数的梯度;
利用是sgd函数计算得到迭代后的w和b。
一次迭代完成后,计算在得到w和b参数下得到的关于特征和标签的损失数组,然后对数组求平均值输出。
最后可以比较用来训练数据集的参数和真实的参数,发现近似相等。