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