为什么在神经网络回归中,1x1卷积层可以用于特征还原?

问题描述 投票:0回答:1

我很希望能对这个问题有一些见解--我试图在文献中找到解释,但我陷入了困境。所以我正在构建一个神经网络(使用Keras)来解决一个回归问题。我有大约500,000个样本,每个样本有20,000个特征,并试图预测一个数字输出。想想根据房子、院子等一堆数值测量值来预测房价。这些特征是按字母顺序排列的,所以它们的相邻特征相当没有意义。

当我第一次尝试创建一个神经网络时,如果我提供所有的20000个特征,它就会遭受严重的过拟合--手动将其减少到1000个特征,就会大幅提高性能。

我读到了关于1x1卷积神经网络被用于特征减少,但这都是用于图像和2D输入的。

所以我建立了一个3层的基本神经网络。

model = Sequential()
model.add(Conv1D(128, kernel_size=1, activation="relu", input_shape=(n_features,1)))
model.add(Flatten())
model.add(Dense(100, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(1, activation='linear'))

我还重新塑造了我的训练集,作为输入来自于 n_samples, n_features 到。reshaped= X_train.reshape(n_samples, n_features, 1) 以符合Conv1D的预期输入。

与普通的密集神经网络相反,这就像我手动选择性能最好的特征一样。我的问题是--为什么会这样?用密集层代替卷积层完全杀死了性能。这是否与特征减少有关,还是完全有其他原因?

我以为2D图像使用1x1卷积来减少图像的通道尺寸--但我只有1个通道使用1x1卷积,那么减少的是什么呢?将我的1D卷积层滤镜设置为128,是否意味着我选择了128个特征,这些特征随后会被传送到下一层?选择的特征是基于损耗回传吗?

我在可视化我的特征信息方面遇到了很多麻烦。

最后,如果我再往下添加一个卷积层呢?有没有一种方法可以概念化如果我再添加一个1x1层会发生什么?是进一步对特征进行子采样吗?

谢谢您!我希望对这个问题有一些见解。

tensorflow machine-learning neural-network conv-neural-network feature-selection
1个回答
1
投票

让我们用128个单元的Dense层来增强你的模型,观察两个模型的总结。

Conv模型

from tensorflow.keras.layers import *
from tensorflow.keras.models import Model, Sequential
n_features = 1000 # your sequence length
model = Sequential()
model.add(Conv1D(128, kernel_size=1, activation="relu", input_shape=(n_features,1)))
model.add(Flatten())
model.add(Dense(100, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(1, activation='linear'))

model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_1 (Conv1D)            (None, 1000, 128)         256       
_________________________________________________________________
flatten_1 (Flatten)          (None, 128000)            0         
_________________________________________________________________
dense_8 (Dense)              (None, 100)               12800100  
_________________________________________________________________
dense_9 (Dense)              (None, 1)                 101       
=================================================================
Total params: 12,800,457
Trainable params: 12,800,457
Non-trainable params: 0

FC型号

from tensorflow.keras.layers import *
from tensorflow.keras.models import Model, Sequential
n_features = 1000 # your sequence length
model = Sequential()
model.add(Dense(128, activation="relu", input_shape=(n_features,1)))
model.add(Flatten())
model.add(Dense(100, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(1, activation='linear'))

model.summary()
Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_10 (Dense)             (None, 1000, 128)         256       
_________________________________________________________________
flatten_2 (Flatten)          (None, 128000)            0         
_________________________________________________________________
dense_11 (Dense)             (None, 100)               12800100  
_________________________________________________________________
dense_12 (Dense)             (None, 1)                 101       
=================================================================
Total params: 12,800,457
Trainable params: 12,800,457
Non-trainable params: 0
_____________________________

正如你所看到的,这两个模型的每一层的参数数量都是相同的。但本质上它们是完全不同的。

enter image description here

比方说,我们有长度只有4的输入。带有3个滤波器的1个卷积将在这4个输入上使用3个独立的内核,每个内核每次只对一个输入元素进行操作,因为我们选择了kernel_size = 1。所以,每个内核只是一个单一的标量值,每次将与输入数组中的一个元素相乘(将添加偏置)。这里的问题是,1卷积除了当前的输入之外,没有其他地方可以看,也就是说...。它没有任何空间自由度,每次只看当前输入点。 (这在后面的解释中会很有用)

现在,有了densefc层,每个神经元都连接到每个输入,这意味着fc层有充分的空间自由度,它到处看。相当于Conv层将是kernel_size=1000(实际输入长度)的东西。

那么,为什么Conv1D 1卷积也许表现更好呢?

  • 好吧,如果不实际研究数据属性,很难说。但有一种猜测是你使用的特征没有任何空间依赖性。

你随机选择了特征,而且很可能将它们混合在一起(一次看很多输入特征并没有帮助,而是学习了一些额外的噪声)。这可能是为什么你使用Conv层获得更好的性能,因为Conv层一次只看一个特征,而不是FC层,FC层看所有的特征并混合它们。

© www.soinside.com 2019 - 2024. All rights reserved.