AlexNet将sigmoid激活函数改成了更加简单的ReLU激活函数。一方面,ReLU激活函数的计算更简单,例如它并没有sigmoid激活函数中的求幂运算。另一方面,ReLU激活函数在不同的参数初始化方法下使模型更容易训练。这是由于当sigmoid激活函数输出极接近0或1时,这些区域的梯度几乎为0,从而造成反向传播无法继续更新部分模型参数;而ReLU激活函数在正区间的梯度恒为1。因此,若模型参数初始化不当,sigmoid函数可能在正区间得到几乎为0的梯度,从而令模型无法得到有效训练。
全连接层,1.耗费内存,2.容易过拟合,需要dropout. 所以NiN 用kernel_size=1的卷积层替代,减少内存消耗,缓解过拟合。1x1卷积失去卷积层识别高宽上相邻元素构成模式的功能,有可能增加有效模型训练时间。
全局平均池化层对每个通道中所有元素求平均,全局平均池化层即窗口形状等于输入空间维形状的平均池化层. nn.GlobalAvgPool2D()
打印整个网络使用的参数数量 net.collect_params()
训练内存占用:在模型参数初始化完成后,我们交替地进行正向传播和反向传播,并根据反向传播计算的梯度迭代模型参数。既然我们在反向传播中使用了正向传播中计算得到的中间变量来避免重复计算,那么这个复用也导致正向传播结束后不能立即释放中间变量内存。这也是训练要比预测占用更多内存的一个重要原因。另外需要指出的是,这些中间变量的个数大体上与网络层数线性相关,每个变量的大小跟批量大小和输入个数也是线性相关的,它们是导致较深的神经网络使用较大批量训练时更容易超内存的主要原因。
调参数:
先用一个hidden layer,找到合适的units
调整learning rate,大小一般从0.001,0.003…0.01,0.03…0.1,0.3,…1,3…
优化training loss到最低,有轻微过拟合,根据学习曲线可以调整epochs进行early stop。
调整weight decay到test loss约等于training loss.
不同hidden units对learning rate和weight_decay也会有很大不同,当改变数值较大时需要调调learning rate.