【浙江大学机器学习胡浩基】05 深度学习

目录

第一节 历史发展

多层神经网络的劣势

大事件 

第二节 自编码器

自动编码机(Auto-encoder)的结构

第三节 卷积神经网络LeNet

LeNet结构

降采样层

MNIST数据集

第四节 卷积神经网ALEXNET

ALEXNET结构

相比于LeNet,ALEXNET在以下方面有重要改进

 第一个改进 以ReLU函数代替sigmoid或tanh函数

 第二个改进 在降采样层用MAXPOOLING代替LENET的平均降采样

 第三个改进 随机丢弃(dropou)

 第四个改进 数据扩增(Data Augumentation)

 第五个改进 使用GPU加速训练过程

第五节 Tensorfow

第六节 CAFFE

三种接口

主要的三个批处理文件

第七节 近年来流行的卷积神经网络

VGGNET

VGGNET对ALEXNET的改进包括两个方面 

RESNET

第八节 目标检测与分割(上)

 目标定位与识别 

 目标检测(多个目标)

 R-CNN (Regions with CNN features)

 FAST R-CNN 

 FASTER R-CNN

第九节 目标检测与分割(下)

YOLO网络

MTCNN

P-Net(Proposal Network)

R-Net(Refine Network)

O-Net(Output Network)

 全卷积网络(FULLY CONVOLUTIONAL NETWORKS)

第十节 时间序列的深度学习模型(RNN和LSTM)

RNN

 RNN的结构

 RNN的应用

 RNN的训练过程

 RNN的不足

多层RNN

 VANILLA RNN的训练问题

Long-Short Term Memory (LSTM) 

第十一节 生成对抗网络

 GAN算法简介

 GAN的具体应用

1、真实人脸生成

2、侧脸转正

3、图像翻译

 GAN的缺点


  • 第一节 历史发展

  • 多层神经网络的劣势

  • 1.优化算法只能获取局部极值,算法性能与初始值有关。
  • 2.不可解释。训练神经网络获得的参数与实际任务的关联性非常模糊。
  • 3.模型可调整的参数很多,使得训练神经网络变成了一门“艺术”。
  • 参数有:网络层数、每层神经元个数、非线性函数、学习率、优化方法、终止条件等等
  • 4.如果要训练相对复杂的网络,需要大量的训练样本。而支持向量机只需要小规模样本。
  • 大事件 

事件一:

2009年,LIDENG 和DONG YU等人将深度神经网络和自编码器引入语音识别中,将大词汇连续语音识别系统的识别率提高了10个百分点以上; 彻底代替了统治这一领域20多年的基于隐含马尔可夫模型(Hidden Markov Models)和高斯混合模型(Gaussian Mixture Models)的系统。

事件二:

数据库的构建。FEI-FEI LI等人从2007年开始创造了一个大规模图像识别数据库IMAGENET,为深度学习在图像处理领域的发展奠定了数据的基础。

 【浙江大学机器学习胡浩基】05 深度学习_第1张图片

事件三:

2013年,HINTON的学生ALEX Krizhevsky构建了一个包含65万多个神经元,待估计参数超过6000万的大规模的神经网络。

事件四

2016年3月,英国DEEPMIND公司基于深度学习和强化学习的围棋程序ALPHAGO

 


  • 第二节 自编码器

自动编码机(Auto-encoder)的结构

采用分层初始化的思想

第一步:先训练下图的网络

【浙江大学机器学习胡浩基】05 深度学习_第2张图片 

该网络的具体结构如下图

【浙江大学机器学习胡浩基】05 深度学习_第3张图片 

 步骤二:训练好第一层后,接着训练第二层

【浙江大学机器学习胡浩基】05 深度学习_第4张图片

步骤M

【浙江大学机器学习胡浩基】05 深度学习_第5张图片 

以下是详细图解

 最后用BP对网络参数进行微调


  • 第三节 卷积神经网络LeNet

  • LeNet结构

【浙江大学机器学习胡浩基】05 深度学习_第6张图片

 卷积的图示

【浙江大学机器学习胡浩基】05 深度学习_第7张图片

【浙江大学机器学习胡浩基】05 深度学习_第8张图片

上图这六个卷积核的参数是待定的,需要通过后向传播算法进行更新

如何求解卷积核中参数的梯度?

【浙江大学机器学习胡浩基】05 深度学习_第9张图片

图中xi表示图像的像素值,wi表示卷积核的参数,pi表示特征图的参数 

 【浙江大学机器学习胡浩基】05 深度学习_第10张图片

以上四个式子使用权值共享网络来表示,如下图

