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

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

《python – 我对keras图层大小有什么误解?》

这个想法是:

>输入EEG数据部分(6000×1是我现在要用的)
>通过20个1D过滤器(200×1)运行
>使用池20,步幅10(产生20 578×1数据点)对每个过滤器的输出进行最大池化
>将其“堆叠”成578×20矩阵
>通过内核大小为30×20的2D卷积运行
> Maxpool再次,有游泳池(10,1),步幅(2,1)
>两个连续的完全连接层
> 5级softmax功能.

我的代码是:

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的输出只是500×1(500个神经元),但这不是我得到的东西? P2和F1之间应该有另一个重塑层吗?在P2没有对问题做任何事情之后添加“model.add(Reshape((271 * 400,1,1),name =’S2′))”.
我在keras.json中有“image_data_format”:“channels_last”,所以我假设我的尺寸是批量 – 行 – col – 通道?

我希望我的问题很明确.

最佳答案 您需要了解Dense图层的工作原理.这有点反直觉,但如果您的输入具有多个维度(批量维度除外),那么它将像分布在最后维度上的密集层一样运行.

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

这意味着在你的情况下,当你进行重塑((271 * 400,1,1),名称=’S2′)时,密集层将应用于最后一个维度并输出这样的东西(271 * 400,1,500) ).如果希望输出为(500,)则S2的输出应为包含所有特征的1D张量.然后你应该重新塑造((271 * 400,),name =’S2′)或Flatten(),正如@maz在评论中说的那样. Flatten()是一个重塑形状,它获取任何张量的所有值并将它们置于1D张量中.

我希望这有帮助 :-)

点赞