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)——关心对正确类别的预测概率,因为只要其值足够大,就可以确保分类结果正确。