2

我在 Keras 中训练了两个卷积神经网络。第一个是 net 如下

def VGG1(weights_path):
    model = Sequential()
    model.add(Convolution2D(nb_filters, nb_conv, nb_conv,
                        border_mode='valid',
                        input_shape=(1, img_rows, img_cols)))
    model.add(Activation('relu'))
    model.add(Convolution2D(nb_filters, nb_conv, nb_conv))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(128))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(nb_classes))
    model.add(Activation('softmax'))

    if weights_path:
        model.load_weights(weights_path)

    return model

第二网

def VGG2(weights_path):
    model = Sequential()

    model.add(Convolution2D(nb_filters, nb_conv, nb_conv, border_mode='valid', input_shape=(1, img_rows, img_cols)))
    model.add(Activation('relu'))
    model.add(Convolution2D(nb_filters, nb_conv, nb_conv))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
    model.add(Dropout(0.25))

    model.add(Convolution2D(64, nb_conv, nb_conv, border_mode='valid'))
    model.add(Activation('relu'))
    model.add(Convolution2D(64, nb_conv, nb_conv))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(256))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))

    model.add(Dense(nb_classes))
    model.add(Activation('softmax'))

    if weights_path:
        model.load_weights(weights_path)

    return model

当我调用该model.count_params()方法时,第一个网络产生 604035 参数,第二个网络产生 336387 参数。

这怎么可能?第二个网络更深,应该包含更多参数。有什么错误吗?

4

2 回答 2

2

网络的深度并不是影响其参数数量的唯一因素。每层的参数数量有很大的影响。这意味着对于每个卷积层,过滤器的大小和过滤器的数量(学习的特征)会产生巨大的差异。在此链接http://arxiv.org/pdf/1409.1556.pdf查看 VGG 小组的论文

另请参阅论文“用于图像识别的深度残差学习”,该论文表示具有多达 152 层的网络,即比 VGG 网络深 8 倍,同时仍然具有较低的复杂性。

于 2016-01-07T11:29:23.583 回答
2

是的,更深层次的神经网络可以有更少的参数。他们是否是 CNN 并不重要。您可能会感到困惑,因为在图形表示中,人们倾向于关注神经元。然而,学到的是权重,它们位于神经元之间的边缘。

除了“用于图像识别的深度残差学习”的链接(请为此投票赞成 Midos 答案),我想给出一个多层感知器 (MLP) 的玩具示例。

玩具示例:瓶颈功能

第一个 MLP 有一个 784 个神经元的输入层、两个每个 2000 个神经元的隐藏层和一个 10 个神经元的输出层(简称:784:2000:2000:10)。这导致了一个带有在此处输入图像描述 神经元的网络。现在考虑一个架构为 784:2000:50:2000:10 的网络。这有在此处输入图像描述神经元。

这意味着添加另一层,即使不减少任何层,网络的大小也会减少到之前大小的 32%!

于 2016-01-07T18:33:55.120 回答