带着问题学习深度学习,罗列深度学习中一些基础问题,并在学习中一点一点解决并理解相关问题。
同时在此特别感谢Doctor Liu的指导!
以下涉及问题的答案可能来源于网络或者论文,以及书籍,如有侵权请联系删除。
(一)深度学习/神经网络
1.神经网络常用的激活函数有哪些?(五种以上)目前最常用的有哪些?
ans:sigmoid函数,tanh函数,ReLU函数 ,Leaky ReLU函数, Maxout函数, ELU函数
2.为什么要引入激活函数?
ans: 在神经网络中,我们经常可以看到对于某一个隐藏层的节点,该节点的激活值计算一般分为两步:
在进入这个隐藏节点后,会先进行一个线性变换,计算出值 z[1],再进行一个非线性变换,也就是经过非线性激活函数.
3.常用的损失函数有哪些?都用在什么任务上?
ans:损失函数是指用于计算标签和预测值之间的差异
binary_crossentropy,二分类问题,多分类,多标签问题;
categorical_crossentroy,多分类,单标签问题;
mse,回归到任意值;
mse,binary_crossentropy,回归到0-1范围的值;
BCELoss,二分类用的交叉熵
4.为什么要设置学习率衰减?常用的学习率衰减方式有哪些?
ans:我们平衡模型的训练速度和损失(loss)后选择了相对合适的学习率(learning rate),但是训练集的损失下降到一定的程度后就不在下降了,遇到这种情况通常可以通过适当降低学习率(learning rate)来实现。但是,降低学习率又会延长训练所需的时间。学习率衰减(learning rate decay)就是一种可以平衡这两者之间矛盾的解决方案。学习率衰减的基本思想是:学习率随着训练的进行逐渐衰减。学习率衰减基本有两种实现方法:
- 线性衰减。例如:每过5个epochs学习率减半
- 指数衰减。例如:每过5个epochs将学习率乘以0.1
5.常用的梯度下降优化算法有哪些?
ans:小批量随机梯度下降;真SGD,Adagrad,RMSprop,带动量的随机梯度下降Momentum,Adam
6.什么是分类任务?什么是回归任务?神经网络如何用于这两类任务上?
ans:
- 分类是预测离散类标签输出的问题。
- 回归是预测连续数量输出的问题。
分类预测建模是将映射函数(f)从输入变量(x)逼近到离散输出变量(y)的任务。输出变量通常称为标签或类别。映射函数预测给定观测值的类或类别,分类模型通常将连续值预测为属于每个输出类别的给定示例的概率。 概率可以被解释为属于每个类别的给定例子的可能性或置信度。 可以通过选择具有最高概率的类别标签将预测概率转换为类别值。
回归预测建模是将输入变量(X)映射到连续输出变量(y)的映射函数(f)的任务。连续输出变量是一个实数值,例如整数或浮点值。 这些往往是数量,如金额和大小。
- 回归问题需要预测数量。
- 回归可以具有实值或离散的输入变量。
- 多输入变量的问题通常称为多元回归问题。
- 输入变量按时间排序的回归问题称为时间序列预测问题。
由于回归预测模型预测一个数量,所以该模型的技巧必须作为这些预测中的一个误差来报告。
7.什么是batch normalization?
ans: 批标准化, 和普通的数据标准化类似, 是将分散的数据统一的一种做法, 也是优化神经网络的一种方法.核心思想是标准化这个过程是可微的,减少不合理的初始化问题,对很坏单独初始化有很强的鲁棒性,同时可以加快网络的手链速度。还可以理解微在网络的每一层前面都会做数据的预处理。
(为什么Batch Normalization那么有用?https://zhuanlan.zhihu.com/p/5274928
(batch normalization 详解 https://blog.csdn.net/gbyy42299/article/details/80363332)
8.常用的权重初始化方法有哪些?
因为权重是一个Variable,所以只需要提取其中的data属性,在进行所需要的处理即可。
- Xavier初始化,uniform形式,normal形式;
- MSRA,uniform形式,normal形式;
- Gaussian
(二)卷积神经网络
1.卷积神经网络中的卷积是什么意思?为什么要使用卷积?
ans:参数共享
,稀疏连接
,平移不变
。
深层神经网络中使用卷积,可以通过参数共享和稀疏连接,减少参数。参数少了,我们就能用更少的训练集来训练网络,从而预防过拟合。
- 卷积层只需要很少的参数,就能连接两个很大维度的特征
- 全连接层,要连接两个很大维度的特征,参数会非常多
- 有Pooling层的存在,神经网络具备平移不变这样的性质,提高了泛化能力。
2.卷积神经网络与全连接神经网络有什么区别和联系?
ans:相似之处,都是由一些神经元构成,神经元中包含需要学习的参数,通过网络的输入,最后输出结果,通过损失函数优化网络中的参数。
-
不同之处:网络的层结构不同,全连接神经网络由一系列的隐藏层组成,每个隐藏层由若干个神经元构成,每个神经元与前一层的神经元相关联,但每一层的神经元却是独立的,这样会导致权重的数目激增;卷积神经网络是一个3D容量的神经元,通过宽度,高度,深度排列。
3.请解释什么是:(1)卷积核(2)卷积核大小(3)卷积步长(4)feature map(5)padding(6)pooling
ans:
- 卷积核:“模板窗口”每移动到一个位置,就和图片中的对应元素进行一次卷积运算,注意我们一般把“模板窗口”称为
卷积核
。特征向量集,提取特征 - 卷积核大小:滤波器的尺寸?3D的权重集合称之为卷积核(参数共享为什么有效是因为:一个特征在不同位置的表现是相同的)
- 卷积步长:卷积步长是指过滤器在图像上滑动的距离;
- feature map:在每个卷积层,数据都是以三维形式存在的。你可以把它看成许多个二维图片叠在一起,其中每一个称为一个feature map;
- padding:通过一个3*3的过滤器来对6*6的图像进行卷积,得到了一幅4*4的图像,假设输出图像大小为n*n与过滤器大小为f*f,输出图像大小则为(n−f+1)∗(n−f+1)(n−f+1)∗(n−f+1)。 这样做卷积运算的缺点是,卷积图像的大小会不断缩小,另外图像的左上角的元素只被一个输出所使用,所以在图像边缘的像素在输出中采用较少,也就意味着你丢掉了很多图像边缘的信息,为了解决这两个问题,就引入了padding操作,也就是在图像卷积操作之前,沿着图像边缘用0进行图像填充。对于3*3的过滤器,我们填充宽度为1时,就可以保证输出图像和输入图像一样大;
- pooling:池化层,降低数据体的空间的大小;
4.pooling的方式有哪些?目前常用的是什么?
ans:
- Max Pooling Over Time操作
- K-Max Pooling
- Chunk-Max Pooling
(目前只用过Maxpool2d)
5.如何计算卷积后的feature map的大小?
ans:
像素宽度:W(Width)
填充大小:P(Padding)
卷积核大小:K(Kernel-size)
步长大小:S(stride)
卷积后所得feature map尺寸大小计算公式如下:
6.目前常见的卷积神经网络模型有哪些?请对比他们的异同(以imageNet竞赛的冠军模型为例)
ans:
- LeNet
- AlexNet
- GoogleNet
- ResNet
异同点:更深吧!
7.什么叫端到端学习?
ans:从输入端(输入数据)到输出端会得到一个预测结果,与真实结果相比较会得到一个误差,这个误差会在模型中的每一层传递(反向传播),每一层的表示都会根据这个误差来做调整,直到模型收敛或达到预期的效果才结束,这是端到端的。
8.用卷积神经网络对图片进行分类和用SVM有什么区别?
ans:神经网络是端到端的训练,不需要人工标注,svm一般需要预先设计和提取特征。
(三)深度学习之pytorch学习
1.如何查看pytorch版本?
import torch
print(torch.__version__) #注意是双下划线
2.如何查看当前pytorch环境是否支持GPU运算?
torch.cuda.is_available()
3.numpy array和pytorch variable如何相互转化?
ans:
1 tensor 转 numpy
a = torch.FloatTensor(3,3)
print a.numpy()
2 numpy 转 tensor
a = np.ones(5)
torch.from_numpy(a)
3 Variable 转 numpy
a = Variable(torch.FloatTensor(3,3))
print a.data.numpy()
4 numpy 转 Variable
a = np.ones(5)
print Variable(torch.from_numpy(a))
4.如何查看一个varible(tensor)是否会被求导?如何设置一个variable(tensor)是否被求导?
ans:
5.请解释以下类的初始化参数及用法:
(1) torch.nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True)
ans:Conv2d:二维卷积 ;
in_channels:输入数据体的深度;
out_channels:输出数据体的深度;
kernel_size:卷积核大小;
stride=1:步长;
padding=x:表示周围进行x个像素的填充
dilation=1:表示卷积对输入空间的间隔,默认dilation=1;
groups=1:输入输出数据体深度上的联系,默认groups=1;
bias=True:布尔值,默认bias=True,也表偏执;
(2) torch.nn.MaxPool2d(kernel_size,stride=None,padding=0,dilation=1,return_indices=False,ceil_mode=False)
ans: MaxPool2d:二维最大池化层;
return_indices=False:表示是否返回最大值所处的下标,默认return_indices=False;
ceil_mode=False:默认ceil_mode=False
(3) torch.nn.linear(in_features,out_feature,bias=Ture)
ans:torch.nn.Linear类用于定义模型的线性层,即完成前面提到的不同的层之间的线性变换;
in_features:输入特征数;
out_feature:输出特征数。