SeparableConv2D 和 Conv2D 层之间有什么区别?
What is the difference between SeparableConv2D and Conv2D layers?
我没有在网上找到这个问题的明确答案(抱歉,如果有的话)。
我想逐步了解这两个函数(SeparableConv2D 和 Conv2D)之间的区别,例如输入数据集 (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 预测,但有人可以解释 SeperableConv2D请计算模型 1 预测及其参数数量 (16) ?
由于 Keras 使用 Tensorflow,您可以查看 Tensorflow 的 API 差异。
conv2D就是传统的卷积。因此,您有一个图像,有或没有填充,以及以给定步幅在图像中滑动的过滤器。
另一方面,SeparableConv2D 是传统卷积的变体,旨在更快地计算它。
它执行深度空间卷积,然后执行逐点卷积,将生成的输出通道混合在一起。例如,MobileNet 使用此操作来更快地计算卷积。
我可以在这里解释这两个操作,但是,这个 post 使用图片和视频进行了很好的解释,我强烈建议您阅读。
我没有在网上找到这个问题的明确答案(抱歉,如果有的话)。 我想逐步了解这两个函数(SeparableConv2D 和 Conv2D)之间的区别,例如输入数据集 (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 使用 Tensorflow,您可以查看 Tensorflow 的 API 差异。
conv2D就是传统的卷积。因此,您有一个图像,有或没有填充,以及以给定步幅在图像中滑动的过滤器。
另一方面,SeparableConv2D 是传统卷积的变体,旨在更快地计算它。 它执行深度空间卷积,然后执行逐点卷积,将生成的输出通道混合在一起。例如,MobileNet 使用此操作来更快地计算卷积。
我可以在这里解释这两个操作,但是,这个 post 使用图片和视频进行了很好的解释,我强烈建议您阅读。