1 神经网络
sigmod函数和softmax函数
最大似然概率和交叉熵和多类别交叉熵
Logistic回归和梯度下降推导
1.1 问题分类
分类
回归
1.2 感知机算法
输入:T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N,学习速率为η)
输出:w, b;感知机模型f(x)=sign(w·x+b)
(1) 初始化w0,b0,权值可以初始化为0或一个很小的随机数
(2) 在训练数据集中选取(x_i, y_i)
(3) 如果yi(w xi+b)≤0
w = w + ηy_ix_i
b = b + ηy_i
(4) 转至(2),直至训练集中没有误分类点
原文链接:https://blog.csdn.net/Dream_angel_Z/article/details/48915561
但是这个只能定义线性边界
1.3 激活函数和sigmod函数
1/(1+e^(-x))
-
梯度下降法
对于优化来说,连续比离散更好,所以要把分类,优化为概率;即从上图左边的step function转到右边的sigmoid function
-
多分类softmax函数
- 多分类,用exp(因为分可能是负数)算概率评分
- exp(i) / sum(exp(i))
-softmax推导:https://www.cnblogs.com/zongfa/p/8971213.html
https://my.oschina.net/Kanonpy/blog/841722#1.-softmax
- one-hot encoding
- 不能设为0,1,2,英文这样这些特征就会有相关关系
- 所以要分开来,有的设为1, 没有的设为0
1.4 最大似然法
- 每个点为当前预测正确的概率乘积
- 因为乘积很小,而且一个改变对整体改变影响比较大,所以把乘积变为求和
1.5 交叉熵(逻辑回归用的损失函数)
- use log function to change product into sum
- 然后取相反数求和就是交叉熵(因为概率都是0-1,取log就会变为负数)
-
交叉熵越小模型越好
1.6 多类别交叉熵
-
其实y和1-y只是类别的不同
1.7 Logistic回归
单分类和多分类:
1.8 梯度下降和公式推导
推导:
https://blog.csdn.net/programmer_wei/article/details/52072939
https://blog.csdn.net/programmer_wei/article/details/51941358
2 深度神经网络
神经网络结构
前向反馈和反向传播
优化方法(梯度消失等等)
2.1 非线性数据和模型和神经网络结构
通过累加和计算sigmod函数来计算
每一个中间层都要用激活函数
多分类如果多个网络再做softmax有点浪费;所以就在最后一层设置多个sigmod函数,算出不同类别的分数,然后用softmax函数求出每种类别的概率
前向反馈和反向传播
- 公式推导
2.2 keras学习
- 序列模型
from keras.models import Sequential
model = Sequential() model.fit() .evaluate() .compile() - 层
有全连接层,最大池化层和激活层
from keras.layers.core import Dense, Activation, Flatten
model.add(Dense(128, input_dim=32)
model.add(Activation('softmax') - 编译
model.compile(loss="", optimizer="", metrics=["accuracy"])
model.summary() - 训练
model.fit(X, y, epochs=1000, verbose=0) - 评估
model.evaluate(X, y) - Student admissionLab
- 加载数据,绘制数据
- 特征工程,one-hot编码,缩放数据
- 分为训练集和测试集,定义特征和标签
- 定义模型架构,训练,评分
- tuning:激活函数,损失函数,优化器
- 激活函数 (Activation function):relu 和sigmoid
损失函数 (Loss function):categorical_crossentropy,mean_squared_error
https://www.depends-on-the-definition.com/guide-to-multi-label-classification-with-neural-networks/
https://www.dlology.com/blog/how-to-choose-last-layer-activation-and-loss-function/
下面这篇文章无敌:
https://juejin.im/post/5b38971be51d4558b10aad26
https://blog.csdn.net/weixin_38145317/article/details/89448988
优化器 (Optimizer):rmsprop,adam,ada
- 激活函数 (Activation function):relu 和sigmoid
2.3 训练优化
- 早期停止
根据训练误差和测试误差找到最佳的点,适当的epoch次数,可以完成早期停止
正则化
L1正则适合稀疏特征,适合于特征选择(1,0,0,1) Lamda(|w1|+...)
L2适合training models,Lamda(w1^2+...)
如(1,0) (0.5,0.5),L2更倾向于右边Dropout
一定的概率某些节点不经过前向反馈和反向传播
更新权重;dropout parameter is the probability that each node gets dropped at a particular epoch- 解决梯度消失:激活函数
-
tanh(x)
-
ReLU
-
-
解决数据载入一下子过多计算量过大:批次和随机梯度下降
因为一次载入所有数据计算量太大,每次epoch只选部分的点(batch size)进行训练,比如24个点,分为4个组,每组6个
可以完成一次数据集,训练4次- 批次训练的概念解释
https://www.zhihu.com/question/32673260
https://blog.csdn.net/Gamer_gyt/article/details/87927075
https://blog.csdn.net/uestc_c2_403/article/details/74910107
https://zhuanlan.zhihu.com/p/25765735
BGD 每次更新weights用所有样本
SGD 每次更新只用一个样本
MBGD(也是SGD) 每次更新只用batch size个样本
https://www.jianshu.com/p/73b57de58a3a
training step代表1次迭代,每次迭代更新一次系数
batch_size: 1次迭代使用的样本
epoch:1个epoch代码过了1遍训练集的所有样本
- 批次训练的概念解释
解决学不出来:学习速率衰退
如果模型算不出来,就降低学习率;学习率在越来越接近solution的时候会降低解决局部最低点:使用随机重新开始
随机重新开始能尽量找到局部最低点-
解决局部最低点:动量beta是动量系数,第二个乘以beta,第三个乘以beta^2。。。
可以越过临时最低点
2.4 Keras优化程序
Keras 中有很多优化程序,建议你访问此链接或这篇精彩博文(此链接来自外网,国内网络可能打不开),详细了解这些优化程序。这些优化程序结合使用了上述技巧,以及其他一些技巧。最常见的包括:
-
SGD
这是随机梯度下降。它使用了以下参数:- 学习速率。
- 动量(获取前几步的加权平均值,以便获得动量而不至于陷在局部最低点)。
- Nesterov 动量(当最接近解决方案时,它会减缓梯度)。
Adam
Adam (Adaptive Moment Estimation) 使用更复杂的指数衰减,不仅仅会考虑平均值(第一个动量),并且会考虑前几步的方差(第二个动量)。RMSProp
RMSProp (RMS 表示均方根误差)通过除以按指数衰减的平方梯度均值来减小学习速率。
&http://ruder.io/optimizing-gradient-descent/index.html#rmsprop
&https://keras.io/optimizers/
2.5 神经网络回归
如果想把分类变为回归,就把最后的sigmod函数删了,然后直接用上一relu层算y,然后用(y-yhat)^2作为误差函数进行训练
我们的内容开发者之一 Jay Alammar 创建了这个神奇的神经网络 “游乐场”,在这里你可以看到很棒的可视化效果,并可以使用参数来解决线性回归问题,然后尝试一些神经网络回归。 预祝学习愉快!
https://jalammar.github.io/visual-interactive-guide-basics-neural-networks/
2.6 keras小项目:使用 Keras 分析 IMDB 电影数据
加载数据,检查数据,特征工程(one hot),模型构建,训练模型,评估模型,模型调优
3 卷积神经网络
3.1 应用
-
了解 WaveNet 模型。
- 如果你能训练人工智能机器人唱歌,干嘛还训练它聊天?在 2017 年 4 月,研究人员使用 WaveNet 模型的变体生成了歌曲。原始论文和演示可以在此处找到。
-
了解文本分类 CNN。
- 你或许想注册作者的深度学习简讯!
了解 Facebook 的创新 CNN 方法(Facebook),该方法专门用于解决语言翻译任务,准确率达到了前沿性水平,并且速度是 RNN 模型的 9 倍。
-
利用 CNN 和强化学习玩 Atari 游戏。你可以下载此论文附带的代码。
- 如果你想研究一些(深度强化学习)初学者代码,建议你参阅 Andrej Karpathy 的帖子。
-
利用 CNN 玩看图说词游戏!
- 此外,还可以参阅 A.I.Experiments 网站上的所有其他很酷的实现。别忘了 AutoDraw!
-
详细了解 AlphaGo。
- 阅读这篇文章,其中提出了一个问题:如果掌控 Go“需要人类直觉”,那么人性受到挑战是什么感觉?_
-
观看这些非常酷的视频,其中的无人机都受到 CNN 的支持。
- 这是初创企业 Intelligent Flying Machines (IFM) (Youtube)的访谈。
- 户外自主导航通常都要借助全球定位系统 (GPS),但是下面的演示展示的是由 CNN 提供技术支持的自主无人机(Youtube)。
-
如果你对无人驾驶汽车使用的 CNN 感兴趣,请参阅:
- 我们的无人驾驶汽车工程师纳米学位课程,我们在此项目中对德国交通标志数据集中的标志进行分类。
- 我们的机器学习工程师纳米学位课程,我们在此项目中对街景门牌号数据集中的门牌号进行分类。
- 这些系列博客,其中详细讲述了如何训练用 Python 编写的 CNN,以便生成能够玩“侠盗猎车手”的无人驾驶 AI。
-
参阅视频中没有提到的其他应用情形。
- 一些全球最著名的画作被转换成了三维形式,以便视力受损人士也能欣赏。虽然这篇文章没有提到是怎么做到的,我们注意到可以使用 CNN 预测单个图片的深度。
- 参阅这篇关于使用 CNN 确定乳腺癌位置的研究论文(google research)。
- CNN 被用来拯救濒危物种!
- 一款叫做 FaceApp 的应用使用 CNN 让你在照片中是微笑状态或改变性别。
3.2 手写数据库MNIST database
预处理:/255归一化
对标记进行one-hot label
矩阵的每一行向量进行拼接成输入向量
-
MLP
dropout function 防止过拟合
use keras flatten function
Relu function 非线性性
-
loss functions 分类交叉熵 categorical cross-entropy loss
有很多梯度下降方法
- 如果你想详细了解 Keras 中的完全连接层,请阅读这篇关于密集层的文档。你可以通过为
kernel_initializer
和bias_initializer
参数提供值更改权重的初始化方法。注意默认值分别为'glorot_uniform'
和'zeros'
。你可以在相应的 Keras 文档中详细了解每种初始化程序的工作方法。 - Keras 中有很多不同的损失函数。对于这节课来说,我们将仅使用
categorical_crossentropy
。
- 如果你想详细了解 Keras 中的完全连接层,请阅读这篇关于密集层的文档。你可以通过为
-
模型验证
在训练过程中,你可以使用很多回调(例如 ModelCheckpoint)来监控你的模型。你可以参阅此处的详情内容。建议你先详细了解 EarlyStopping 回调。如果你想查看另一个 ModelCheckpoint 代码示例,请参阅这篇博文。
-
MLP和CNN适用场景
MLP适用于数据预处理过后的,处于图像中间,大小类似的应用
-
对比
CNN用稀疏互联,接受矩阵作为输入
MLPs 数据太多容易失控,只接受向量作为输入,失去二维位置信息
3.3 细节
-
局部连接层,将完全连接层换成局部连接层
-
卷积层
定义一个卷积窗
filter 大小和卷积窗差不多大小
filter和卷积窗求和再用ReLU函数去算
在边缘检测的特别有效,用水平或者垂直的filter来组合
一层一层的卷积层发现规律
-
Stride和填充
填充是padding='valid'丢掉没有的点;
number of filters and size of filters(window size)
stride是filter每次滑动的距离1输入和输出基本一样,是2的话,输出是输入的一半
padding='same'是填充为0 keras怎么调用和维度
from keras.models import Sequential
from keras.layers import Conv2D
model = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, strides=2, padding='valid',
activation='relu', input_shape=(200, 200, 1)))
model.summary()
上面的参数量是80,计算方法见图下:
公式:卷积层中的参数数量
卷积层中的参数数量取决于 filters、kernel_size 和 input_shape 的值。我们定义几个变量:
K - 卷积层中的过滤器数量
F - 卷积过滤器的高度和宽度
D_in - 上一层级的深度
注意:K = filters,F = kernel_size。类似地,D_in 是 input_shape 元组中的最后一个值。
因为每个过滤器有 FFD_in 个权重,卷积层由 K 个过滤器组成,因此卷积层中的权重总数是 KFFD_in。因为每个过滤器有 1 个偏差项,卷积层有 K 个偏差。因此,卷积层中的参数数量是 KFFD_in + K。
比如上面的图就是16*4+16 = 80公式:卷积层的形状
卷积层的形状取决于 kernel_size、input_shape、padding 和 stride 的值。我们定义几个变量:
K - 卷积层中的过滤器数量
F - 卷积过滤器的高度和宽度
H_in - 上一层级的高度
W_in - 上一层级的宽度
注意:K = filters、F = kernel_size,以及S = stride。类似地,H_in 和 W_in 分别是 input_shape 元组的第一个和第二个值。
卷积层的深度始终为过滤器数量 K。
如果 padding = 'same',那么卷积层的空间维度如下:
height = ceil(float(H_in) / float(S))
width = ceil(float(W_in) / float(S))
如果 padding = 'valid',那么卷积层的空间维度如下:
height = ceil(float(H_in - F + 1) / float(S))
width = ceil(float(W_in - F + 1) / float(S))-
池化层
过多的参数可能会造成过拟合,需要池化层来降低维数-
最大池化层
把多维数组变为了一半
跟卷积层一样需要配置配置window size和stride
-
global average pooling layer
把多维数组变成了向量
-
Keras池化
from keras.models import Sequential
from keras.layers import MaxPooling2D
model = Sequential()
model.add(MaxPooling2D(pool_size=2, strides=2, input_shape=(100, 100, 15)))
model.summary()
3.4 图片分类CNN
先要把图片处理成统一格式,比如32*32像素,彩色图片分为3层,黑白图片为1层,皆为RGB 0-255数值
模型配置:
- 从刚开始含有空间信息到最后没有空间信息
-
最后加一个flatten变为向量,然后加两个全连接层预测
3.5 keras中的CNN实例
你可以在 aind2-cnn
GitHub 资源库中访问视频中描述的 Jupyter Notebook。转到 cifar10-classification/ 文件夹并打开 cifar10_mlp.ipynb 和 cifar10_cnn.ipynb。
- 验证集注意事项
在这节课的早些时候,我们通过验证方式训练了一个神经网络,方法是将model.fit
中的validation_split
参数设为 0.2。这样会将训练数据的最后 20% 数据变成验证数据。在此视频的 notebook 中,我们自己硬编码了拆分比例,而不是让 Keras 为我们拆分验证集。 - 课外资料
- 这是用于在 Keras 中指定神经网络(包括 CNN)的备忘单。
- 参阅 CIFAR-10 竞赛的获胜架构!
3.6 keras中的图片增强功能
scale(图片放大或缩小)和rotation(图片旋转)和translation invariance(图片平移)
如果想要这些特征,就在数据集中加入转化了这些特征的图集 data augmentation
你可以在 aind2-cnn
GitHub 资源库中访问视频中描述的 Jupyter 记事本。转到 cifar10-augmentation/ 文件夹并打开 cifar10_augmentation.ipynb。
- 关于
steps_per_epoch
的注意事项
fit_generator
具有很多参数,包括
steps_per_epoch = x_train.shape[0] / batch_size
其中 x_train.shape[0]
对应的是训练数据集 x_train
中的独特样本数量。通过将 steps_per_epoch
设为此值,我们确保模型在每个 epoch 中看到 x_train.shape[0]
个增强图片。
- 课外资料
- 阅读这篇对 MNIST 数据集进行可视化的精彩博文。
- 参阅此详细实现,了解如何使用增强功能提高 Kaggle 数据集的效果。
- 阅读关于 ImageDataGenerator 类的 Keras 文档。
3.7 突破性的CNN架构
ImageNet为超过1千万手动标记图片的数据库,ImageNet Large Scale Visual Recognition Competition
VGG Net
ResNet
- 课外资料
- 参阅 AlexNet 论文!
- 在此处详细了解 VGGNet。
- 此处是 ResNet 论文。
- 这是用于访问一些著名 CNN 架构的 Keras 文档。
- 阅读这一关于梯度消失问题的详细处理方案。
- 这是包含不同 CNN 架构的基准的 GitHub 资源库。
- 访问 ImageNet Large Scale Visual Recognition Competition (ILSVRC) 网站。
3.8 可视化CNN
通过不同的filter发现组合后的图片
如果你想详细了解如何解读 CNN(尤其是卷积层),建议查看以下资料:
这是摘自斯坦福大学的 CS231n 课程中的一个a 章节,其中对 CNN 学习的内容进行了可视化。
参阅这个关于很酷的 OpenFrameworks 应用的演示,该应用可以根据用户提供的视频实时可视化 CNN!
这是另一个 CNN 可视化工具的演示。如果你想详细了解这些可视化图表是如何制作的,请观看此视频。
这是另一个可与 Keras 和 Tensorflow 中的 CNN 无缝合作的可视化工具。
-
阅读这篇可视化 CNN 如何看待这个世界的 Keras 博文。在此博文中,你会找到 Deep Dreams 的简单介绍,以及在 Keras 中自己编写 Deep Dreams 的代码。阅读了这篇博文后:
- 再观看这个利用 Deep Dreams 的音乐视频(注意 3:15-3:40 部分)!
- 使用这个网站创建自己的 Deep Dreams(不用编写任何代码!)。
-
如果你想详细了解 CNN 的解释
- 这篇文章详细讲解了在现实生活中使用深度学习模型(暂时无法解释)的一些危险性。
- 这一领域有很多热点研究。这些作者最近朝着正确的方向迈出了一步。
深度可视化工具箱
我们要查看的 CNN 在 ImageNet 上进行了训练(请参阅这篇来自 Zeiler 和 Fergus 的https://cs.nyu.edu/~fergus/papers/zeilerECCV2014.pdf
。在下面的图片中(摘自上述同一论文)
上述图片来自 Matthew Zeiler 和 Rob Fergus 的深度可视化工具箱(YOUTUBE链接,国内网络可能打不开),使我们能够可视化 CNN 中的每个层级侧重的是什么。
3.9 迁移学习 transfer learning
迁移学习
迁移学习是指对提前训练过的神经网络进行调整,以用于新的不同数据集。
取决于以下两个条件:
新数据集的大小,以及
新数据集与原始数据集的相似程度使用迁移学习的方法将各不相同。有以下四大主要情形:
新数据集很小,新数据与原始数据相似
新数据集很小,新数据不同于原始训练数据
新数据集很大,新数据与原始训练数据相似
新数据集很大,新数据不同于原始训练数据-
演示网络
为了解释每个情形的工作原理,我们将以一个普通的预先训练过的卷积神经网络开始,并解释如何针对每种情形调整该网络。我们的示例网络包含三个卷积层和三个完全连接层:
下面是卷积神经网络的作用一般概述:
第一层级将检测图片中的边缘
第二层级将检测形状
第三个卷积层将检测更高级的特征
每个迁移学习情形将以不同的方式使用预先训练过的神经网络。- 情形 1:小数据集,相似数据
如果新数据集很小,并且与原始训练数据相似:
以下是如何可视化此方法的方式:
删除神经网络的最后层级
添加一个新的完全连接层,与新数据集中的类别数量相匹配
随机化设置新的完全连接层的权重;冻结预先训练过的网络中的所有权重
训练该网络以更新新连接层的权重
为了避免小数据集出现过拟合现象,原始网络的权重将保持不变,而不是重新训练这些权重。
因为数据集比较相似,每个数据集的图片将具有相似的更高级别特征。因此,大部分或所有预先训练过的神经网络层级已经包含关于新数据集的相关信息,应该保持不变。
- 情形 2:小型数据集、不同的数据
如果新数据集很小,并且与原始训练数据不同:
以下是如何可视化此方法的方式:
将靠近网络开头的大部分预先训练过的层级删掉
向剩下的预先训练过的层级添加新的完全连接层,并与新数据集的类别数量相匹配
随机化设置新的完全连接层的权重;冻结预先训练过的网络中的所有权重
训练该网络以更新新连接层的权重
因为数据集很小,因此依然需要注意过拟合问题。要解决过拟合问题,原始神经网络的权重应该保持不变,就像第一种情况那样。
但是原始训练集和新的数据集并不具有相同的更高级特征。在这种情况下,新的网络仅使用包含更低级特征的层级。
- 情形 3:大型数据集、相似数据
如果新数据集比较大型,并且与原始训练数据相似:
以下是如何可视化此方法的方式:
删掉最后的完全连接层,并替换成与新数据集中的类别数量相匹配的层级
随机地初始化新的完全连接层的权重
使用预先训练过的权重初始化剩下的权重
重新训练整个神经网络
训练大型数据集时,过拟合问题不严重;因此,你可以重新训练所有权重。
因为原始训练集和新的数据集具有相同的更高级特征,因此使用整个神经网络。
- 情形 4:大型数据集、不同的数据
如果新数据集很大型,并且与原始训练数据不同:
以下是如何可视化此方法的方式:
删掉最后的完全连接层,并替换成与新数据集中的类别数量相匹配的层级
使用随机初始化的权重重新训练网络
或者,你可以采用和“大型相似数据”情形的同一策略
虽然数据集与训练数据不同,但是利用预先训练过的网络中的权重进行初始化可能使训练速度更快。因此这种情形与大型相似数据集这一情形完全相同。
如果使用预先训练过的网络作为起点不能生成成功的模型,另一种选择是随机地初始化卷积神经网络权重,并从头训练网络。
-
课外资料
- 参阅这篇 研究论文,该论文系统地分析了预先训练过的 CNN 中的特征的可迁移性。
- 阅读这篇详细介绍 Sebastian Thrun 的癌症检测 CNN 的《自然》论文!
- 这是提议将 GAP 层级用于对象定位的首篇研究论文。
- 参阅这个使用 CNN 进行对象定位的资源库。
- 观看这个关于使用 CNN 进行对象定位的视频演示(Youtube链接,国内网络可能打不开)。
- 参阅这个使用可视化机器更好地理解瓶颈特征的资源库。
keras
可以在此处链接的 GitHub 资源库中访问视频中提到的 Jupyter Notebook。转到 transfer-learning/ 文件夹并打开 transfer_learning.ipynb。
4 癌症检测模型 (单独写了一篇)
5 狗狗分类项目
- 项目概况
欢迎来到卷积神经网络(CNN)项目!在这一项目中,你将学到如何建立一个处理现实生活中的,用户提供的图像的算法。给你一个狗的图像,你的算法将会识别并估计狗的品种,如果提供的图像是人,代码将会识别最相近的狗的品种。
你可以查看项目的 Github 地址从那里开始你的项目 - 过程
导入数据,检测人(用OpenCV's implementation of Haar feature-based cascade classifiers
)还是狗(use a pre-trained ResNet-50 model to detect dogs in images While looking at the dictionary, you will notice that the categories corresponding to dogs appear in an uninterrupted sequence and correspond to dictionary keys 151-268, inclusive, to include all categories from'Chihuahua'
to'Mexican hairless'
),创建CNN分辨狗的种类(从头构建,准确率比较低3%;迁移学习能达到37%;尝试不同的迁移,最后能达到80%),算法构建,测试算法