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

3

我对CNN有一些理解上的问题。我不确定有多少个过滤器和权重被训练。

例如:我有一个输入层,其大小为32x32像素和3个通道(即形状为(32,32,3))。现在我使用一个2D卷积层,其中包含10个形状为(4,4)的过滤器。因此,我最终得到了10个通道,每个通道的形状为(28,28),但是我现在是为每个输入通道训练单独的过滤器还是共享它们?我是训练3x10x4x4个权重还是训练10x4x4个权重?

1个回答

5
您可以使用Keras中的summary函数查找模型的可训练和不可训练参数数量:
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

一般来说,对于输入有 c 个通道、使用尺寸为 w*w 的 k 个过滤器的2D卷积层(在默认情况下,考虑每个过滤器有一个偏置参数),可训练参数数量等于k * w * w * c + kk*(w*w*c+1)。如您所见,对于每个通道都有单独的权重,它们不共享。此外,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卷积层会有益?”一个显而易见的答案是网络大小(即可训练参数的总数)减少,因此可能会减少训练时间,但我怀疑这将是微不足道的。此外,跨通道使用共享权重意味着不同通道中存在的模式或多或少相似。但并非总是如此,例如在RGB图像中,因此通过跨通道使用共享权重,您可能会观察到网络精度的(明显)降低。因此,至少应该考虑这种权衡并进行实验。
然而,还有另一种卷积层,您可能会感兴趣,称为“深度可分离卷积”,已经在Tensorflow中实现,并且Keras也支持它。其思想是在每个通道上应用单独的2D卷积滤波器,然后使用k个1*1卷积(k是输出通道的数量)聚合所得到的特征图。它基本上将空间特征和深度特征的学习分开。在他的论文中,“Xception: Deep Learning with Depthwise Separable Convolutions”,Francois Chollet(Keras的创建者)表明使用深度可分离卷积可以提高网络的性能和精度。您可以在这里阅读更多关于深度学习中使用的不同类型的卷积层的信息。

非常感谢您提供如此好的和详细的答案!是否有一种方法可以在所有输入层之间共享过滤器? - tim
@tim 抱歉耽搁了,这是我的更新答案。 - today

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