我设计了一个带有keras的简单ConvNet,它将把一些图像处理成两类。图像不是真实的照片,而是将信号转换为图像。 该模型训练有素,可产生%99 training-acc和%90 test-acc。
模型摘要如下:
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_5 (Conv2D) (None, 64, 64, 32) 832
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 32, 32, 32) 0
_________________________________________________________________
conv2d_6 (Conv2D) (None, 32, 32, 32) 25632
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 16, 16, 32) 0
_________________________________________________________________
conv2d_7 (Conv2D) (None, 16, 16, 64) 51264
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 8, 8, 64) 0
_________________________________________________________________
conv2d_8 (Conv2D) (None, 5, 5, 64) 65600
_________________________________________________________________
flatten_2 (Flatten) (None, 1600) 0
_________________________________________________________________
dense_12 (Dense) (None, 256) 409856
_________________________________________________________________
dense_13 (Dense) (None, 32) 8224
_________________________________________________________________
dense_14 (Dense) (None, 2) 66
=================================================================
Total params: 561,474
Trainable params: 561,474
Non-trainable params: 0
_________________________________________________________________
问题是,当我打印出隐藏的density_12和density_13层的数据输出时,有很多尺寸的数据的零方差。我认为,这意味着这些输出不会影响决策,换句话说,网络会忽略这些无用的功能。 获取这些隐藏层输出的示例代码如下:
dense_2_output = backend.function([model.input],[model.layers[-2].output])
dense_1_output = backend.function([model.input],[model.layers[-3].output])
train_weights_2 = dense_2_output([grid_train_image])[0]
train_weights_1 = dense_1_output([grid_train_image])[0]
x_2 = np.var(train_weights_2,0)
x_1 = np.var(train_weights_1,0)
将此模型视为一种经典的SVM,方差为零的功能是无用的,必须省略。有谁知道如何忽略这些无用的功能以具有完整的功能空间?
注意:我还尝试将网络密集层的尺寸从(256,32)减小到(180,20),然后重新训练系统。但是仍然有很多零方差特征,系统的性能略有下降。 如果您可以引导我阅读有关此内容的更多信息或知道答案,则对您有所帮助。
答案 0 :(得分:0)
原则上不支持在Keras中进行修剪。因此,问题在于,首先您会获得稀疏矩阵,其执行速度比全矩阵乘法或掩码矢量要慢。而且那些节点仍为非零值,仍然有助于最终结果,并且下一层中的神经元对该神经元使用不同的缩放因子。仅删除它们会影响您的性能,除非它们实际上为零,否则在使用ReLU时会发生这种情况。
您可以尝试的一件事是使用正则化使网络更有可能使用更多节点。例如。使用辍学或权重正则化。