keras深度学习笔记-神经网络数学基础
keras深度学习笔记-神经网络数学基础
神经网络的小测试:mnist
图像的数量和大小;(shape)
有图有label;(就像一个问题对应一个答案)
models.sequential()(就像是建立网络的前言,–我要开始叠积木了)
网络结构:
隐藏层一列代码;
最后的softmax输出层一列代码;
一个神经元,就像是传递参数的一个接口;(很像大脑里的一个神经元一样,传递的是电信号,而计算公式就像是神经递质)
每个神经元,都要使用前一层的所有参数,进行计算权重。(计算权重的过程是技术的核心部分,只需了解即可,而我们是要使用它的应用)
softmax更像是把所有可能性中,选择可能性最大的(而这种可能性是通过前面的计算权重得到的)
问题:
网络结构是怎么设定的?有没有对图片的大小不同,会有不同的对应的规则。
不同的照片,是不同的输入;但最后都是被数据拉长(reshape)了的。
input_shape就是根据图片的大小而定的;而每一行就是一个神经网络层。(搭建网络的方式都是一样的,只不过是参数不同,实现的计算不同,所以定义的网络名称也就不一样)
计算参数:
其中的(784+1)*512中的1,表示的是截距项。
参数计算检验:
搭建网络:
训练网络:
优化器:
SGD:
随机梯度,每次丢一个样本进去,然后计算梯度。
adam:
考虑梯度之后,考虑动量。
rmsprop:
考虑梯度和梯度的平方,衡量二次微分的概念。
损失函数:
比对测试结果和正确结果的误差;用于回代训练
只要是多元分类的话,就用:
正确率:
准备图像数据:
数据的变换是为了迎合网络的输入要求;便于权重的计算和回代。
问题:
把数据拉长(reshape)的目的是什么?
答:因为网络要的不是一个图片,而是图片上的像素点的值;就像在MATLAB中,需要做的是索引的切换,而深度学习中更加智能化,把数据拉长,拉长的过程中设定的原先数据的大小,它会自动索引定位;如此一来,便于网络权重的计算。
准备标签
所谓的标签处理,就是每个分类,它会将其处理为如下图:
这样的话,每个类别会有不同的表示,而每个位置的概率不同,根据softmax就能判断出最后的结果是什么值。
批处理:
如果一次只放一张图片就开始计算权重,有点太费周章,所以就设置了批处理,一批好几张好几张的进行计算,这样的话就能更快的处理、计算权重以及之后的评估。
batch_size一般取2的几次方。
数据表示:
重要的事情说三遍,不要停滞在此,不要停滞在此,不要停滞在此(自己之前就是停到这块,觉得有点难,就没有往后学;一定不要钻牛角尖,这样不利于我们的学习)
不同维的张量的区分,主要是用()与[]来进行区分;
而深度学习上的数据表示,和数学上的数据表示的本质是相同的,不同的是深度学习是横着写,而数学是竖着写的,如果使用数学习惯了,那在脑子中把深度学习上的数据进行竖化,即数学化,这样就有画面感了。
区分张量维度:
ndim和shape:
一般看多维张量的话,是从后往前看的;每往前一个值,都是整个后面那一坨东西的几倍。
关键属性:
以之前的小样本的样本为例,轴的个数(维度),形状,数据类型(只需了解它们的这些属性,会用即可,不用过分纠结)
用matplotlib来显示图片
在numpy中操作张量:
使用切片来规划train和test的图片集:
使用python切片的关键,索引序号是从0开始取的。(可以把两个编号想成是,第一个编号是你第一个想要的编号,第二个编号是你第一个不想要的编号)
自己在用MATLAB之后,有深刻的体会,像Python这样,可以倒着取,是有多么的方便,之后一定要多用。
视频数据:
所谓的帧,就是幅的意思。一帧就是一幅画(明明很简单的东西,往往不必把它复杂化)
张量运算:
逐点运算,逐个元素的运算。
加运算:
逐个元素,相应位置相加。
乘运算:
广播机制:
打破了数学上定义的,不同规格的矩阵不能运算的定律,把不同规格的矩阵给弄成规格相同的。
并且广播机制是不用声明的,而是一种约定俗成的“潜规则”。
报错:operands could not be broadcast together with shapes (4,5) (5,4)
也就是说(4,5) (5,4)两种格式的张量,不能够进行广播。
换句话说,就是计算的双方必须要有能通过复制而进行计算的条件。(也就是只能说是缺一轴,我才能给你补一轴;而补的方法就是通过复制,这让我想起了师兄编程中的那个复制M个候选端元)
点积:
向量点积:
矩阵乘向量点积:
此时,可以只把(3,)摆直,按照数学的方式来算
(这个时候,就会感觉广播机制有点头疼了,容易让人混淆;但是只要想着,自己想要的是什么计算就好)
矩阵乘矩阵:
(就直接按照数学矩阵点积乘运算就好)
高维矩阵乘积:
可以从后往前考虑;就把先不考虑高维的前面几维,而只考虑和后面的矩阵能够相乘的那个矩阵。(而那个矩阵一般是二维矩阵);而前面几维就可以想成是之后的相乘的叠加过程。
问题:
x.sum(axis=0)中axis是什么意思?
答:在numpy中数组都有着[]标记,则axis=0对应着最外层的[],axis=1对应第二外层的[],以此类推,axis=n对应第n外层的[]。对应的层,就像是进入到该层的意思。
例如:
np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a. sum(axis = 1)
进入到第二层:
[1,2],[3,4]],[[11,12],[13,14]
也就是说,分为两拨:[[1,2],[3,4]]为一拨,[[11,12],[13,14]]为另一拨;
sum就是在各自的一拨进行计算;而每个[]就是一个整体:
[4,6] [24,26]
变型:
reshape
转置:
(转置后的元素值,是可以通过位置坐标转置而回代到原来的坐标位置的;)
梯度:
线性组合+截距,经过非线性激活函数,成为下一层的输入。
算最小值,可以使用使导数为0,然后对二阶导进行判断,看是否为最小值。
放数据,预测出值,与真实值比较后会得到损失函数,然后反向传播,进行网络修正。
y对所有的解释向量求偏微分,然后集合成矩阵,就是梯度。(用数学的角度来说,就是你站在一个曲面的一点上,然后往四周看哪里是最小值或最大值,然后往这个值最陡的方向就是梯度;就是那个最陡的坡,想要快点下去或上来)
牛顿法,进行不断逼近;
学习率:
此处的η即是学习率;学习率的设定是很有考究的,设小了,训练太慢;设大了,会错过那个最值。(学习率也可以考虑成一种,下次点移动的步长)
考虑动量的优化器:
在经过一个“小沟”时,能够撑过去,继续前进;而不会卡在那里。
优化器的综述:an overview of gradient descent optimization algorithms
考虑动量:Adam
不考虑动量:rmsprop
反向传播
李宏毅课程:adl*mlds lecture2 youtube
实例:
#梯度下降的小示例
def fn(x):
fn=x ** 2
return fn
def derivate(x):
h=0.001
derivate=(fn(x + h) - fn(x - h)) / (2 * h)
return derivate
eta = 0.01
num_iterate = 1000
x=2
x_value = [x]
fn_value = [fn(x)]
#经历1000次的迭代;模拟梯度下降的过程
for i in range(num_iterate):
x -= eta * derivate(x)
x_value.append(x)
fn_value.append(fn(x))
#设定显示梯度下降图像的坐标值
y = np.max(np.abs(x_value))#确定x范围的最大值,以保证跌宕的x范围能包围住
z = np.linspace(-y, y, num_iterate)#均分1000份
#开始画图
plt.plot(x_value, fn_value, 'bo')
plt.plot(z, fn(z), 'r')
plt.xlabel("x")
plt.ylabel("Function Value")
plt.show()