什么是Inception网络?

Inception网络是Google提出的一种CNN网络结构,它通过在一个层内并行使用不同尺寸的卷积核和池化窗来改善网络的深度和宽度。

Inception网络的主要特点是:
使用不同尺寸的卷积核(1×1,3×3,5×5)和3×3池化层并行操作,然后将输出concatenation在深度方向上连接。
1×1卷积核用于降维和计算bottleneck,减少运算量和参数量。
较大的卷积核用于缩小感受野,提取空间信息。较小的卷积核用于提取细致特征。
通过并行不同尺度的操作提取多尺度信息,然后concatenation融合。
通过不断stacking inception module,构建更深层的网络结构。

基本的Inception模块代码如下:

python
def inception_module(input_tensor, n1x1, n3x3_reduce, n3x3, n5x5_reduce, n5x5, pool_proj, name):

    # 1x1卷积路径 
    conv1x1 = Conv2D(n1x1, (1, 1), activation='relu', padding='same')(input_tensor)

    # 3x3卷积路径 1 
    conv3x3_1 = Conv2D(n3x3_reduce, (1, 1), activation='relu', padding='same')(input_tensor)
    conv3x3 = Conv2D(n3x3, (3, 3), activation='relu', padding='same')(conv3x3_1)

    # 5x5卷积路径 1  
    conv5x5_1 = Conv2D(n5x5_reduce, (1, 1), activation='relu', padding='same')(input_tensor)
    conv5x5 = Conv2D(n5x5, (5, 5), activation='relu', padding='same')(conv5x5_1)

    # 3x3池化路径
    pool3x3 = MaxPool2D((3, 3), strides=(1, 1), padding='same')(input_tensor)
    pool_proj = Conv2D(pool_proj, (1, 1), activation='relu', padding='same')(pool3x3)

    # 拼接各路径
    output_tensor = concatenate([conv1x1, conv3x3, conv5x5, pool_proj], axis=3, name=name) 
    return output_tensor 

在这个示例中,我们实现了Inception v1中基本的Inception模块。