0%

深度神经网络基础

DNN,深度神经网络。从上层看,就是在硅基上构造神经元,再由神经元经过某种设计形成神经网络。让信息输入神经网络,在网络内穿梭、被修改,最终输出为想要的结果。网络中的参数决定了信息将被如何修改。参数一开始是随机初始化而来的,输出一开始也不是我们想要的。好在我们拥有大量的数据。我们用Loss来衡量实际输出和理想输出之间的差距,再利用反向传播机制和链式法则把每一个参数对Loss的影响求出来^1。结合学习率,修改参数,使得Loss减小。

本博客将近距离观察神经网络中的一些细节,包括常用的轮子。

卷积层

1
self.conv_in = nn.Conv2d(in_ch, 64, 3, stride=2, padding=1)

这是一行定义网络中卷积层的代码。卷积层的输入一般是(N,C,H,W),分别表示batchsize,chanel,highet,width。输出也是这种格式,只不过会把CHW变一变。

例如,这行代码中in_ch规定此卷积层的输入通道数,输出通道数则变为64。卷积核宽度为3。把这三个参数放到前边是因为,他们决定卷积层要准备64个卷积核。每个卷积核都是长宽为3,高为in_ch的。那么卷积核是什么样的呢?是那种高斯模糊时候用的呢还是锐化用的呢?这个交给网络去学,每个卷积核里3 $\times$ 3 $\times$ in_ch 的参数决定了卷积核提取输入数据中怎样的信息,所以这个必须交给网络去学,而不是我们自己随便确定。这些决定了卷积核用途的参数,被称为“权重”。一个卷积核需要3 $\times$ 3 $\times$ in_ch 个权重,由于输出是64通道的,所以需要64个卷积核,整个卷积层需要的权重数量为 3 $\times$ 3 $\times$ in_ch $\times$ 64 。默认情况下还会运行每个卷积核的输出有一定偏移,所以64个卷积核还会有64个参数,也让网络去学。

前三个参数决定了该卷积层输入的通道数、输出的通道数和卷积层自身的权重、偏移参数数量。后两个参数步长和边界补偿则和卷积核的宽度一起,共同决定了输入的宽高经过卷积层后会变成怎样的宽高。例如,加入输出的是(N,3,64,64)的数据,图片宽高都是64,则经过该卷积层之后,输出的宽高会变为 (64-1)//2 + 1*2 = 33,即(N,64,33,33)的数据。