SeparableConv2D和Conv2D层有什么区别?

16

我在网上没有找到这个问题的明确答案(如果存在,很抱歉)。 我想逐步了解两个函数(SeparableConv2DConv2D)之间的区别,例如使用输入数据集(3,3,3)(作为RGB图像)。

基于Keras-Tensorflow运行此脚本:

import numpy as np
from keras.layers import Conv2D, SeparableConv2D
from keras.models import Model
from keras.layers import Input

red   = np.array([1]*9).reshape((3,3))
green = np.array([100]*9).reshape((3,3))
blue  = np.array([10000]*9).reshape((3,3))

img = np.stack([red, green, blue], axis=-1)
img = np.expand_dims(img, axis=0)

inputs = Input((3,3,3))
conv1 = SeparableConv2D(filters=1, 
              strides=1, 
              padding='valid', 
              activation='relu',
              kernel_size=2, 
              depth_multiplier=1,
              depthwise_initializer='ones',
              pointwise_initializer='ones',
              bias_initializer='zeros')(inputs)

conv2 = Conv2D(filters=1, 
              strides=1, 
              padding='valid', 
              activation='relu',
              kernel_size=2, 
              kernel_initializer='ones', 
              bias_initializer='zeros')(inputs)

model1 = Model(inputs,conv1)
model2 = Model(inputs,conv2)
print("Model 1 prediction: ")
print(model1.predict(img))
print("Model 2 prediction: ")
print(model2.predict(img))
print("Model 1 summary: ")
model1.summary()
print("Model 2 summary: ")
model2.summary()

我有以下输出:

Model 1 prediction:
 [[[[40404.]
   [40404.]]
  [[40404.]
   [40404.]]]]
Model 2 prediction: 
[[[[40404.]
   [40404.]]
  [[40404.]
   [40404.]]]]
Model 1 summary: 
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 3, 3, 3)           0         
_________________________________________________________________
separable_conv2d_1 (Separabl (None, 2, 2, 1)           16        
=================================================================
Total params: 16
Trainable params: 16
Non-trainable params: 0
_________________________________________________________________
Model 2 summary: 
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 3, 3, 3)           0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 2, 2, 1)           13        
=================================================================
Total params: 13
Trainable params: 13
Non-trainable params: 0

我理解了Keras如何计算模型2的Conv2D预测,感谢这篇文章,但是有人可以解释一下模型1的SeperableConv2D预测计算以及它的参数数量(16)吗?

1个回答

29

Keras使用Tensorflow,因此您可以在Tensorflow的API中查看差异。

conv2D是传统的卷积操作。因此,您有一幅图像(带或不带填充),并使用给定步长滑动的过滤器通过该图像。

另一方面,SeparableConv2D是传统卷积的变体,旨在更快地计算它。 它执行深度空间卷积,然后是一个点积卷积,混合在一起产生的输出通道。例如,MobileNet使用此操作更快地计算卷积。

我可以在这里解释两个操作,但是,这个文章用图像和视频提供了非常好的解释,强烈建议您阅读。


1
谢谢分享,这有助于理解SeparableConv2D。我发现我没有初始化可分离卷积的深度和点部分,所以得到了不同的预测...抱歉。 - etiennedm
希望您能给我指点迷津! 我阅读了几篇指南,它们都说SeparableConv2D主要用于训练小型设备(如相机、机器人等),因为它们在硬件方面有限制。 那么,如果他们在所有模型中使用SeparableConv2D而不是传统的Conv2D,传统方法仍然具有优势吗?谢谢。 - I'mMotivated

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接