本文基于Deep Residual Learning for Image Recognition的最小层次18层搭建
本模型由于引入了残差(Residual)的概念(我更愿意把他看作为shortcut)使得网络层数加深不会导致更坏的结果,使得网络可以多层堆叠而不会更坏
由于网络过深设备算不过来,故只搭建18层
注意:博主目前还不会任何数据优化手段,只是对元数据进行了-1,1映射,请自行叠加骚操作
前置准备
python3.6
tensorflow-gpu
cuda kit
cudnn
前置技能
cnn
bpnn
batchnormalization
padding pooling sample
模型关键
可以看到shortcut的加入我们的网络最多只会退化到x输入时的layer depth。
假设网络输出h(x) 由图有 h(x)=f(x)+x ,则我们要的结果是f(x) ,所以f(x)==h(x)-x,所以我们对f(x)进行优化,使得f(x)与ground true的loss收敛,这里我们用 cross entropy来评估loss。对loss求导获得更新值,剩下的其实就和cnn没啥区别了。
模型整体框架
我们可以看到在最后还有一大坨full dense connect,那是用来分类的,cifar100不是一百分类问题嘛。不过由于参数量过大我们选择降低层数。
代码实现
首先我先给大家展示一下参数量,否则各位gpu可能mmp
看到没有 可训练的参数高达1千万,当然也可以使用混合精度训练,或者直接fp16半精度训练,但本文不用。
模型关键是一个网络的basic block 多个相同的堆叠 会变成 resnet block,多个resnet block堆叠就差不多是一个resnet了。
注意,不同resnet block的kernel size相同,感知野也相同,但随着层次变深channel会增加,变成高维度数据
basic block
class BasicBlock(layers.Layer):
def __init__(self, kernel_num,stride=1):
super(