首页 > 解决方案 > 将输入形状作为特征和标签数量的总和是否错误

问题描述

我尝试进行回归,我有 3 个特征和 1 个标签(它们都有 190 个条目)。我一开始用的input_shape=[len(dataset.keys())]是4,效果很好。

现在我意识到我应该编写 input_shape= [len(training_dataset.keys())],即 3 并尝试多种不同大小的层和激活函数的组合,以找到最佳模型。

def build_model():
  model = keras.Sequential([
    layers.Dense(64, activation='elu', input_shape=[len(dataset.keys())]),
    layers.Dense(64, activation='relu'),
    layers.Dense(1)
  ])

  optimizer = tf.keras.optimizers.RMSprop(0.001)

  model.compile(loss='mse',
                optimizer=optimizer,
                metrics=['mae', 'mse'])
  return model

结果很糟糕(平均错误率过去是 156,现在超过 4500)。那么我可以让它像一开始一样还是错的?

标签: pythontensorflowkerasregression

解决方案


根据数据集的类型,有更好的方法来提供列的数量。最简单和最直接的(至少对我而言)是:

Dense(12, activation='relu', input_dim=training_dataset.shape[1])

如果您的数据集是 Numpy 数组或 Pandas 数据框,这将对您有所帮助。

但是,由于您正在使用一个函数来构建模型,我鼓励您让它像

def build_model(input_dim):
  model = keras.Sequential([
    layers.Dense(64, activation='relu', input_dim=input_dim),
    layers.Dense(64, activation='relu'),
    layers.Dense(1)
  ])

  optimizer = tf.keras.optimizers.RMSprop(0.001)

  model.compile(loss='mse',
                optimizer=optimizer,
                metrics=['mae', 'mse'])
  return model

因此,无论数据集的范围如何,您都可以对其进行修改和使用(假设您要构建具有相同功能的另一个模型,因为它只链接到一个数据集,所以它不起作用)。

至于性能下降,我敢打赌,您将标签作为训练数据集的一部分(我以前也遇到过),这创建了一个“完美”的模型。可能错误在于最后一层的激活函数或类似的东西,但我不会说它与那个形状有关。

编辑:我认为这是一个分类任务。


推荐阅读