【问题标题】:How to use 'input_shape' in Conv1D() function?如何在 Conv1D() 函数中使用“input_shape”?
【发布时间】:2021-09-18 01:44:02
【问题描述】:

我有一百万行数据,包含六个特征和三个类别。

6.442  6.338  7.027  8.789 10.009 12.566  A
6.338  7.027  5.338 10.009  8.122 11.217  A
7.027  5.338  5.335  8.122  5.537  6.408  B
5.338  5.335  5.659  5.537  5.241  7.043  B
5.659  6.954  5.954  8.470  9.266  9.334  C
6.954  5.954  6.117  9.266  9.243 12.200  C
5.954  6.117  6.180  9.243  8.688 11.842  A
6.117  6.180  5.393  8.688  5.073  7.722  A
... ... ... ... ... ... ... ... ... ... ...

我想将此数据集输入 CNN。

所以,我编写了以下 Keras 代码:

model = Sequential()
model.add(Conv1D(filters=n_hidden_1, kernel_size=3, activation='sigmoid', 
        input_shape=(1, num_features)))
model.add(Conv1D(filters=n_hidden_2, kernel_size=3, activation='sigmoid'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(num_classes, activation='softmax'))

这段代码给了我以下错误:

ValueError: Negative dimension size caused by subtracting 3 from 1 for 
'{{node conv1d/conv1d}} 
= Conv2D[T=DT_FLOAT, data_format="NHWC", dilations=[1, 1, 1, 1]
, explicit_paddings=[], padding="VALID", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true]
(conv1d/conv1d/ExpandDims, conv1d/conv1d/ExpandDims_1)' with input shapes
: [?,1,1,6], [1,3,6,64].

编辑:然后,我将模型修改如下:

model = Sequential()
model.add(Conv1D(filters=n_hidden_1, kernel_size=3, activation='sigmoid', 
    input_shape=(n_hidden_1, num_features, 1)))
model.add(Conv1D(filters=n_hidden_2, kernel_size=3, activation='sigmoid'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(3))
model.add(Flatten())
model.add(Dense(num_classes, activation='softmax'))

现在我收到以下错误消息:

ValueError: Input 0 of layer max_pooling1d is incompatible with the 
layer: expected ndim=3, found ndim=4. Full shape received: 
    (None, 64, 2, 64)

我写错了什么,为什么错了?

【问题讨论】:

  • 您可以尝试将kernel_size 减少到2 或删除Conv1DMaxPooling1D 层之一。
  • 由于序列长度只有 6,Conv1D 层的输出的大小逐渐变小,因为它通过它们。达到特定大小后,我们无法对其执行最大池化
  • 在 Conv1D 层之后添加一个 Flatten 层。
  • @user366312 将x_train 传递给model.fit() 时的形状是什么?
  • @Kaveh,当你将 x_train 传递给 model.fit() 时,它的形状是什么? - 一个向量的向量。每个内部向量有 6 列和 1 行。外部向量有 100 万个条目。

标签: python keras conv-neural-network


【解决方案1】:

Conv1DMaxPool1D 期望输入形状类似于 (n_batches, n_steps, n_features)。所以,输入形状应该像input_shape=(n_steps, n_features)。如果您想将 6 视为步骤,那么它可能类似于 input_shape=(6,1)

  1. 要添加最后一个维度,请尝试以下操作:
train_X = np.expand_dims(train_x, axis=-1)
validate_x = np.expand_dims(validate_x, axis=-1)
  1. 由于每个卷积层,默认填充有效,将n_steps 减去 2,那么您的第二维形状变化如下:
  • 输入-> 6
  • 在第一个Conv1D之后-> 4
  • 第二个之后Conv1D -> 2

您不能将MaxPool1D 应用到 3 个池大小。您可以将池大小更改为 2,或者将 padding="same" 添加到您的卷积层之一:

model = tf.keras.Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='sigmoid', input_shape=(6, 1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='sigmoid')) 
model.add(Dropout(0.5))
model.add(MaxPooling1D(2)) # change to 2 or add `padding="same"` to the conv layers
model.add(Flatten())
model.add(Dense(3, activation='softmax'))

model.summary()

总结:

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_2 (Conv1D)            (None, 4, 64)             256       
_________________________________________________________________
conv1d_3 (Conv1D)            (None, 2, 64)             12352     
_________________________________________________________________
dropout_1 (Dropout)          (None, 2, 64)             0         
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 1, 64)             0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 64)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 3)                195       
=================================================================
Total params: 13,258
Trainable params: 13,258
Non-trainable params: 0
_________________________________________________________________

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2019-12-24
    • 2020-11-06
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    相关资源
    最近更新 更多