网络的完整结构,可通过下面代码显示在控制台上
import keras_resnet.models
import keras
shape, classes = (224, 224, 3), 1000
x = keras.layers.Input(shape)
model = keras_resnet.models.ResNet50(x)
model.summary()
网络源码实现:
下面节选自python3.6/site-packages/keras_resnet/models/_2d.py
刚开始,第一层,含有补边,卷积,BN,激活函数五个部分
备注:网络中,一般把含有可训练参数的模块称为一层,比如卷积层称为一层,而激活函数等不含可训练参数的模块一般不称为一层。
1. keras.layers.ZeroPadding2D(padding=3, name="padding_conv1")(inputs)
功能:对输入inputs的4个边进行补0,比如若输入图像尺寸为(224,224,3),则每个边多补充3行(列)0,
则宽就变成了224+3+3=230, 即经过这一层后,图片尺寸转变为(230,230,3)
2. keras.layers.Conv2D(64, (7, 7), strides=(2, 2), use_bias=False, name="conv1")(x)
功能:卷积层,卷积核(7,7,64), strid=2, 若输入图片x的尺寸为(230,230,3),则经过这个卷积层后的尺寸为:
根据计算公式,可得,新的宽为
(230-7+1)/2=112, 因此输入(230,230,3)的图片经过这个卷积层后,输出尺寸为(112,112,64)
3.keras_resnet.layers.BatchNormalization(axis=axis, epsilon=1e-5, freeze=freeze_bn, name="bn_conv1")(x)
BN层,对输入进行归一化,不改变输入的尺寸,输出尺寸为(112,112,64)
4.keras.layers.Activation("relu", name="conv1_relu")(x)
激活函数层,用的relu激活函数,不改变输入的尺寸,输出尺寸为(112,112,64)
5.keras.layers.MaxPooling2D((3, 3), strides=(2, 2), padding="same", name="pool1")(x)
池化层, 输出的计算公式同上述卷积层,若输入维度(112,112,64),则输出尺寸为(56,56,64)
(112-3+1)/2=????这里结论是56,怎么算出来的,不知道哦
6. 后面是block的构造
另外,对于resnet来讲,还有一个重要的bottleneck_2d模块,位于python3.6/site_packages/keras_resnet/blocks/_2d.py中
de