【问题标题】:Adding convolution layer in keras giving errors在 keras 中添加卷积层会产生错误
【发布时间】:2017-07-18 08:26:54
【问题描述】:

我有一个数据集,它有两个类和 400 个特征。每个特征都是一个浮点数。我正在尝试在 keras 中构建一个基本的 CNN,但我面临以下错误。我检查了其他解决方案,但这些解决方案要求将训练数据重塑为(batch_size, steps, input_dim)。我认为这不是一个有效的解决方案。

我的代码和错误信息贴在下面。

    model = Sequential()
    model.add(Dense(200, input_dim=400, init='glorot_uniform', activation='relu'))
    model.add(Conv1D(100,
                     4,
                     padding='valid',
                     activation='relu',
                     strides=1))
    model.add(GlobalMaxPooling1D())
    model.add(Dense(50))
    model.add(Activation('relu'))
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])
    return model

错误信息:

Traceback (most recent call last):
  File "train_CNN.py", line 61, in <module>
    model = create_baseline()
  File "train_CNN.py", line 44, in create_baseline
    strides=1))
  File "/users/prateek.n/.local/lib/python2.7/site-packages/keras/models.py", li                                                                                                                ne 469, in add
    output_tensor = layer(self.outputs[0])
  File "/users/prateek.n/.local/lib/python2.7/site-packages/keras/engine/topolog                                                                                                                y.py", line 552, in __call__
    self.assert_input_compatibility(inputs)
  File "/users/prateek.n/.local/lib/python2.7/site-packages/keras/engine/topolog                                                                                                                y.py", line 451, in assert_input_compatibility
    str(K.ndim(x)))

ValueError: Input 0 is incompatible with layer conv1d_1: expected ndim=3, found                                                                                                                 ndim=2

【问题讨论】:

  • 您是否尝试对这 400 个特征进行卷积?这 400 个功能中的每一个都是一个数字?在这种情况下,您确实应该将您的数据重塑为 (batch_size, 400, 1) (即 400 个“步骤”和每个步骤一个特征)。

标签: python machine-learning neural-network keras conv-neural-network


【解决方案1】:

所以Conv1D 需要形状(batch_size, timesteps, features) 的3 维输入。第一个Dense 层的输出具有形状(batch_size, 200)。如果您想将这 200 个特征解释为一个特征的 200 个时间步长,您可以简单地:

model = Sequential()
model.add(Dense(200, input_dim=400, init='glorot_uniform', activation='relu'))
model.add(Reshape((200, 1))
model.add(Conv1D(100,
                 4,
                 padding='valid',
                 activation='relu',
                 strides=1))

如果您想将输入解释为时间序列,您还可以:

model = Sequential()
model.add(Dense(200, input_shape=(400, 1), init='glorot_uniform', activation='relu'))
model.add(Conv1D(100,
                 4,
                 padding='valid',
                 activation='relu',
                 strides=1))

并重塑您的输入数据以具有有效的形状。在这种情况下,您的输入将被解释为一个特征的 400 个时间步长,第一个 Dense 层会将您的数据转换为形状 (batch_size, 400, 200),因为 Keras 中的 Dense > 2.0 独立应用于时间序列的每个元素。

【讨论】:

  • 我已经接受了答案。但是,你能解释一下这两种解释是什么意思吗?谢谢!
  • 这取决于您对输入数据的解释。如果您解释的是一个长度序列400 - 第二种方法似乎更合理。如果您想将Conv1D 应用于Dense 层的输出,那么第一个更合适。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2021-11-09
相关资源
最近更新 更多