ResNet
一、简介
ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,ResNet是一种残差网络。
二、亮点
1、超深的网络结构
2、提出了residual模块
3、使用Batch Normalization加速训练
三、residual结构
右图中1X1的卷积核是用来降维和升维的
3X3X256X256+3X3X256X256=1179648
1x1x256x64+3x3x64x64+1x1x64x256=69632
当你使用的传达结构越多,你所节省的参数也就越多
四、ResNet搭建
import tensorflow as tf
import tensorflow.contrib.slim as slim
import collection
from datetime import datetime
import time
import math
from tensorflow.contrib.layers.python.layers import utils
#定义Block类
class Block(collections.namedtuple('Block',['scope','unit_fn','args'])):
#定义相关函数
#定义降采样方法
def subsample(inputs,factor,scope=None):
if factor==1:
return inputs
else:
return slim.max_pool2d(inputs,kernel_size=[1,1],stride=factor,scope=scope)
#定义卷积操作方法
def conv2d_same(inputs,num_outputs,kernel_size,stride,scope=None):
if stride==1:
return slim.conv2d(inputs,num_outputs,kernel_size,stride=1,padding='SAME',scope=scope)
else:
#修整Inputs,对inputs进行补零操作
padding_total=kernel_size-1
padding_beg=padding_total//2
padding_end=padding_total-padding_beg
inputs=tf.pad(inputs,[[0,0],[padding_beg,padding_end],[padding_beg,padding_end],[0,0]])
return slim.conv2d(inputs,num_outputs,kernel_size,stride=stride,padding='VALID',scope=scope)
#定义堆叠block方法
@slim.add_arg_scope
def stack_block_dense(net,blocks,outputs_collections=None):
for block in blocks:
#双层循环,遍历blocks,遍历res unit堆叠
with tf.variable_scope(block.scope,'block',[net]) as sc:
#用两个tf.variable_scope将残差学习单元命名为block1/unit_1的形式
for i ,unit in enumerate(block.args):
with tf.variable_scope('unit_%d'%(i+1),values=[net]):
#利用第二层循环拿到block中的args,将其展开为depth,depth_bottleneck,strdie
unit_depth,unit_depth_bottleneck,unit_stride