压平层的影响及其正确使用

时间:2018-05-06 21:02:49

标签: tensorflow deep-learning keras

我正在研究简单的1D卷积模型,其构建如下

model1= Sequential()
model1.add(Conv1D(60,32, strides=1, activation='relu',padding='causal',input_shape=(64,1)))
model1.add(Conv1D(80,10, strides=1, activation='relu',padding='causal'))
model1.add(Conv1D(100,5, strides=1, activation='relu',padding='causal'))
model1.add(MaxPooling1D(2))
model1.add(Dense(300,activation='relu'))
model1.add(Flatten())
model1.add(Dense(1,activation='relu'))
print(model1.summary())

其模型摘要如下

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_1 (Conv1D)            (None, 64, 60)            1980      
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 64, 80)            48080     
_________________________________________________________________
conv1d_3 (Conv1D)            (None, 64, 100)           40100     
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 32, 100)           0         
_________________________________________________________________
dense_1 (Dense)              (None, 32, 300)           30300     
_________________________________________________________________
flatten_1 (Flatten)          (None, 9600)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 9601      
=================================================================
Total params: 130,061
Trainable params: 130,061
Non-trainable params: 0
_________________________________________________________________

如果我更改在第一个密集层之前移动展平层,如下所示,我得到了以下模型架构。似乎这个模型参数的数量比前一个大得多。为什么展平图层的位置会产生如此大的影响?放置展平图层的正确方法是什么。

model1= Sequential()
model1.add(Conv1D(60,32, strides=1, activation='relu',padding='causal',input_shape=(64,1)))
model1.add(Conv1D(80,10, strides=1, activation='relu',padding='causal'))
model1.add(Conv1D(100,5, strides=1, activation='relu',padding='causal'))
model1.add(MaxPooling1D(2))
model1.add(Flatten())
model1.add(Dense(300,activation='relu'))
model1.add(Dense(1,activation='relu'))

enter image description here

1 个答案:

答案 0 :(得分:0)

不同之处在于,在第一种情况下,您有一个通道密集层。该层将使用100 x 300 = 30,000个权重和300个偏差将100个输入映射到300个输出,总共30,300个参数。对于max_pooling1d_1输入的所有32个通道,将重复相同的操作

在第二种情况下,您首先压平输入,所以现在您有3,200个输入并将其映射到300个输出,需要300 x 3,200 + 300 = 960,300个参数。

哪一个是正确的取决于你。在第一种情况下,网络要小得多,学得更快,更不容易过度拟合,但可能没有必要的表达能力来为数据集提供可用的性能。但强制密集层以同样的方式处理所有通道是否有意义?只有实验可以说明。你必须尝试两种方式,看看哪一种产生更好的结果。