我的输入是一个包含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)
的输入。请查看文档以获取更多信息:
time_steps = 5model = 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)
的数据。
如果你想使用字符的一热编码嵌入,它看起来会像这样:
这是一个单一样本的简单示例,形状为 (10, 10)
–> 时间序列维度上有10个字符和10个特征。这应该能帮助你更好地理解我提到的教程。