作为了解深度学习和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之间应该有另一个重塑层吗?添加" model.add(重塑((271 * 400,1,1),名称=' S2'))"在P2没有对此问题做任何事情之后。 我有" image_data_format":" channels_last"在keras.json中,所以我假设我的尺寸是批量 - 行 - col - 通道?
我希望我的问题很明确。
答案 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()
是一个重塑,它取任何张量的所有值并将它们置于一维张量中。
我希望这会有所帮助: - )