首页 文章

CNN Keras:将训练多少重量?

提问于
浏览
2

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

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

1 回答

  • 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 的2D卷积层,在具有 c 通道的输入上应用可训练参数的数量(在默认情况下,考虑每个滤波器的一个偏置参数)等于 k*w*w*c+kk*(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卷积的至少一种方式可能是这样的(可能有效也可能不高效):

    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您可以阅读有关深度学习中使用的各种卷积层的更多信息 .

相关问题