CNN Keras:将训练多少个权重?

tim*_*tim 3 python neural-network conv-neural-network keras tensorflow

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

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

tod*_*day 5

您可以使用以下summary函数在 Keras 中找出模型的(非)可训练参数的数量:

from keras import models, layers

model = models.Sequential()
model.add(layers.Conv2D(10, (4,4), input_shape=(32, 32, 3)))

model.summary()
Run Code Online (Sandbox Code Playgroud)

这是输出:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 29, 29, 10)        490       
=================================================================
Total params: 490
Trainable params: 490
Non-trainable params: 0
Run Code Online (Sandbox Code Playgroud)

通常,对于k具有大小为 的过滤器的 2D 卷积层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 卷积的方法(可能有效也可能无效):

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 29, 29, 10)        490       
=================================================================
Total params: 490
Trainable params: 490
Non-trainable params: 0
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

Lambda 层的一个好处是它可以添加到任何地方(例如在卷积层之后)。但我认为这里要问的最重要的问题是:“为什么使用具有深度共享权重的 2D-conv 层会有益?” 一个明显的答案是网络大小(即可训练参数的总数)减少了,因此训练时间可能会减少,我怀疑这可以忽略不计。此外,跨通道使用共享权重意味着不同通道中存在的模式或多或少相似。但情况并非总是如此,例如在 RGB 图像中,因此通过跨通道使用共享权重,我想您可能会观察到网络准确性(明显)下降。因此,至少,您应该考虑到这种权衡并对其进行试验。

但是,还有另一种卷积层,您可能会感兴趣,称为“深度可分离卷积”,它已在 Tensorflow 中实现,Keras 也支持它。这个想法是在每个通道上应用一个单独的 2D-conv 过滤器,然后使用k 1*1卷积聚合生成的特征图(k这里是输出通道的数量)。它基本上将空间特征和深度特征的学习分开。在他的论文“Xception: Deep Learning with Depthwise Separable Convolutions”中,Francois Chollet(Keras的创造者)表明使用深度可分离卷积提高了网络的性能和准确性。而在这里 您可以阅读有关深度学习中使用的不同类型卷积层的更多信息。