【浙江大学机器学习胡浩基】05 深度学习_第11张图片 

根据链式求导法则,得到

  • 降采样层

LeNet结构中采用平均降采样。示意图如下

【浙江大学机器学习胡浩基】05 深度学习_第12张图片

LeNet结构中,平均降采样的步长为(2,2)

将28*28的特征图降采样为14*14的特征图

如何对降采样层进行梯度的后向传播?

 【浙江大学机器学习胡浩基】05 深度学习_第13张图片

 计算LeNet网络中待估计参数的个数

【浙江大学机器学习胡浩基】05 深度学习_第14张图片

将7层的加起来,一共61648个

  • MNIST数据集

60000个训练样本

10000个测试样本

LeNet网络在测试集中识别率达到98.5%

 


 

  • 第四节 卷积神经网ALEXNET

  • ALEXNET结构

【浙江大学机器学习胡浩基】05 深度学习_第15张图片

第一个卷积层中 227*227的彩色图片

彩色图片有RGB三个颜色分量,因此channel数量为3

96个11*11*3的卷积核

卷积的步长 STRIDE=(4, 4)

事实上

如果一个M*N的图像和一个m*n的卷积核进行操作

移动步长STRIDE= (P,Q)

那么得到的特征图的长H和宽W分别为

【浙江大学机器学习胡浩基】05 深度学习_第16张图片

代入计算可以得出

第一个卷积层获得的特征图长宽都是55

由于有96个卷积核,因此(CHANNEL)是96

  • 相比于LeNet,ALEXNET在以下方面有重要改进

  • 第一个改进 以ReLU函数代替sigmoid或tanh函数

ReLU(x)=max(0,x)

SIGMOID和TANH函数在绝对值较大的情况下会出现梯度消失现象,这不利于多层神经网络的收敛

ReLU函数的全称是RECTIFIED LINEAR UNITS

X<0时,f(x)=0且f’(x)=0

X>0时,f(x)=x且f’(x)=1

避免了梯度消失的现象

假设某一层神经元的输出,大于0和小于0的个数差不多,利用RELU函数可以关闭一半左右的神经元,使它们处于非激活状态。因此,每一次训练中,只有很少一部分神经元的参数被更新,这样可以促进神经网络的收敛

  •  第二个改进 采样层用MAXPOOLING代替LENET的平均降采样

池化(pooling):把邻近的像素作为一个“池子”来重新考虑

【浙江大学机器学习胡浩基】05 深度学习_第17张图片

最大池化(maxpooling):对每一个邻近的像素组成的池子,选取最大值作为输出,

相比于平均降采样,最大池化的好处是促进网络收敛

  • 梯度直接传导到最大值
  • 每次更新的参数将会进一步减少
  • 保证了网络的稳定性
  • 第三个改进 随机丢弃(dropou)

为了避免系统参数更新过快导致过拟合,每次利用训练样本更新参数时候,随机的“丢弃”一定比例的神经元。被丢弃的神经元将不参加训练过程,输入和输出该神经元的权重系数也不做更新

这样相当于每次训练的网络架构都不一样,而这些不同的网络架构却共享相同的权重系数

【浙江大学机器学习胡浩基】05 深度学习_第18张图片

对每一层,每次训练时以概率P随机丢弃一些神经元

上图为P=0.5时的情况

  • 第四个改进 数据扩增(Data Augumentation)

采用多种方法增加训练样本

①将原图水平翻转

②将256x256的图像随机选取224x224的片段作为输入图像

通过以上两个操作,可以将一幅图像变为2048幅图像

此外还可以对每幅图片引入一定的噪声,构成新的图像

  • 第五个改进 使用GPU加速训练过程

 采用2片GTX580 GPU,缩短训练时间


  • 第五节 Tensorfow

开发工具演变历程

【浙江大学机器学习胡浩基】05 深度学习_第19张图片

第1-12行,载入程序的各种库 

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import gzip
import os
import tempfile
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import input_data
import numpy
from six.moves import urllib

 第14行,读入训练和测试的数据

mnist = input_data.read_data_sets('data/', one_hot=True)

第16-28行,定义了卷积神经网络中常用的几个函数

weight_variable(shape)用来初始化权重

bias_variable(shape)用来初始化偏置

conv2d(x, W, argument)是卷积操作

max_pool_2x2(x)是最大池化操作

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

def conv2d(x, W, argument):
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding=argument)

def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

第31-33行,初始化操作,开启流程,描述流程的输入x和输出y

其中None为占位符。这也提现了tf的一个特点:先用占位符让流程走下去,到后面再一步步明确细节

