我对CNN有一点理解问题 . 而且我不太确定有多少过滤器和重量训练 .
示例:我有一个输入图层,其中包含32x32像素和3个通道(即 (32,32,3) 的形状) . 现在我使用带有10个形状 (4,4) 的滤镜的2D卷积层 . 所以我最终得到10个通道,每个通道的形状为 (28,28) ,但我现在是为每个输入通道训练一个单独的过滤器还是共享?我训练3x10x4x4重量还是训练10x4x4重量?
(32,32,3)
(4,4)
(28,28)
您可以使用 summary 函数找出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
通常,对于具有 k 滤波器且尺寸为 w*w 的2D卷积层,在具有 c 通道的输入上应用可训练参数的数量(在默认情况下,考虑每个滤波器的一个偏置参数)等于 k*w*w*c+k 或 k*(w*w*c+1) . 在上面的示例中,我们有: k=10, w=4, c=3 因此我们有 10*(4*4*3+1) = 490 可训练参数 . 正如您所推断的那样,对于每个 Channels ,都有单独的权重,并且它们不会被共享 . 此外,2D卷积层的参数数量不依赖于前一层的宽度或高度 .
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
Update:
具有深度共享权重的卷积层:我不知道这样的层,也找不到Keras或Tensorflow中的内置实现 . 但在考虑之后,您意识到它实际上等同于将所有通道相加在一起,然后对结果应用2D卷积 . 例如,在 32*32*3 图像的情况下,首先将所有三个通道相加在一起,得到 32*32*1 张量,然后可以在该张量上应用2D卷积 . 因此,在Keras中实现具有共享权重的2D卷积的至少一种方式可能是这样的(可能有效也可能不高效):
32*32*3
32*32*1
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 这里是输出通道的数量)聚合得到的特征映射 . 它基本上将空间特征和深度特征的学习分开 . 在他的论文中,Francois Chollet(Keras的创建者)表明,使用深度可分离卷积可以提高网络的性能和准确性 . 并且here您可以阅读有关深度学习中使用的各种卷积层的更多信息 .
1*1
1 回答
您可以使用
summary
函数找出Keras中模型的(非)可训练参数的数量:这是输出:
通常,对于具有
k
滤波器且尺寸为w*w
的2D卷积层,在具有c
通道的输入上应用可训练参数的数量(在默认情况下,考虑每个滤波器的一个偏置参数)等于k*w*w*c+k
或k*(w*w*c+1)
. 在上面的示例中,我们有:k=10, w=4, c=3
因此我们有10*(4*4*3+1) = 490
可训练参数 . 正如您所推断的那样,对于每个 Channels ,都有单独的权重,并且它们不会被共享 . 此外,2D卷积层的参数数量不依赖于前一层的宽度或高度 .Update:
具有深度共享权重的卷积层:我不知道这样的层,也找不到Keras或Tensorflow中的内置实现 . 但在考虑之后,您意识到它实际上等同于将所有通道相加在一起,然后对结果应用2D卷积 . 例如,在
32*32*3
图像的情况下,首先将所有三个通道相加在一起,得到32*32*1
张量,然后可以在该张量上应用2D卷积 . 因此,在Keras中实现具有共享权重的2D卷积的至少一种方式可能是这样的(可能有效也可能不高效):输出:
该Lambda层的一个好处是它可以在任何地方添加(例如在卷积层之后) . 但我认为这里要问的最重要的问题是:“为什么使用具有深度共享权重的2D-conv层将是有益的?”一个明显的答案是网络规模(即可训练参数的总数)减少,因此训练时间可能会减少,我怀疑这可以忽略不计 . 此外,跨通道使用共享权重意味着存在于不同通道中的模式或多或少相似 . 但情况并非总是如此,例如在RGB图像中,因此通过跨通道使用共享权重,我猜您可能会观察到(明显的)网络精度降低 . 所以,至少,你应该记住这种权衡和实验 .
然而,还有另一种你可能感兴趣的卷积层,称为"Depth-wise Separable Convolution",它已在Tensorflow中实现,而Keras supports it也是如此 . 这个想法是在每个通道上应用单独的2D-conv滤波器,然后使用
k
1*1
卷积(k
这里是输出通道的数量)聚合得到的特征映射 . 它基本上将空间特征和深度特征的学习分开 . 在他的论文中,Francois Chollet(Keras的创建者)表明,使用深度可分离卷积可以提高网络的性能和准确性 . 并且here您可以阅读有关深度学习中使用的各种卷积层的更多信息 .