b站——沐神——深度学习

预备知识

数据操作

MXNet

nd:(array函数:得到NDArray)

[[1. 1. 1.]

 [1. 1. 1.]]

<NDArray 2x3 @cpu(0)>

np:(asnumpy函数:得到NumPy)

array([[1., 1., 1.],

       [1., 1., 1.]], dtype=float32)

 

NDArray类:存储和变换数据(通过array函数和asnumpy函数令数据在NDArray和NumPy格式之间相互变换)(nd和np)

  • 常将NDArray实例直接称作NDArray
  • NumPy的多维数组非常类似,但NDArray提供GPU计算和自动求梯度等更多功能,这些使NDArray更加适合深度学习
  • x=nd.arange(12)函数:创建一个行向量,从0-11
  • x.shape : shape属性来获取NDArray实例的形状
  • a = nd.ones(shape=1000):1000维的向量a
  • x.size  : size属性得到NDArray实例中元素的总数
  • X = x.reshape((3, 4)):改变形状,3行4列;可写成x.reshape((-1, 4))或x.reshape((3, -1))
  • nd.zeros((2, 3, 4)):创建张量,各元素为0,形状为(2, 3, 4)。向量和矩阵都是特殊的张量
  • nd.ones((3, 4)):各元素为1.

  • Y = nd.array([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]):通过Python的列表(list)指定需要创建的NDArray中每个元素的值。

  • nd.random.normal(0, 1, shape=(3, 4)):随机生成NDArray中每个元素的值,每个元素都随机采样于均值为0、标准差为1的正态分布。(均值为0、标准差为0.01的正态随机数)

  • nd.dot(X, Y.T):矩阵乘法。

  • nd.concat(X, Y, dim=0), nd.concat(X, Y, dim=1):将多个NDArray连结(concatenate)。分别在行上(维度0,即形状中的最左边元素x/y竖着拼接)和列上(维度1,即形状中左起第二个元素x+y横着拼接)连结两个矩阵。

  • X == Y:使用条件判断式可以得到元素为0或1的新的NDArray。数值相等的位置的值为1,不等则为0;

  • X.sum():所有元素求和得到只有一个元素的NDArray。如[66.]

  • X.norm().asscalar():(通过asscalar函数将结果变换为Python中的标量)这里求X的 L2范数(平方和,再开根号) 结果同上例一样是单元素NDArray,但最后结果变换成了Python中的标量,如22.49442.

  • 也可以把Y.exp()X.sum()X.norm()等分别改写为nd.exp(Y)nd.sum(X)nd.norm(X)

 

广播机制:两个形状不同的NDArray按元素运算时,先适当复制元素使这两个NDArray形状相同后再按元素运算。

 

索引  (从0开始, 左闭右开)

  • X[1:3] : 截取了矩阵X中行索引为1和2的两行.

  • X[1, 2] = 9 : 索引并赋值替换一个元素。

  • X[1:2, :] = 12:索引一部分元素并全部赋值。第二行数值全部替换成12.

自动求梯度

  • x = nd.arange(4).reshape((4, 1)):先创建变量x,并赋初值。
  • x.attach_grad():先调用 attach_grad 函数来申请存储梯度所需要的内存。
  • with autograd.record() : y = 2 * nd.dot(x.T, x) :调用record函数来要求MXNet记录与求梯度有关的计算. (默认条件下MXNet不会记录用于求梯度的计算)

  • y.backward():自动求梯度(如果y不是一个标量,MXNet将默认先对y中元素求和得到新的变量,再求该变量有关x的梯度。)

同一个模型在训练模式和预测模式下的行为并不相同,可以通过调用is_training函数来查看

  •  在调用record函数后,MXNet会记录并计算梯度。此外,默认情况下autograd还会将运行模式从预测模式转为训练模式。
  • print(autograd.is_training()) ——结果False

  • with autograd.record(): print(autograd.is_training())——结果True

查阅文档

  • dir(nd.random) : 打印模块nd.random中所有成员或属性,查找模块中的类和函数

  • help(nd.ones_like):查找函数(ones_like)和类;  (在Jupyter记事本里,我们可以使用?来将文档显示在另外一个窗口中。例如,使用nd.random.uniform?等效于help(nd.random.uniform))

深度学习

 1.线性回归-输出为连续值-房价预测,股票预测

 

线性回归基本要素:建立模型,模型训练(数据(样本-房屋,标签-真实售价,特征-用来预测标签的因素),损失函数,优化算法()),模型预测

2.softmax回归-输出为离散值-图像分类

softmax回归 与线性回归的一个主要不同在于,softmax回归的输出值个数等于标签里的类别数。

softmax回归的输出层也是一个全连接层

怎么得到离散的预测输出值:一个简单的办法是将输出值Oi当作预测类别是i的置信度,并将值最大的输出所对应的类作为预测输出,即输出argmaxOi.

             但是,直接使用输出层的输出有两个问题:1.输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。

                                2.由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量

softmax运算符(softmax operator)解决了以上两个问题——将输出值变换成值为正且和为1的概率分布。(假如三个分类目标,因为概率和为1,如果其中一个为0.8,就能确定图像是这类的概率为80%,其余两个概率就不用管),同时softmax运算不改变预测类别输出,即argmaxOi=argmaxYi.

真实标签one-hot表示:softmax运算将输出变换成一个合法的类别预测分布,真实标签也可以用类别分布表达,对于样本i,构造向量Yi,第yi个元素为1,其余为0,(向量Yi中只有一个元素为1,其余全为0,即one-hot编码)

softmax预测输出值和真实标签都用概率值表示,方便计算误差。

想要预测结果正确,其实也能用均方差误差,但均方差过于严格,我们并不需要预测概率完全等于标签概率,只需要知道其中一个的概率值比其余的大就行了。

需要使用更适合衡量两个概率分布差异的测量函数/误差函数:交叉熵(cross entropy)——关心对正确类别的预测概率,因为只要其值足够大,就可以确保分类结果正确。

posted @ 2022-08-24 14:58  ethan178  Views(157)  Comments(0Edit  收藏  举报