【问题标题】:Finding the correct input_shape for Conv1d input layer为 Conv1d 输入层找到正确的 input_shape
【发布时间】:2021-09-15 07:43:31
【问题描述】:

我目前正在尝试运行一个以 conv1d 层作为输入的模型。我认为我的问题在于 input_shape 值。

model = models.Sequential()
model.add(layers.Conv1D(input_shape=(100,), kernel_size=5, filters=100, activation='relu'))
model.add(layers.MaxPooling1D())
model.add(layers.Flatten())
model.add(layers.Dense(units=3, activation='relu'))
model.add(layers.Dense(units=1, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
model.fit(x_vec, y_train_encoded, epochs=10 , batch_size=64)

ValueError: 层序号_27 的输入 0 与层不兼容:输入形状的轴 -1 的预期值为 1,但接收到的输入形状为 (None, 1, 100)

x_vec.shape = (52579, 100)

我认为我的 input_shape 应该是单个输入的输入形状,即 (100,)。是不是错了,如果错了,为什么错了?

【问题讨论】:

  • 输入应该是 3d

标签: python keras conv-neural-network


【解决方案1】:

Conv 层的变化

卷积层的input_shape 参数至少应为 2 个数字。根据data_format,它应该是:(SPATIAL_DIM, NUM_CHANNELS) 或 (NUM_CHANNELS, SPATIAL_DIM),其中SPATIAL_DIM 是您的序列长度(或时间步长),NUM_CHANNELS 是输入(或输入维度)。

在您的情况下,有两种可行的解决方案:

model = models.Sequential()
model.add(layers.Conv1D(input_shape=(100, 1), kernel_size=5, filters=100, activation='relu'))
# THE REST IS THE SAME

model = models.Sequential()
model.add(layers.Conv1D(input_shape=(1, 100), kernel_size=5, filters=100, activation='relu', data_format='channels_first'))
model.add(layers.MaxPooling1D(data_format='channels_first'))
# THE REST IS THE SAME

对池化层的更改

请注意,在第二个示例中,您必须为 MaxPool1D 提供相同的 data_format。否则,最大池将发生在通道上,这不是您想要做的(是吗?)。

对输入的更改

鉴于卷积层需要非常特定的输入格式(有关详细信息,请参阅this),您不能只使用您的输入。首先,我假设您的输入只有一个通道,这意味着您的输入形状为(N, SPATIAL_DIM),其中 N 是批量大小,SPATIAL_DIM 是每个样本的长度。在这种情况下,您必须将输入重塑为(N, SPATIAL_DIM, 1),以告诉模型输入中只有一个通道:

model = models.Sequential()
model.add(layers.Reshape((100, 1), input_shape=(100,)))
model.add(layers.Conv1D(kernel_size=5, filters=100, activation='relu'))
# THE REST IS THE SAME

你的固定模型

model = models.Sequential()
model.add(layers.Reshape((100, 1), input_shape=(100,)))
model.add(layers.Conv1D(kernel_size=5, filters=100, activation='relu'))
model.add(layers.MaxPooling1D())
model.add(layers.Flatten())
model.add(layers.Dense(units=3, activation='relu'))
model.add(layers.Dense(units=1, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
model.fit(x_vec, y_train_encoded, epochs=10 , batch_size=64)

如何避免此类问题以及下一步该去哪里

在编写模型/训练模型时,了解计算形状时使用的变量非常重要。这对于卷积层尤其重要。

我建议您通读每一层的 API。例如,您可以在此处获取 API 信息 foc Conv1d:

完成此操作后,您可以在非常专业的论坛中提问:

【讨论】:

  • 好的,有几个问题。首先,您能否解释一下 SPATIAL_DIM 和 NUM_CHANNELS 的含义。其次,我尝试了这两种解决方案,他们都遇到了以下错误:ValueError:层序号_2的输入0与层不兼容::预期的min_ndim = 3,发现ndim = 2。收到的完整形状:(无,100)。而且我不确定该怎么做。如果您有任何其他想法,我很想听听。
  • 您收到错误的原因,因为您的输入必须有渠道。请注意,卷积层期望输入被“引导”,这意味着您必须将输入重塑为(N, NUM_CHANNELS, L)。稍后我会在答案中给出更多解释
猜你喜欢
  • 2021-12-31
  • 2020-12-03
  • 1970-01-01
  • 2020-12-02
  • 2019-09-23
  • 2020-07-24
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多