Skip to content

Commit

Permalink
问题解答
Browse files Browse the repository at this point in the history
  • Loading branch information
Unakar committed Feb 14, 2024
1 parent 9072a23 commit 04bafad
Showing 1 changed file with 40 additions and 21 deletions.
61 changes: 40 additions & 21 deletions docs/cifar10/问题.md
Original file line number Diff line number Diff line change
@@ -1,46 +1,65 @@
# 疑问解答
特征工程:对数据(图像,音频转化tensor,标准化,Augmentation等)进行预处理,以便于模型更好的学习到数据的特征。
## 1. model.train()和model.eval()什么作用?

X: (x-x.mean)/x.std,数据增强
model.train()的作用是**启用 Batch Normalization 和 Dropout。** model.train()是保证BN层能够用到每一批数据的均值和方差。对于Dropout,model.train()是随机取一部分网络连接来训练更新参数。

model.eval()的作用是**不启用 Batch Normalization 和 Dropout。** 训练完train样本后,生成的模型model要用来测试样本。在model(test)之前,需要加上model.eval(),否则的话,有输入数据,即使不训练,它也会改变权值。这是model中含有BN层和Dropout所带来的的性质。

softmax:将输出转化为概率分布,使得输出的概率和为1。
## 2. Conv2d参数?卷积核的意义?池化的意义?

conv2d参数:输入通道数,输出通道数,卷积核大小(kernel)
encoder高维向量空间的一组基为kernel 3*3,5*5,7*7
**nn.Conv2d (self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)**)

relu(x) = max(0,x)
leakyRelu(x) = max(0.01x,x)
**1. 卷积核(convolutional kernel)**:可以看作对某个局部的加权求和;它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整体,而是先从局部开始认识,这就对应了卷积。卷积核的大小一般有1x1,3x3和5x5的尺寸(一般是奇数x奇数)。

optimizer:优化器,用于更新模型参数,使得loss最小。SGD随机梯度下降
criterian: MSELoss: (y_hat - y)^2,交叉熵损失 CrossEntropyLoss ,KL散度损失 KLDivLoss
p,q两个分布的KL散度:D_kl(p||q) = sum(p(x)log(p(x)/q(x)))
卷积等价于一个全连接层,但是参数共享,减少了参数数量。
卷积核的个数就对应输出的通道数(channels),这里需要说明的是对于输入的每个通道,输出每个通道上的卷积核是不一样的。比如输入是28x28x192(WxDxK,K代表通道数),然后在3x3的卷积核,卷积通道数为128,那么卷积的参数有3x3x192x128,其中前两个对应的每个卷积里面的参数,后两个对应的卷积总的个数(一般理解为,卷积核的权值共享只在每个单独通道上有效,至于通道与通道间的对应的卷积核是独立不共享的,所以这里是192x128)。

权重初始化:Kaiming initialize
**2. 池化(pooling)**:卷积特征往往对应某个局部的特征。要得到global的特征需要将全局的特征执行一个aggregation(聚合)。池化就是这样一个操作,对于每个卷积通道,将更大尺寸(甚至是global)上的卷积特征进行pooling就可以得到更有全局性的特征。这里的pooling当然就对应了cross region。

Dataloader:
sampler: indice
dataset: data
## 3. 权重如何初始化?

# Q1:batch_size的大小如何选择?是否越大越好?
大的batch可能导致模型更容易收敛局部在最优解,而不是全局最优;
大的batch使得模型总更新次数变少了,可能导致模型收敛速度变慢;显存不够
**为什么初始化很重要**

不正确初始化的权重会导致梯度消失或爆炸问题,从而对训练过程产生负面影响。

对于梯度消失问题,权重更新很小,导致收敛速度变慢——这使得损失函数的优化变慢,在最坏的情况下,可能会阻止网络完全收敛。相反,使用过大的权重进行初始化可能会导致在前向传播或反向传播过程中梯度值爆炸。

一般采用何凯明初始化,torch.nn的linear,conv函数在init时已经内置了kaiming初始化,无需关系。

另外,可以用预训练模型的权重做初始化。冻结深层网络参数,只对浅层做更新,效果也很好

## 4. Dataloader的构造?

**DataLoader**包括**两个子模块****Sampler模块**,主要是生成索引index,**DataSet模块**,主要是根据索引读取数据。Dataset 类是一个抽象类,它可以用来表示数据集。我们通过继承 Dataset 类来自定义数据集的格式、大小和其它属性,后面就可以供 DataLoader 类直接使用。

在实际项目中,如果数据量很大,考虑到内存有限、I/O 速度等问题,在训练过程中不可能一次性的将所有数据全部加载到内存中,也不能只用一个进程去加载,所以就需要多进程、迭代加载,而 **DataLoader** 就是基于这些需要被设计出来的。**DataLoader** 是一个迭代器,最基本的使用方法就是**传入一个 Dataset 对象**,它会根据参数 **batch_size** 的值生成一个 batch 的数据,节省内存的同时,它还可以实现多进程、数据打乱等处理。

## 5. 不同任务loss衡量函数的选取?

回归损失一般采用MSE

分类任务常用交叉熵

loss函数选取与设置往往随着任务场景和先验知识而发生变动



## Q1:归纳偏置 inductive bias(为什么我的网络可以学习到图像信息)

# Q2:归纳偏置 inductive bias(为什么我的网络可以学习到图像信息)
先验假设:卷积层的参数共享,使得网络可以学习到图像的局部特征,而不是整体特征。
深度神经网络:层次化处理信息,使得网络可以学习到图像的抽象特征。
卷积神经网络CNN:信息具有空间局部性
反馈神经网络RNN:信息具有时序性,强调顺序的重要性
图神经网络GNN:认为图中心节点与周围节点的相邻关系可以决定信息流动

# Q3: 先验知识注入深度学习过程
## Q2: 先验知识注入深度学习过程

1. 网络结构就是先验知识
2. 网络权重是先验,imagnet预训练权重baseline model(固定上层模型权重,只改变全连接层参数做更新)
3. 数据增强注入先验知识
4. 训练过程中的正则化(惩罚项)L1,L2,

# Q4:如何对baseline model做优化,使其性能增长
## Q3:如何对baseline model做优化,使其性能增长

见 探究.md


Expand Down

0 comments on commit 04bafad

Please sign in to comment.