Keras Conv1D的输入如何指定?我似乎缺少一个维度。

6

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

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

我在训练集中有10000个这样的数组。我需要指定这些内容使conv1D起作用吗?

我正在遇到可怕的问题。

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

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

2个回答

11
不要被名称所困惑。层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)

                                          enter image description here

如果您想使用字符一热编码嵌入,它应该是这样的:

                                          enter image description here

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


非常感谢。我在理解文档方面遇到了困难。我是一个初学者,正在进行实验。我的特定项目是读取一个64个字符的字符串,并确定它是否为电子邮件地址、URL、整数、浮点数、单词或噪声。Conv1D对此很有用,对吗?在我的实验中,我希望发现重要的标记,如“@”、“://”、“.”等。 - Tony Ennis
有一件事我无法理解,那就是为什么我需要指定我的训练样本数量。我已经使用了一堆密集层来解决上述问题,而且它完全不关心样本数量。内核是沿着单个数据向量(单个电子邮件地址)移动,还是沿着每个样本的第一个字符移动? - Tony Ennis
对于你的第一个问题:是的,如果你将每个电子邮件地址拆分成字符(时间序列维度),并使用例如一种热编码嵌入(特征维度),那么这是完全可能的。请参考此教程 - AloneTogether
2
关于你的第二个问题:你在哪里指定了训练样本的数量? - AloneTogether
好的,我出现了故障。我之前尝试的事情似乎需要那个信息;但是现在不需要了。显然我误解了“重复向量”这个东西,认为它适用于我之前指定的数据集大小。现在才发现是64,哈哈。我得仔细研究一下。 - Tony Ennis
谢谢,我的“语法”错误已经被纠正了,现在我可以开始理解这是在做什么。 - Tony Ennis

0

Conv1D层执行时间卷积,也就是沿着第一个维度(当然不包括批次维度)进行卷积,因此您应该放置类似于以下内容的代码:

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"))

你需要将数据分成时间步的切片,以便将其馈送到网络中。

然而,如果你的数组没有时间结构,则conv1D不是你要找的层。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接