前言
近几年的模型结构的改进,越来越偏向于宽度的改进,如SKnet以及ResNeSt,都获得了不错的结果,本文讨论的是百度所提出的HS-ResNet,通过对网络的复现以及论文的阅读,感觉本片paper是把Res2Net思想和ResNeSt结合到一起了。
模型介绍
网络模型如图所示,先像ResNeSt一样,在channel这个层级上把结构split为5分,每一份都和前面的一份concat(类似Res2Net)操作,后进行卷积,最后再把得到的特征进行concat。
代码实现
import tensorflow as tf
x = tf.placeholder(tf.float32,[None, 500, 500, 3])#输入图片大小
def Hierarchical_split(x, channel):
channel_begin=x.get_shape().as_list()[-1]
##第一阶段
layer1=tf.nn.relu(tf.layers.batch_normalization(tf.layers.conv2d(x,channel,1,strides=1, padding='same'),axis=-1,momentum=0.99,epsilon=0.001, center=True, scale=True,))
layer1_0,layer1_1,layer1_2,layer1_3,layer1_4=tf.split(layer1,5,-1)
##第二阶段
channel1=layer1_1.get_shape().as_list()[-1]*2
layer1_1=tf.nn.relu(tf.layers.batch_normalization(tf.layers.conv2d(layer1_1,channel1,3,strides=1, padding='same'),axis=-1,momentum=0.99,epsilon=0.001, center=True, scale=True,))
layer1_1_0,layer1_1_1=tf.split(layer1_1,2,-1)
##第三阶段
channel2=layer1_2.get_shape().as_list()[-1]*2
layer1_2=tf.concat([layer1_2,layer1_1_1],-1)
layer1_2=tf.nn.relu(tf.layers.batch_normalization(tf.layers.conv2d(layer1_2,channel2,3,strides=1, padding='same'),axis=-1,momentum=0.99,epsilon=0.001, center=True, scale=True,))
layer1_2_0,layer1_2_1=tf.split(layer1_2,2,-1)
##第四阶段
channel3=layer1_3.get_shape().as_list()[-1]*2
layer1_3=tf.concat([layer1_3,layer1_2_1],-1)
layer1_3=tf.nn.relu(tf.layers.batch_normalization(tf.layers.conv2d(layer1_3,channel3,3,strides=1, padding='same'),axis=-1,momentum=0.99,epsilon=0.001, center=True, scale=True,))
layer1_3_0,layer1_3_1=tf.split(layer1_3,2,-1)
##第五阶段
channel4=layer1_4.get_shape().as_list()[-1]*2
layer1_4=tf.concat([layer1_4,layer1_3_1],-1)
layer1_4=tf.nn.relu(tf.layers.batch_normalization(tf.layers.conv2d(layer1_4,channel4,3,strides=1, padding='same'),axis=-1,momentum=0.99,epsilon=0.001, center=True, scale=True,))
##第六阶段
layer_all=tf.concat([layer1_0, layer1_1_0, layer1_2_0, layer1_3_0, layer1_4],-1)
layer_all=tf.nn.relu(tf.layers.batch_normalization(tf.layers.conv2d(layer_all,channel_begin,1,strides=1, padding='same'),axis=-1,momentum=0.99,epsilon=0.001, center=True, scale=True,))
return x+layer_all
layer1=tf.nn.relu(tf.layers.conv2d(x,256,3,strides=1, padding='same'))
layer2=Hierarchical_split(layer1,250)
print(layer2)