我对 keras 图层大小有什么误解?
What have I misunderstood about keras layer sizes?
作为了解深度学习和 Keras 的一部分,我正在尝试实现以下管道:
想法是:
- EEG 数据的输入部分(我现在将使用 6000x1)
- 运行 通过 20 个 1D 过滤器 (200x1)
- 使用池 20、步幅 10(产生 20 578x1 数据点)对每个过滤的输出进行最大池化
- "stack" 这变成一个 578x20 矩阵
- 运行 这是通过内核大小为 30x20
的二维卷积实现的
- 再次使用 Maxpool,池 (10,1),步长 (2,1)
- 两个连续的全连接层
- 5-class 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 之间应该有另一个重塑层吗?在 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()
是一种重塑,它获取任何张量的所有值并将它们放入一维张量中。
希望对您有所帮助:-)
作为了解深度学习和 Keras 的一部分,我正在尝试实现以下管道:
想法是:
- EEG 数据的输入部分(我现在将使用 6000x1)
- 运行 通过 20 个 1D 过滤器 (200x1)
- 使用池 20、步幅 10(产生 20 578x1 数据点)对每个过滤的输出进行最大池化
- "stack" 这变成一个 578x20 矩阵
- 运行 这是通过内核大小为 30x20 的二维卷积实现的
- 再次使用 Maxpool,池 (10,1),步长 (2,1)
- 两个连续的全连接层
- 5-class 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 之间应该有另一个重塑层吗?在 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()
是一种重塑,它获取任何张量的所有值并将它们放入一维张量中。
希望对您有所帮助:-)