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:
完成此操作后,您可以在非常专业的论坛中提问: