为什么隐藏的深层输出在某些维度上具有零方差?

时间:2019-06-26 07:32:50

标签: python tensorflow keras deep-learning

我设计了一个带有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),然后重新训练系统。但是仍然有很多零方差特征,系统的性能略有下降。 如果您可以引导我阅读有关此内容的更多信息或知道答案,则对您有所帮助。

1 个答案:

答案 0 :(得分:0)

原则上不支持在Keras中进行修剪。因此,问题在于,首先您会获得稀疏矩阵,其执行速度比全矩阵乘法或掩码矢量要慢。而且那些节点仍为非零值,仍然有助于最终结果,并且下一层中的神经元对该神经元使用不同的缩放因子。仅删除它们会影响您的性能,除非它们实际上为零,否则在使用ReLU时会发生这种情况。

您可以尝试的一件事是使用正则化使网络更有可能使用更多节点。例如。使用辍学或权重正则化。