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

时间:2017-03-24 11:53:34

标签: python neural-network keras keras-layer

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

EEG analysis net from https://arxiv.org/abs/1610.01683

这个想法是:

  • 输入EEG数据部分(我现在将使用6000x1)
  • 通过20个1D过滤器(200x1)
  • 运行它
  • 使用池20,步幅10(产生20 578x1数据点)对每个过滤器的输出进行最大池化
  • "堆"这成为一个578x20矩阵
  • 通过内核大小为30x20
  • 的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的输出只是500x1(500个神经元),但这不是我得到的东西? P2和F1之间应该有另一个重塑层吗?添加" model.add(重塑((271 * 400,1,1),名称=' S2'))"在P2没有对此问题做任何事情之后。 我有" image_data_format":" channels_last"在keras.json中,所以我假设我的尺寸是批量 - 行 - col - 通道?

我希望我的问题很明确。

1 个答案:

答案 0 :(得分:1)

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

如果查看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的输出应为包含所有特征的1D张量。然后,您应该按照@maz在评论中说的Reshape((271*400,),name='S2')Flatten()进行操作。 Flatten()是一个重塑,它取任何张量的所有值并将它们置于一维张量中。

我希望这会有所帮助: - )