sess = tf.InteractiveSession()
x = tf.placeholder("float", shape=[None, 784])
y_ = tf.placeholder("float", shape=[None, 10])

 第一个卷积层。注意conv2d(x_image, W_conv1, 'SAME')中的SAME表示输入图像自动补零,使得输出的特征图维度和输入一样。如果为VALID,则表示不补零

#First convolutional layer
W_conv1 = weight_variable([5, 5, 1, 6])
b_conv1 = bias_variable([6])

x_image = tf.reshape(x, [-1,28,28,1])

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1, 'SAME') + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

 第二个卷积层。这里为VALID,表示不补零

#Second convolutional layer
W_conv2 = weight_variable([5, 5, 6, 16])
b_conv2 = bias_variable([16])

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2, 'VALID') + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

三个全连接层,其中keep_prob表示保留参与训练的神经元的比例

#Three fully connected layers
W_fc1 = weight_variable([5*5*16, 120])
b_fc1 = bias_variable([120])

h_pool2_flat = tf.reshape(h_pool2, [-1, 5*5*16])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
keep_prob = tf.placeholder("float")
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

W_fc2 = weight_variable([120, 84])
b_fc2 = bias_variable([84])
h_fc2 =tf.nn.relu(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
h_fc2_drop = tf.nn.dropout(h_fc2, keep_prob)

W_fc3 = weight_variable([84, 10])
b_fc3 = bias_variable([10])

y_conv=tf.nn.softmax(tf.matmul(h_fc2_drop, W_fc3) + b_fc3)

 训练过程

#Evaluation
cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))#设置目标函数为交叉熵
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)#使用Adam优化策略进行训练
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
sess.run(tf.global_variables_initializer())
for i in range(12000):
    batch = mnist.train.next_batch(50)#每个batch有50个训练样本
    if i%100 == 0:
        train_accuracy = accuracy.eval(feed_dict={x:batch[0], y_: batch[1], keep_prob: 1.0})
        print ("step %d, training accuracy %g"%(i, train_accuracy))
    train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

 


  • 第六节 CAFFE

  • 三种接口

命令行接口、Python接口、Matlab接口

  • 主要的三个批处理文件

1.create_imdb.sh 将数据集制作为lmdb格式

参数解释

shuffle 用以打乱数据的顺序使训练随机化

resize_height、resize width 将图片归一化为固定尺寸

training.txt、testing.txt 分别包含了训练和测试数据所在的路径

2.train_lenet.sh

3.test_lenet.sh


  • 第七节 近年来流行的卷积神经网络

  • VGGNET

  • VGGNET对ALEXNET的改进包括两个方面 

1.增加了网络的深度

2.用多个3*3卷积核叠加代替更大的卷积核,用以增加感受野(RECEPTIVE FIELD)

感受野:卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小

通俗来讲,就是特征图上的一个点对应输入图上的区域

【浙江大学机器学习胡浩基】05 深度学习_第20张图片 

例一:

两层3*3的卷积核卷积操作之后,第三层特征图上的每一个点的感受野是5*5,其中卷积核(filter)的步长(stride)为1,padding为0。

【浙江大学机器学习胡浩基】05 深度学习_第21张图片

例二:

如果步长STRIDE=2,则两层3*3卷积核操作之后,第三层特征图上每一个点的感受野是15*15。

计算感受野的公式

【浙江大学机器学习胡浩基】05 深度学习_第22张图片

 

两个3*3卷积核待求参数18个

一个5*5卷积核待求参数25个

用更小卷积核叠加代替大的卷积核,可以起到减少待估计参数个数的作用。代价是需要更大的计算量和储存空间

因此,VGG是一个计算和存储开销都很大的网络

  • RESNET

核心思想:直接将浅层的输出作为更深层的输入,跳过中间的一些层

【浙江大学机器学习胡浩基】05 深度学习_第23张图片

由于浅层和深层特征图的维度不一致,因此要使用线性变换,将浅层的特征图维度改变至与深层的一致


  • 第八节 目标检测与分割(上)

  • 目标定位与识别 

【浙江大学机器学习胡浩基】05 深度学习_第24张图片 

在网络的最后一层,增加四个维度的输出,分别代表

目标所属方框的左上坐标点(x,y)、方框的长和宽(h,w)

当然,图像需要进行归一化

使得这四个坐标在不同图像中具有等价关系

  •  目标检测(多个目标)

图像中有多个目标,我们要检测出他们的位置,同时对每个目标都要进行识别。

关键问题

