Keras Conv1D 输入是如何指定的?我似乎缺乏维度

How is the Keras Conv1D input specified? I seem to be lacking a dimension

我的输入是一个包含 64 个整数的数组。

model = Sequential()
model.add( Input(shape=(68,), name="input"))
model.add(Conv1D(64, 2, activation="relu", padding="same", name="convLayer"))

我的训练集中有 10,000 个这样的数组。我应该指定这个以便 conv1D 工作?

我开始害怕了

ValueError: Input 0 of layer convLayer is incompatible with the layer: : expected min_ndim=3, found ndim=2. Full shape received: [None, 68]

错误,我真的不明白我需要做什么。

不要让这个名字混淆了你。图层 tf.keras.layers.Conv1D 需要以下形状:(time_steps, features)。如果您的数据集由 10,000 个样本组成,每个样本具有 64 个值,那么您的数据具有 (10000, 64) 的形状,这不能直接应用于 tf.keras.layers.Conv1D 层。您缺少 time_steps 维度。你可以做的是使用 tf.keras.layers.RepeatVector,它重复你的数组输入 n 次,在示例 5 中。这样,您的 Conv1D 层将获得形状 (5, 64) 的输入。查看文档了解更多 information:


time_steps = 5
model = tf.keras.Sequential()
model.add(tf.keras.layers.Input(shape=(64,), name="input"))
model.add(tf.keras.layers.RepeatVector(time_steps))
model.add(tf.keras.layers.Conv1D(64, 2, activation="relu", padding="same", name="convLayer"))

作为旁注,您应该问问自己,使用 tf.keras.layers.Conv1D 层是否适合您的用例。该层通常用于 NLP 和其他时间序列任务。例如,在句子分类中,句子中的每个词通常被映射到高维词向量表示,如图所示。这导致数据的形状为 (time_steps, features).

如果你想使用字符 1 热编码嵌入,它看起来像这样:

这是一个单一样本的简单示例,其形状为 (10, 10) --> 时间序列维度上的 10 个字符和 10 个特征。它应该可以帮助您更好地理解我提到的教程。

Conv1D层做时间卷积,也就是沿着第一个维度(当然不是batch维度),所以你应该这样写:

time_steps = 5
model = tf.keras.Sequential()
model.add(tf.keras.layers.Input(shape=(time_steps, 64), name="input"))
model.add(tf.keras.layers.Conv1D(64, 2, activation="relu", padding="same", name="convLayer"))

您需要将您的数据分割成 time_steps 个时间片来为网络提供数据。

但是,如果您的数组没有时间结构,则 conv1D 不是您要查找的层。