Group Convolution分组卷积,以及Depthwise Convolution和Global Depthwise Convolution

博客:blog.shinelee.me | 博客园 | 优快云

写在前面

Group Convolution分组卷积,最早见于AlexNet——2012年Imagenet的冠军方法,Group Convolution被用来切分网络,使其在2个GPU上并行运行,AlexNet网络结构如下:

AlexNet

Convolution VS Group Convolution

在介绍Group Convolution前,先回顾下常规卷积是怎么做的,具体可以参见博文《卷积神经网络之卷积计算、作用与思想》。如果输入feature map尺寸为 C ∗ H ∗ W C*H*W CHW,卷积核有 N N N个,输出feature map与卷积核的数量相同也是 N N N,每个卷积核的尺寸为 C ∗ K ∗ K C*K*K CKK N N N个卷积核的总参数量为 N ∗ C ∗ K ∗ K N*C*K*K NCKK,输入map与输出map的连接方式如下图左所示,图片来自链接

Convolution VS Group Convolution

Group Convolution顾名思义,则是对输入feature map进行分组,然后每组分别卷积。假设输入feature map的尺寸仍为 C ∗ H ∗ W C*H*W C

深度可分离卷积模块的代码: ```python import tensorflow as tf def depthwise_separable_conv(inputs, num_filters, kernel_size, strides=(1, 1), padding='SAME', activation=tf.nn.selu, use_bn=True, use_winograd=False): if use_winograd: # Use Winograd algorithm for small kernel size if kernel_size == (3, 3): strides = (1, 1) padding = 'VALID' elif kernel_size == (5, 5): strides = (1, 1) padding = 'SAME' # Depthwise Convolution net = tf.keras.layers.DepthwiseConv2D(kernel_size=kernel_size, strides=strides, padding=padding, use_bias=not use_bn)(inputs) net = tf.keras.layers.BatchNormalization()(net) if use_bn else net net = activation(net) # Pointwise Convolution (1x1 Convolution) net = tf.keras.layers.Conv2D(filters=num_filters, kernel_size=(1, 1), strides=(1, 1), padding='SAME', use_bias=not use_bn)(net) net = tf.keras.layers.BatchNormalization()(net) if use_bn else net net = activation(net) return net ``` 这个深度可分离卷积模块包含了深度卷积、批量归一化、激活函数卷积等操作,并且根据需要提供了是否使用Winograd算法的选项。 接下来是搭建一个简单的神经网络的代码: ```python import tensorflow as tf def simple_cnn(input_shape, num_classes): inputs = tf.keras.layers.Input(shape=input_shape) # Block 1 net = depthwise_separable_conv(inputs, num_filters=32, kernel_size=(3, 3), use_winograd=True) net = depthwise_separable_conv(net, num_filters=64, kernel_size=(3, 3), strides=(2, 2), use_winograd=True) net = depthwise_separable_conv(net, num_filters=64, kernel_size=(3, 3), use_winograd=True) # Block 2 net = depthwise_separable_conv(net, num_filters=128, kernel_size=(3, 3), strides=(2, 2), use_winograd=True) net = depthwise_separable_conv(net, num_filters=128, kernel_size=(3, 3), use_winograd=True) # Block 3 net = depthwise_separable_conv(net, num_filters=256, kernel_size=(3, 3), strides=(2, 2), use_winograd=True) net = depthwise_separable_conv(net, num_filters=256, kernel_size=(3, 3), use_winograd=True) # Global Average Pooling net = tf.keras.layers.GlobalAveragePooling2D()(net) # Output outputs = tf.keras.layers.Dense(num_classes, activation='softmax')(net) model = tf.keras.models.Model(inputs=inputs, outputs=outputs) return model ``` 这个简单的神经网络由3个深度可分离卷积一个全局平均池化层组成,最后接一个全连接层输出预测结果。在深度可分离卷积块中使用了Winograd算法来加速计算。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值