我对CNN有一些理解上的问题。我不确定有多少个过滤器和权重被训练。
例如:我有一个输入层,其大小为32x32像素和3个通道(即形状为(32,32,3)
)。现在我使用一个2D卷积层,其中包含10个形状为(4,4)
的过滤器。因此,我最终得到了10个通道,每个通道的形状为(28,28)
,但是我现在是为每个输入通道训练单独的过滤器还是共享它们?我是训练3x10x4x4个权重还是训练10x4x4个权重?
我对CNN有一些理解上的问题。我不确定有多少个过滤器和权重被训练。
例如:我有一个输入层,其大小为32x32像素和3个通道(即形状为(32,32,3)
)。现在我使用一个2D卷积层,其中包含10个形状为(4,4)
的过滤器。因此,我最终得到了10个通道,每个通道的形状为(28,28)
,但是我现在是为每个输入通道训练单独的过滤器还是共享它们?我是训练3x10x4x4个权重还是训练10x4x4个权重?
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
个过滤器的2D卷积层(在默认情况下,考虑每个过滤器有一个偏置参数),可训练参数数量等于k * w * w * c + k
或k*(w*w*c+1)
。如您所见,对于每个通道都有单独的权重,它们不共享。此外,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