更深的卷积神经网络能否产生更少的参数?
Can deeper convolutional neural nets result in lesser parameters?
我在 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。
这怎么可能?第二个网络更深,应该包含更多参数。有没有错?
网络的深度并不是影响其参数数量的唯一因素。每层参数的数量有很大的影响。这意味着对于每个卷积层,过滤器的大小和过滤器(学习到的特征)的数量都会产生巨大的差异。看看这个link http://arxiv.org/pdf/1409.1556.pdf
VGG小组的论文
另请查看论文“Deep Residual Learning for image recognition”,它代表了最多 152 层的网络,即比 VGG 网络深 8 倍,同时仍然具有较低的复杂性。
是的,更深层次的神经网络可以有更少的参数。如果它们是 CNNs 也没关系。您可能会感到困惑,因为在图形表示中,人们倾向于关注神经元。然而,学到的是权重,它们位于神经元之间的边缘。
除了 link 到 "Deep Residual Learning for image recognition"(请为 Midos 的答案投票)之外,我想举一个多层感知器 (MLP) 的玩具示例。
玩具示例:瓶颈特征
第一个 MLP 有一个包含 784 个神经元的输入层、两个包含 2000 个神经元的隐藏层和一个包含 10 个神经元的输出层(简称:784:2000:2000:10)。这导致网络具有
神经元。现在考虑具有架构 784:2000:50:2000:10 的网络。这有 个神经元。
这意味着再增加一层,即使不减少任何一层,网络的大小也减少到之前大小的 32%!
我在 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。
这怎么可能?第二个网络更深,应该包含更多参数。有没有错?
网络的深度并不是影响其参数数量的唯一因素。每层参数的数量有很大的影响。这意味着对于每个卷积层,过滤器的大小和过滤器(学习到的特征)的数量都会产生巨大的差异。看看这个link http://arxiv.org/pdf/1409.1556.pdf
VGG小组的论文另请查看论文“Deep Residual Learning for image recognition”,它代表了最多 152 层的网络,即比 VGG 网络深 8 倍,同时仍然具有较低的复杂性。
是的,更深层次的神经网络可以有更少的参数。如果它们是 CNNs 也没关系。您可能会感到困惑,因为在图形表示中,人们倾向于关注神经元。然而,学到的是权重,它们位于神经元之间的边缘。
除了 link 到 "Deep Residual Learning for image recognition"(请为 Midos 的答案投票)之外,我想举一个多层感知器 (MLP) 的玩具示例。
玩具示例:瓶颈特征
第一个 MLP 有一个包含 784 个神经元的输入层、两个包含 2000 个神经元的隐藏层和一个包含 10 个神经元的输出层(简称:784:2000:2000:10)。这导致网络具有
这意味着再增加一层,即使不减少任何一层,网络的大小也减少到之前大小的 32%!