我们不知道有多少个目标,以及目标在哪里

R-CNN (Regions with CNN features)

核心思想:

用大大小小的方框遍历所有图片是不现实的

因此提出ROI的候选区域(Region of Proposals, or Proposals)

 【浙江大学机器学习胡浩基】05 深度学习_第25张图片

 

  • 使用SELECTIVE SEARCH
  • 产生候选的方框(PROPOSAL)
  • 将这些候选方框输入到CNN中
  • 用SVM来判断检测结果是否正确

 下面来介绍Region Proposals(Selective Search,SS)

 【浙江大学机器学习胡浩基】05 深度学习_第26张图片

给定一张图片,首先用Efficient Graph-Basedlmage Segmentation算法将图片进行过分割(Over-Segmentation)

过分割后的每个region非常小,每个region相对应一个bounding

R-CNN算法的缺点:计算量消耗巨大

  • High cost to performs Selective Search(~5s per image)
  • Too many passes to CNN(~2000 proposals per image)
  • Lead to unacceptable test time(~50 per image)
  • High space cost to train SVM(millions of 1024-d features)

FAST R-CNN 

核心思想:使用ROI-POOLING加速CNN特征提取过程

【浙江大学机器学习胡浩基】05 深度学习_第27张图片

先用CNN对整幅图进行卷积,在中间某一层的特征图上再用ROI-POOLING来归一化每个候选区域的输出

【浙江大学机器学习胡浩基】05 深度学习_第28张图片

 根据不同候选区域在某一层特征图上的感受野,成比例地利用MAXPOOLING,将每个候选区域经过MAXPOOLING后获得的特征图在维度上变为一致

 FASTER R-CNN

  • 在卷积后的特征图上滑动窗口
  • 用不同长宽比的矩形作为候选区域
  • 用一个小网络来判断这些候选区域是不是存在目标
  • 运用ROI POOLING进行归一化

 【浙江大学机器学习胡浩基】05 深度学习_第29张图片


  • 第九节 目标检测与分割(下)

  • YOLO网络

多目标检测和识别的另一个重要工作

将输入图像分割为s*s个格子

某个物体 Ground truth 的中心位置的坐标落入到某个格子

那这个格子就负责检测这个物体

每个格子预测B个bounding box及其置信度(confidence score),以及C个类别概率

bbox信息(X,Y,w,h)为物体的中心位置相对格子位置的偏移及宽度和高度,均被归一化

 

置信度(confidence score)

是否包含物体,以及包含物体情况下位置的准确性

YOLOv1网络在最后使用全连接层进行类别输出

全连接层的输出维度=SxSx(Bx5+C)

 

上图为YOLO的结构

目标检测举例

  • MTCNN

利用深度学习将人脸检测人脸特征点定位结合起来

Multitask:

1. Face detection

2. Facial landmarks localization

【浙江大学机器学习胡浩基】05 深度学习_第30张图片 

该网络包含三个子网络 

  • P-Net(Proposal Network)

  • 检测图中的人脸
  • 产生多个人脸候选框和回归向量
  • 用回归向量对候选窗口进行校准
  • 通过非极大值抑制NMS来合并高度重叠的候选框
  • R-Net(Refine Network)

  • 输出候选框置信度(根据置信度削减候选框数量)和回归向量
  • 通过边界框回归和NMS精调候选框的位置
  • O-Net(Output Network)

  • 削减框数量同时精调回归框
  • 输出5个人脸关键点坐标

语义分割

检测和识别出图像的目标

确定每个目标所对应的像素

  •  全卷积网络(FULLY CONVOLUTIONAL NETWORKS)

【浙江大学机器学习胡浩基】05 深度学习_第31张图片

输入是一幅图像,输出是与输入长宽一致的图像

特征图维度先缩小再放大,采取中心对称的结构设计

上采样层(UP-SAMPINGLAYER)

使用上采样层进行特征图的放大

例如

对于MAXPOOLING,首先记录与上采样层位置对应的下采样层最大值位置

【浙江大学机器学习胡浩基】05 深度学习_第32张图片

如图所示,在对应位置赋予具体数值,在其他地方补0

卷积层的上采样

也称为反卷积(Deconvolution)或 转置卷积(Transpose Convolution)

【浙江大学机器学习胡浩基】05 深度学习_第33张图片

【浙江大学机器学习胡浩基】05 深度学习_第34张图片

在以上卷积层中,输入特征图为4*4,卷积核为3*3,步长为1 ,得到的特征图维度为2*2

反卷积的图示如下

