我对CNN有一点理解问题。而且我不太确定有多少过滤器和重量训练过。
示例:我有一个32x32像素和3个通道的输入图层(即(32,32,3)
的形状)。现在我使用带有10个形状为(4,4)
的滤镜的2D卷积层。所以我最终得到10个频道,每个频道的形状为(28,28)
,但我现在是为每个输入频道训练一个单独的过滤器还是共享?我训练3x10x4x4重量还是训练10x4x4重量?
答案 0 :(得分:2)
您可以使用summary
函数找出Keras中模型的(非)可训练参数的数量:
from keras import models, layers
model = models.Sequential()
model.add(layers.Conv2D(10, (4,4), input_shape=(32, 32, 3)))
model.summary()
这是输出:
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 29, 29, 10) 490
=================================================================
Total params: 490
Trainable params: 490
Non-trainable params: 0
一般情况下,对于k
过滤器,其大小为w*w
的二维卷积层应用于c
通道的输入,可训练参数的数量(考虑每个参数的一个偏差参数)过滤器,在默认情况下)等于k*w*w*c+k
或k*(w*w*c+1)
。在上面的示例中,我们有k=10, w=4, c=3
因此我们有10*(4*4*3+1) = 490
可训练参数。正如您所推断的那样,对于每个频道,都有单独的权重,并且它们不会被共享。此外,2D卷积层的参数数量不依赖于前一层的宽度或高度。
<强>更新强>
具有深度共享权重的卷积层:我不知道这样的层,也无法在Keras或Tensorflow中找到内置的实现。但在考虑之后,您意识到它实际上等同于将所有通道相加在一起,然后对结果应用2D卷积。例如,在32*32*3
图像的情况下,首先将所有三个通道相加在一起,得到32*32*1
张量,然后可以在该张量上应用2D卷积。因此,在Keras中实现具有共享权重的2D卷积的至少一种方式可能是这样的(可能有效也可能不高效):
from keras import models, layers
from keras import backend as K
model = models.Sequential()
model.add(layers.Lambda(lambda x: K.expand_dims(K.sum(x, axis=-1)), input_shape=(32, 32, 3)))
model.add(layers.Conv2D(10, (4,4)))
model.summary()
输出:
Layer (type) Output Shape Param #
=================================================================
lambda_1 (Lambda) (None, 32, 32, 1) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 29, 29, 10) 170
=================================================================
Total params: 170
Trainable params: 170
Non-trainable params: 0
Lambda层的一个好处是它可以在任何地方添加(例如在卷积层之后)。但我认为这里要问的最重要的问题是:“为什么使用具有深度共享权重的2D-conv层会有益?”一个明显的答案是网络规模(即可训练参数的总数)减少,因此训练时间可能会减少,我怀疑这可以忽略不计。此外,跨通道使用共享权重意味着存在于不同通道中的模式或多或少相似。但情况并非总是这样,例如在RGB图像中,因此通过跨通道使用共享权重,我猜您可能会观察到(明显的)网络精度降低。所以,至少,你应该记住这种权衡并进行实验。
然而,还有另一种你可能感兴趣的卷积层,称为“Depth-wise Separable Convolution”,它已在Tensorflow中实现,而Keras supports it也是如此。我们的想法是在每个通道上应用单独的2D-conv滤镜,然后使用k
1*1
卷积(k
这里是输出通道的数量)聚合得到的要素图。它基本上将空间特征和深度特征的学习分开。在他的论文"Xception: Deep Learning with Depthwise Separable Convolutions"中,Francois Chollet(Keras的创建者)表明,使用深度可分离卷积可以提高网络的性能和准确性。 here你可以阅读更多关于深度学习中使用的不同类型的卷积层。