一、深度学习概论
1.1 什么是神经网络
神经元代表了线性修正单元函数
1.2用神经网络进行深度学习
监督学习:已经有数据集,知道相应的输入产生怎样的输出,找出输入输出这种对应的关系
监督学习问题被分成回归和分类两类
CNN通常被用来处理图像;RNN通常被用来处理一维序列数据
结构数据:有确切的意义,而非结构数据没有,比如,音频,文章等等
1.3 为什么深度学习会兴起
数据集增多;计算能力增强;算法优化
analogy:比喻;smart grid:智能电网;diagram:图;iterate:重复;demographic:人口统计;
二、神经网络基础
2.1 二分分类
神经网络的计算过程通常有正向传播过程和反向传播过程(为什么)
计算机存储一张图片,以红绿蓝三种矩阵
2.2 逻辑回归
用在监督学习问题;输出y是0或1;
为什么要对wx+b进行sigmoid函数化(因为wx+b等价于线性函数,你不能确保输出是0-1的一个数)
2.3 逻辑回归损失函数
为了训练w和b,提出成本函数;损失函数针对单个训练样本,成本函数基于总体训练样本
discrepancy:差异;
2.4 梯度下降法
为什么使用逻辑回归的特定成本函数(因为是凸函数);梯度下降(从初始点开始往最陡的方向走一步)
w = w - * (d J(w, b)/d w);b = b - * (d J(w, b)/d b);(实际更新参数时进行的操作)
2.5 导数
函数的导数就是函数的斜率,而函数的斜率在不同的点是不同的
derivatives:导数;intuition:直观;
2.6 计算图
如何利用流程图来计算导数?
2.7 逻辑回归的梯度下降法
如何使用导数流程图来计算梯度?
运用向量化技术来解决显示使用循环带来的低效
2.8 向量化
numpy.dot(w, x);经验法则:只要有其他可能,就不要使用显示for循环;尽量使用内置函数或者其他方法去计算循环
2.9 python中的广播
对于两个不匹配的矩阵,会拓展其中一个维数少的矩阵,从而实现两个矩阵的运算
2.10 关于python/numpy向量的说明
在神经网络编程中,不要使用(n,)这样秩为1的数组(和行向量、列向量不一样);可以随意使用assert语句;也可采用reshape()方法
第二周测验:
神经元的计算过程先计算z = w*x + b,再将z作为激活函数的输入,然后产生输出;
element-wise:按元素
区分矩阵乘法(np.dot(a, b))和矩阵的元素相乘(a * b)
ndarray的shape属性可以获取ndarray的形状;ndarray.shape[0]输出ndarray的行数;ndarray.shape[1]输出ndarray的列数(针对array是(m, n)这种类型而言)
plt.imshow()没反应,不显示图像?
因为plt.imshow(image)只是对该图片做了一些处理,如要展示需plt.show()
np.squeeze()函数用法:从数组的形状中删除单维条目,即把shape中为1的维度去掉
ndarray.reshape()的用法:
reshape(m,-1) #改变维度为m行、列数自动计算
reshape(-1,m) #改变维度为行数自动计算、m列
np.mean()函数的用法:
np.mean(array):对矩阵中的所有元素求均值;np.mean(array, 0)对各列求均值;np.mean(array, 1):对各行求均值
pycharm中注释多行代码的快捷键:ctrl + /(取消也是)
train_set_y[:,index](其中shape(1, 209))表示为index的数组,与train_set_y[0][index]数值不同
神经网络的搭建过程:
1.数据的加载:求得训练集和测试集中图片数量,图片的高度和宽度,而后进行数据的标准化
2.构建sigmoid函数
3.初始化参数w, b为0
4.计算正向传播过程(成本函数)和反向传播过程(dw和db)
5.通过优化成本函数来更新w和b
6.预测数据集的标签,通过计算的值,并进行比较来确实是否为1
三、浅层神经网络
3.1 神经网络概览
(i)圆括号代表i样本,[i]方括号代表i层
3.2 神经网络表示
“隐藏层”:在训练集中,这些中间节点的真正数值我们是不知道的
符号约定中,神经网络的层数是不计入输入层的
3.3 多个例子的向量化
如何将不同训练样本向量化?(如何将训练样本横向堆叠起来构成矩阵X)
3.4 激活函数
a = tanh(z) :有类是数据中心化的效果;tanh函数在大部分情况下都比sigmoid函数优越,一个例外是输出层,当我们希望输出在0,1之间,如二元分类时,sigmoid函数所表现的效果会更好
不同层的激活函数可以不一样;
sigmoid函数和tanh函数共有的缺点如果输入的z非常大或者非常小时,导数的梯度可能就很小(接近于0),而这会拖慢梯度下降算法
Relu函数:尽管不可微,但因为大部分情况下z != 0,且你可以在z = 0 时对导数进行赋值0或1来处理这种特殊情况
选择激活函数的经验法则:
如果你的输出值是0和1,如果你在做二元分类,那么sigmoid函数非常适合输出层的激活函数,然后其他单元的激活函数采用Relu函数
Relu函数比tanh和sigmoid好的一个主要原因:它没有斜率接近于0 的点,从而不会产生减慢学习速度的效应
3.5 为什么神经网络需要非线性激活函数
如果不用激活函数,g[z] = z,有时称为线性激活函数,此时的输出不过是输入特征x的线性组合,此时无论你的神经网络有多少层,一直做的就是计算线性激活函数,而这和去掉所有隐藏层的效果是差不多的
大部分情况下隐藏层不能使用线性激活函数,除了与压缩有关的特殊情况;在回归问题上,如预测房价,可以在输出层尝试线性激活函数
3.6 神经网络的梯度下降法
梯度下降算法的具体实现和如何处理单隐层的神经网络
在训练神经网络时,随机初始化参数很重要,而不是全部初始化0
3.7 随机初始化
对于逻辑回归,可以将权重参数初始化为0,在神经网络中如果将权重参数初始为0,则使用梯度下降算法将完全无效(因为无论输入是怎样的,隐藏层的a[1]1和a[1]2是一样的;在计算反向传播时,出于对称性,dz[1]1和dz[1]2也是一样的)
对权重参数的随机初始化尽量小而不是大,因为对一些激活函数而言,会导致落入平缓区域,导致梯度下降算法的效果不太好
测验:
denote:表示;symmetry:对称;accomplish:完成;divergence:发散;padding:填充
np.meshgrid():https://blog.csdn.net/littlehaes/article/details/83543459
x[m, n]引用矩阵中某一段数据集,m代表第m维,n代表在第m维中取第n个数据;
plt.cm.Spectral的作用在于在画图时为不同类别的样本分别分配不同的颜色;
sklearn.linear_model.LogisticRegression参数说明:https://www.cnblogs.com/wjq-Law/p/9779657.html
np.random.seed():设置的seed()值仅一次有效;如果使用相同的seed( )值,则每次生成的随即数都相同
np.zeros():https://www.jianshu.com/p/18ff98f7126b
np.arange():https://www.jianshu.com/p/bf1ccfb8c518
np.sum():https://blog.csdn.net/leekingsen/article/details/76242244
np.round():四舍五入化数字
编程:
1.初始化神经网络的结构(如要几层,隐层单元要几个等等)
2.初始化参数w, b
3.前向传播的计算
4.计算成本函数
5.反向传播的计算
6.更新参数
7.整合功能
8.预测的实现,在主函数实现预测的准确性
四、深层神经网络
4.1 深层神经网络
什么是深层神经网络和神经网络中的术语表示;
事实上,我们在实现神经网络的过程中,想增加程序无错的概率的其中一个方法是需要非常仔细和系统化的思考矩阵的维数
W[l] = (n[l], n[l-1]);b[l] = (n[l], 1),dW和W[l]、db和b[l]、z和a维度相同(向量化之前)向量化之后,b[l]不变但是因为python中的广播原则,会被复制成(n[l], m)
为什么深度神经网络效果良好?
因为对于一些复杂任务,可以通过层数逐渐提高难度(如人脸识别中,前面的层数可以用来处理边缘探测器的任务,而后逐渐扩大区域,找到鼻子,而后合成脸单独)(从简单到复杂)(如语音识别中,前面的层数可以用来处理音位,而后逐渐处理单词、短语、句子等等)
电路理论:如果要计算m个样本的异或,采取深度神经网络的话,由于有不同的隐层,所有隐层单元数不会很多,采取浅层神经网络的话,单隐层下为了实现目标会导致隐层单元数呈指数级增长
circuit:电路;empirical:经验的
边缘探测器相对来说都是针对照片中非常小块的面积,面部探测器呢则会针对相对较大的区域
测验:
intermediate:中间的;circuit:电路;
python中的/ //的区别:https://www.cnblogs.com/hezhiyao/p/8066619.html
numpy数组的属性:https://www.cnblogs.com/gl1573/p/10531421.html
np.asarray():https://www.jianshu.com/p/2303467ea896
plt.rcParams(rc配置文件来自定义图形的各种默认属性):https://blog.csdn.net/weixin_39010770/article/details/88200298
np.linspace:https://blog.csdn.net/Asher117/article/details/87855493
ndimage.imread:https://blog.csdn.net/zhuzuwei/article/details/78018053
关于scipy1.3.0中被弃用的imread,imresize的替代方案:https://blog.csdn.net/weekdawn/article/details/97777747