【浙江大学机器学习胡浩基】05 深度学习_第35张图片

 


  • 第十节 时间序列的深度学习模型(RNN和LSTM)

  • RNN

  • RNN的结构

【浙江大学机器学习胡浩基】05 深度学习_第36张图片

t时刻的状态,与t-1时刻的状态和t时刻的输入有关

 

其中,ht为t时刻的状态,xt为t时刻的输入。fw与t无关

【浙江大学机器学习胡浩基】05 深度学习_第37张图片

  • RNN的应用

多个输入和多个输出 图示

典型应用:大词汇连续语音识别、机器翻译

【浙江大学机器学习胡浩基】05 深度学习_第38张图片 输入特征向量,输出对应的文字。用RNN进行Triphone的识别,在TIMIT数据集上获得了比DNN-HMM更高的识别率。

 

多个输入和一个输出

典型应用:动作识别、行为识别、单词量有限的语音识别

【浙江大学机器学习胡浩基】05 深度学习_第39张图片

 

一个输入和多个输出

典型应用:文本生成、图像文字标注

 

下图为文本生成

 

 

  •  RNN的训练过程

将RNN沿时间轴展开

【浙江大学机器学习胡浩基】05 深度学习_第40张图片

前向计算后,将每一个时刻t的LOSS加到一起作为总的目标函数,逐级求导。

由于所有数据都求导不现实,所以实际中采用的方法是将RNN截断有限步,实际中只求有限步的导数

  •  RNN的不足

状态之间的转移函数,以及状态到输出的转移函数都过于简单

  • 多层RNN

【浙江大学机器学习胡浩基】05 深度学习_第41张图片

  •  VANILLA RNN的训练问题

【浙江大学机器学习胡浩基】05 深度学习_第42张图片

1. Bengio et al. Learning long-term dependencies with gradient descent is difficult. IEEE Transactions on Neural Networks, 1994

2. Pascanu et al, On the difficulty of training recurrent neural networks.

【浙江大学机器学习胡浩基】05 深度学习_第43张图片

训练中h0获得的梯度,将是矩阵W的对应于h0的部分被乘了很多次,将会导致梯度暴涨或梯度消失。

  • Long-Short Term Memory (LSTM) 

是RNN中的一种,增加了RNN中单元的复杂度,使模型更复杂,增加系统表现力。

【浙江大学机器学习胡浩基】05 深度学习_第44张图片【浙江大学机器学习胡浩基】05 深度学习_第45张图片 【浙江大学机器学习胡浩基】05 深度学习_第46张图片

相比VANILLA RNN, LSTM的误差反向传播更方便和直接,梯度更新不存在RNN中的暴涨或消失现象。

建议涉及RNN的应用都用LSTM或LSTM相关的变种

 


  • 第十一节 生成对抗网络

  • GAN算法简介

生成器(Generator)

判别器(Discriminator)

GAN的优化目标函数如下

当G、D二者的模型容量(capacity)足够时,二者将达到纳什均衡

具体训练过程如下

  •  GAN的具体应用

1、真实人脸生成

输人随机噪声,利用生成对抗网络来生成真实的人脸图片

参考论文:

《A Style-Based Generator Architecture for Generative Adversarial Networks》, CVPR 2019

2、侧脸转正

给定不同旋转角度下的人脸图片,通过生成对抗网络来重建正面角度下的人脸图片,可用于侧脸角度的人脸识别等现实应用。

参考论文:

《Beyond Face Rotation: Global and Local Perception GAN for Photorealistic and Identity Preserving Frontal View Synthesis》,ICCV 2017

3、图像翻译

指的是从一张(源域)图像到另一张(目标域)图像的转换。可以类比机器翻译,一种语言转换为另一种语言。翻译过程中会保持源域图像的内容不变,但是风格或者一些其他属性变成目标域

①基于成对训练数据的图像翻译

成对图像翻译典型的典型例子就是pix2pix网络 pix2pix使用成对数据训练了一个条件GAN,其Loss包括GAN的对抗loss和逐像素差loss

参考论文:

《Image-to-Image Translation with Conditional Adversarial Networks》.CVPR 2017

②基于非成对训练数据的图像翻译

实际很多情况下,成对的训练数据是很难获取到的。

CycleGAN网络

【浙江大学机器学习胡浩基】05 深度学习_第47张图片

  •  GAN的缺点

  • 训练不稳定,难以直观观测训练过程
  • 难以有效收敛,很多时候收敛需要运气
  • 可能出现模式崩溃

 

 

 

 

 

 

 

 

你可能感兴趣的:(浙大ML学习笔记(完结),学习,人工智能,算法)