代码之家  ›  专栏  ›  技术社区  ›  user297850

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

  •  0
  • user297850  · 技术社区  · 7 年前

    我正在做简单的 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 回复  |  直到 7 年前
        1
  •  0
  •   Peter Szoldan    7 年前

    不同之处在于,在第一种情况下,有一个通道方向的致密层。该层将使用100 x 300=30000个权重和300个偏差,将100个输入映射到300个输出,总共30300个参数。这个 相同的操作 将对其从max\U POOLG1D\U 1输入的所有32个通道重复。

    在第二种情况下,首先展平输入,因此现在有3200个输入并将其映射到300个输出,需要300 x 3200+300=960300个参数。

    哪一个是正确的取决于你。在第一种情况下,网络更小,学习速度更快,不太容易过度拟合,但可能没有必要的表现力在数据集上提供可用的性能。但强制致密层处理 所有频道 同样的方式?只有实验才能证明这一点。你必须尝试两种方法,看看哪一种会产生更好的结果。