CNN Keras:将训练多少重量?

时间:2018-06-05 12:39:54

标签: python tensorflow neural-network keras conv-neural-network

我对CNN有一点理解问题。而且我不太确定有多少过滤器和重量训练过。

示例:我有一个32x32像素和3个通道的输入图层(即(32,32,3)的形状)。现在我使用带有10个形状为(4,4)的滤镜的2D卷积层。所以我最终得到10个频道,每个频道的形状为(28,28),但我现在是为每个输入频道训练一个单独的过滤器还是共享?我训练3x10x4x4重量还是训练10x4x4重量?

1 个答案:

答案 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+kk*(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你可以阅读更多关于深度学习中使用的不同类型的卷积层。