视频学习资源
1. 李宏毅
b站资源:
【李宏毅 深度学习19(完整版)国语】机器学习 深度学习
下面这两个一样:
【李宏毅】Linear Algebra 線性代數 (2018,Fall) : 360p,37课。
【合集】机器学习线代基础_李宏毅_Linear Algebra 線性代數 (2018) : 480p,不全,只有25课。
李宏毅主页:有线性代数课程。
李宏毅 - Linear Algebra (2016,Spring)
2. 吴恩达
机器学习(Machine Learning)- 吴恩达(Andrew Ng)
吴恩达《机器学习》文字整理版
3. 数学资源
图解机器学习的数学直觉:线性代数,微积分,PCA(全完结)
4. 其他
MarkDown写数学公式
在这儿可以手动选择符号得到LaTeX公式:在线LaTeX公式编辑器。
VSCode安装Markdown Preview Enhanced插件。
$...$
或者\(...\)
中的数学表达式将会在行内显示。
$$...$$
或者\[...\]
或者```math 换行...```中的数学表达式将会在块内显示。
只支持$...$
和$$...$$
,例如:
深度学习开源项目及文章
深度学习500问
图像风格迁移
一个艺术风格化的神经网络算法(A Neural Algorithm of Artistic Style)(译)
神经风格迁移(Neural Style Transfer)程序实现(Keras)
Image Style Transfer:多风格 TensorFlow 实现
【啄米日常】5:keras示例程序解析(2):图像风格转移
深度卷积神经网络图像风格变换,这个是优化过后的风格迁移,只是论文没有开源,像是广告?
这篇收集了多篇风格迁移文章
机器学习实战--对亚马逊森林卫星照片进行分类(3)
TensorFlow从1到2(十三)图片风格迁移
风格迁移中用到Gram矩阵,学习一下:
如何用简单易懂的例子解释格拉姆矩阵/Gram matrix?
Gram矩阵和协方差矩阵相似,所以先学学协方差:
如何通俗易懂地解释「协方差」与「相关系数」的概念? - GRAYLAMB的回答 - 知乎
风格迁移大多使用VGG模型,代码之中有一串数字我很疑惑:
VGG_MEAN = [103.939, 116.779, 123.68]
查了资料应该是VGG中写死的归一化的数据预处理,那么不就用深究了,反正就是这么写。VGGNet论文中应该有说明,还没看。
神经网络基础知识
梯度是如何计算的
Deep Learning(深度学习)学习笔记整理系列之(一)
batch、epoch、iteration
- batch:意思是训练数据分批,比如我有10万个训练数据全都要参与训练,因为数据量太大了,没办法一次训练完,那么只能分批,比如分成20个batch,那么每个batch的size就是5000。每一次参数的更新的Loss Function并不是由一个样本得到的,而是由一个batch的数据加权得到。
- iteration:使用batch size个样本训练一次的过程叫做一个iteration。
- epoch:一个epoch就是使用训练集中的全部样本训练一次。通俗的讲,epoch的值就是整个训练数据集被反复使用几次。
深度学习中为什么要使用多于一个epoch?
CNN知识及各种神经网络模型
介绍了:VGGNet、ResNet、Inception与Xception
ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构
CNN网络架构演进:从LeNet到DenseNet
大白话讲解卷积神经网络工作原理
这篇文章里“3、卷积神经网络内部结构”中的动图非常助于理解卷积神经网络,特别是RGB通道的卷积过程解了我的疑惑。
RGB通道的卷积:每一个颜色通道与不同的filter同时进行卷积,然后将3个卷积结果相加即是feature map的值。也就是多个通道的卷积结果相加得到一个feature map。
权值共享:
如何理解卷积神经网络中的权值共享? - superbrother的回答 - 知乎
cnn中权值共享理解
我个人简单理解,举例:
1层可以只使用一个的卷积核进行卷积运算,输入的图片可能很大,但每次卷积只使用这么一个卷积核,这就叫权值共享。
感受野:
- 你知道如何计算CNN感受野吗?这里有一份详细指南
- 深度神经网络中的感受野(Receptive Field)
第2篇对于理解感觉野来说是极好的,第1篇看了半天还不知道什么是感受野。
不过最终计算公式还是看第1篇好。
结合上文我个人对感受野的简单理解:
第n层卷积的结果是由第1层到n-1层多次卷积而来的,所以第n层得到的单元是受一层层影响才得到的结果,卷积结果中的一个单元所对应原始输入层的范围肯定是越来越大, 这个受影响的范围就是其看到的范围也就是感受野。
比如最终卷积层如果只得到1个单元值,那么肯定就是对应整个原始input的特征,这是很直觉的,一张图经过卷积得到一个数字,这个数字肯定是整张图的特征综合而来的,所以这个值的感受野就是全图。
更直观但不严谨的理解:一开始我们走很近盯着图的很小的局部一块块的看,慢慢走远一点看的更大一点范围,这样一层层递进直至一眼就看到全图。
引用第1篇:
第1篇有两个公式。第1个公式我没有细看,第2个公式跟第2篇一样,所以这里只说一下第2个公式。第 个卷积层中,每个单元的感受野公式:
其中 是第层的感受野大小,而 是当前层的卷积核大小,是第层的步长。从这个公式可以看到,相比前一层,当前层的感受野大小在两层之间增加了,这是一个指数级增加,如果stride大于1的话。这个公式也可以这样理解,对于第 层,其卷积核为,那么相比前一层需要计算个位置(或者神经元,意思是 层的一个位置在 层的视野大小是 ),但是这些位置要一直向前扩展到输入层。对于第一个位置,扩展后的感受野为,正好是前一层的感受野大小,但是对于剩余的个位置就要看stride大小,你需要扩展到前面所有层的stride(注意不包括当前层的stride,当前层的stride只会影响后面层的感受野),所以需要乘以,这样剩余个位置的感受野大小就是,和第一个位置的感受野加到一起就是上面的公式了。
原谅我书读的少,下面这个符号都不知识什么意思,学习一下:
,其中数学符号是累乘符号,是希腊字母的大写读pai,在数学上通常表示连乘,小写就表示圆周率。
此符号代表“求乘积”,上下添加的为求乘积的初始值和终止值,故。
另input输入层的感受野为:1,因为每个像素只能看到自身。
用第2篇的实例代入计算一下:
各层的卷积核与步长值:
代入公式:
得:
,第一层就直接是卷积核大小不用计算。
感受野的作用: (引用自第2篇的评论)
感受野是可以帮助设计网络结构的,至起码可以大致了解到在每一层的特征所涵盖的信息量。例如,输入图像大小是250*250的情况下,如果最后一层的感受野能超过250的话,那么可以认为在做最后的分类判断时所用到的特征已经涵盖了原始图像所有范围的信息了。在保证最后一层特征的感受野大小的情况下,如果能够尽可能的降低网络的参数总量,那么就是件很有意义的事情。事实上inception model就是这样的思路,通过非对称的结构来降低参数量,同时还能保证感受野。
Feature map特征图大小:
顺便记录一下feature map大小计算公式,来自上文感受野第1篇:
: number of input features
: number of output features
: convolution kernel size
: convolution padding size
: convolution stride size
举例:
输入特征图大小为,采用的卷积参数如下:
卷积核大小 ,padding大小,步长 。
经过一次卷积之后,得到大小为的输出特征图。在这个特征图上继续采用相同的卷积,得到一个 的特征图。
补充一个宽高不同的计算公式,来自《一文入门卷积神经网络:CNN通俗解析》:
输出宽度:
输出高度:
W :输入图像的宽度
H :输入图像的高度
Fw :滤波器或内核的宽度
Fh :滤波器的高度
P :填充
S :移动步幅
其实这个公式是用来倒推出padding size。
当padding=‘SAME’时:
先由另一个公式算出output size,然后再用上面公式倒推padding size。
计算得到padding的值,如果padding的值为整数,则填充padding圈;如果padding为小数,则填充padding的整数圈以后,再填充半圈,即右侧再填充一列和底侧再填充一行。(参考)
卷积过程的个人理解:
- 每一层有多少个卷积核filter就输出多少个feature map。
- 每一层的input有可能有多个channel。
- 每一层可以有n个filter。
- 对应channel数量,每个filter有相应的深度,比如说RGB图有3个channel,那么一层中可以有64个filter,每个filter的尺寸为,前面的是filter的宽高,后面的一个是对应channel数量的深度。
- 计算过程:
使用第4条的参数配置计算:(VGGNet举例)
1个filter有3层,每层的值都是不同的,一开始这些值都是随机生成的。将filter的每一层对应每个channel同时进行卷积计算,然后将3层channel与3层filter计算出的3个值加在一起当然还要再加上一个bias,变成这个filter对应的feature map的值。
也就是说3个channel与3层filter卷积出来的结果只有一个feature map,也就是一个filter对应一个feature map,换句话说不管有多少个channel每次卷积都会变成一个channel参与运算。
这样一共64个filter计算出64个feature map,然后使用Relu激活函数激活,然后又跟着卷积+Relu......,多次卷积和激活后再进行池化(max pooling),这一层结束运算然后将输出交给再下一层进行类似同样的操作。
最终VGGNet后面跟着3个全连接层(FC-4096,FC-4096,FC-1000),最后再使用soft-max进行分类。 - 每一层的filter数量是递增的,一般是以的倍数递增(成倍递增),这是因为随着层数深度的递进,feature map的尺寸越来越小,本卷积层的每个feature map提取的特征越具有代表性(精华部分),所以后一层卷积层需要增加feature map的数量,才能更充分的提取出前一层的特征,一般是成倍增加(不过具体论文会根据实验情况具体设置)。
参考:
CNN中feature map、卷积核、卷积核个数、filter、channel的概念解释,以及CNN 学习过程中卷积核更新的理解
VGGNet
TensorFlow神经网络(九)VGG net论文阅读笔记
百度百科的这篇居然写的不错:VGG 模型
【模型修改的漫漫长路】经典VGG模型理解-这大概是目前最详细的讲解了【一】
残差网络 ResNet
大话深度残差网络(DRN)ResNet网络原理
深度学习笔记(5)——学术界的霸主Resnet
一张图就可以理解(处理过程):
最主要的是这个function: 。
假定某段神经网络的输入是x,期望输出是H(x),即H(x)是期望的复杂潜在映射。
在上图的残差网络结构图中,通过“shortcut connections(捷径连接)”的方式,直接把输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,那么H(x)=x,也就是上面所提到的恒等映射。于是,ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) := H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。
RNN知识
一文搞懂RNN(循环神经网络)基础篇
完全图解RNN、RNN变体、Seq2Seq、Attention机制
目标检测
干货 | 目标检测入门,看这篇就够了(已更完)
基于深度学习的目标检测算法综述(一)
基于深度学习的目标检测算法综述(二)
基于深度学习的目标检测算法综述(三)
综述|基于深度学习的目标检测(一)
第三十三节,目标检测之选择性搜索-Selective Search
楼上作者的一堆目标检测相关文章及其他深度学习知识
一文读懂Faster RCNN
从编程实现角度学习Faster R-CNN(附极简实现)
目标检测算法已经迭代更新好多代,我觉得应该深入学习最新的最好的算法,毕竟老的算法已经没有什么意义,稍微了解其大概原理即可。
Faster RCNN开源实现:
tensorflow版
endernewton/tf-faster-rcnn
tensorpack/examples/FasterRCNN/
smallcorgi/Faster-RCNN_TFkeras版
jinfagang/keras_frcnn
Mask RCNN开源实现:
- tensorflow版
CharlesShang/FastMaskRCNN
matterport/Mask_RCNN
文字检测
白翔:趣谈“捕文捉字”-- 场景文字检测 | VALSE2017之十
场景文字检测—CTPN原理与实现
一文读懂CRNN+CTC文字识别
GAN对抗网络
GAN对抗网络入门教程
GAN学习指南:从原理入门到制作生成Demo
线稿自动上色
CNN网络结构可视化查看工具
Netscope CNN Analyzer
可以在线查看CNN各种网络结构,非常棒。
数学知识
可能是最好的微积分课程了(微积分入门到应用)
张量的通俗理解
速成零基础高中数学导数部分
matrix: 矩阵:mn矩阵,m是row, n是column,也就是行列。
identity matrix: 单位矩阵。
transpose matrix: 转置矩阵,mn-> nm,行列互换。
矩阵mn乘以列向量n也就是n1的矩阵, 结果为m的向量也就是m*1的矩阵:
矩阵相乘
13,1行3列乘以34,3行4列,列数等于行数才可以相乘,结果为1行4列。
但是 34乘以13就不行,会出错。
导数与微分
(1)方向导数:本质就是函数在A点无数个切线的斜率的定义。每一个切线都代表一个变化的方向。
(2)梯度:函数在A点无数个变化方向中变化最快的那个方向。
(3)全微分:函数从A点到B点变化的量(其实是取一个无穷小的变化的量)。
(4)偏导:多元函数降维时候的变化,比如二元函数固定y,只让x单独变化,从而看成是关于x的一元函数的变化来研究。
导数:即描述函数在一点处的变化快慢的趋势。
微分:即描述函数在一点处发生一个无穷小区间的变化的量的线性逼近。
概率与统计
《概率论与数理统计》教学视频全集(宋浩)
交叉熵
完美解释交叉熵
范数
如何通俗易懂地解释「范数」?