这几天看了inceptionv2,resnetv1,inception-resnet-v2三篇tensorflow slim下的实现。看到最后发现inception模块和resnet模块很相像。到了inception-resnet-v2这篇结合代码,后少能找到resnet的踪迹。那么两者的区别在什么地方呢。
和同学讨论了一下,觉得有两个地方。第一,resnet模块是直接将卷积后值相加,没有通道数上的改变。
output = tf.nn.relu6(shortcut + residual)#快捷连接和残差的值进行相加。
inception是对通道数直接进行了叠加,所以通道数上发生了变化。
net = tf.concat(axis=concat_dim, values=[branch_0, branch_1, branch_2, branch_3])#对通道数进行了连接。
第二点,resnet直接将结果进行了激活,在tensorflow中使用relu6.
而inception则是在每个卷积之后都进行了激活这部分内容写在了
`def inception_arg_scope(weight_decay=0.00004,
use_batch_norm=True,
batch_norm_decay=0.9997,
batch_norm_epsilon=0.001,
activation_fn=tf.nn.relu,
batch_norm_updates_collections=tf.GraphKeys.UPDATE_OPS,
batch_norm_scale=False):
`
直接进行了默认的声明。
其实,大部分神经网络结构都是相同的。尤其是inception v1-v4 这样的结构,融合了很多的小技巧,又有着简单明了的思路。