我对 keras 图层大小有什么误解?

What have I misunderstood about keras layer sizes?

作为了解深度学习和 Keras 的一部分,我正在尝试实现以下管道:

想法是:

我的代码是:

model = Sequential()
model.add(Conv1D(input_shape=(6000,1),kernel_size=200,strides=1,
             activation='relu',filters=20,name='C1'))
model.add(MaxPooling1D(pool_size=20, strides=10,padding='valid',name='P1'))
model.add(Reshape(( 579, 20,1),name='S1'))
model.add(Conv2D(filters=400,kernel_size=(30,20),strides=(1,1), 
             activation='relu',name='C2'))
model.add(MaxPooling2D(pool_size=(10,1),strides=(2,1),padding='valid',name='P2'))
#model.add(Reshape((271*400,1,1),name='S2'))
model.add(Dense(500,activation='relu',name='F1'))
model.add(Dense(500,activation='relu',name='F2'))
model.add(Dense(5,activation='relu',name='output'))
model.add(Activation(activation='softmax',name='softmax'))

model.summary()

这个输出是:

Layer (type)                 Output Shape              Param #   
=================================================================
C1 (Conv1D)                  (None, 5801, 20)          4020      
_________________________________________________________________
P1 (MaxPooling1D)            (None, 579, 20)           0         
_________________________________________________________________
S1 (Reshape)                 (None, 579, 20, 1)        0         
_________________________________________________________________
C2 (Conv2D)                  (None, 550, 1, 400)       240400    
_________________________________________________________________
P2 (MaxPooling2D)            (None, 271, 1, 400)       0         
_________________________________________________________________
F1 (Dense)                   (None, 271, 1, 500)       200500    
_________________________________________________________________
F2 (Dense)                   (None, 271, 1, 500)       250500    
_________________________________________________________________
output (Dense)               (None, 271, 1, 5)         2505      
_________________________________________________________________
softmax (Activation)         (None, 271, 1, 5)         0         
=================================================================
Total params: 697,925.0
Trainable params: 697,925.0
Non-trainable params: 0.0
_________________________________________________________________

这就是我感到困惑的地方。我希望 F1 的输出只是 500x1(500 个神经元),但这根本不是我得到的? P2 和 F1 之间应该有另一个重塑层吗?在 P2 之后添加 "model.add(Reshape((271*400,1,1),name='S2'))" 对问题没有任何作用。 我在 keras.json 中有 "image_data_format": "channels_last",所以我假设我的维度是批处理 - 行 - 列 - 通道?

我希望我的问题很清楚。

您需要了解 Dense 层的工作原理。这有点违反直觉,但如果您的输入有超过 1 个维度(批处理维度除外),那么它将像分布在最后一个维度上的密集层一样。

如果您查看 doc of the Dense layer,您会看到输入形状 (batch_dim, dim1, dim2,..., last_dim) 得到输出形状 (batch_dim, dim1, dim2, ..., output_units)

这意味着在您的情况下,当您执行 Reshape((271*400,1,1),name='S2') 时,密集层将应用于最后一个维度并输出类似 (271*400,1,500) 的内容。如果您希望输出为 (500,),那么 S2 的输出应该是包含所有特征的一维张量。然后你应该像@maz 在评论中所说的那样做 Reshape((271*400,),name='S2')Flatten()Flatten() 是一种重塑,它获取任何张量的所有值并将它们放入一维张量中。

希望对您有所帮助:-)