深度学习学习笔记(一)

带着问题学习深度学习,罗列深度学习中一些基础问题,并在学习中一点一点解决并理解相关问题。

同时在此特别感谢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)就是一种可以平衡这两者之间矛盾的解决方案。学习率衰减的基本思想是:学习率随着训练的进行逐渐衰减。学习率衰减基本有两种实现方法:

  1. 线性衰减。例如:每过5个epochs学习率减半
  2. 指数衰减。例如:每过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:相似之处,都是由一些神经元构成,神经元中包含需要学习的参数,通过网络的输入,最后输出结果,通过损失函数优化网络中的参数。

  1. 不同之处:网络的层结构不同,全连接神经网络由一系列的隐藏层组成,每个隐藏层由若干个神经元构成,每个神经元与前一层的神经元相关联,但每一层的神经元却是独立的,这样会导致权重的数目激增;卷积神经网络是一个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尺寸大小计算公式如下:

W_{n+1}=\left (W_{n}+2*P-K \right )/S+1

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:输出特征数。

猜你喜欢

转载自blog.csdn.net/qq_41997920/article/details/88102550
今日推荐