【问题标题】:Predicting values that are not the same shape as the training data that the model fit to预测与模型拟合的训练数据形状不同的值
【发布时间】:2020-07-01 20:00:04
【问题描述】:

我正在尝试训练一个深度神经网络,使其能够根据字符串的值对其进行分类。所以,这意味着我的数据都是文本。但是,它不是句子意义上的文本,这是我在互联网上看到的大多数文本分类线程都在谈论的内容。为了使算法正常工作,我对输入进行了一次热编码(尽管这些不是分类值,所以我不确定是否有更正确的编码方法)并训练了模型。但是,问题在于,当我尝试运行算法在测试或训练数据集中没有看到的新文本字符串时,算法期望输入是 one-hot 编码训练数据集的形状。我们应该如何训练一个模型,然后更改输入,以便它接受一个不一定与模型适合的形状相同的实际字符串?

以下是训练数据的示例:

SB-01_0-1_20200701    1
11-22-4334            0
MW-01_20200621        1
Benzene               0

为了说明问题,这里是模型本身的代码:

DNNmodel = keras.Sequential([
keras.layers.Dense(1),  #input layer size
keras.layers.Dense(64, activation='relu'),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(1)   #output layer size
])

DNNmodel.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

DNNmodel.fit(x_train, y_train, epochs=3, batch_size=32)

当我尝试运行时:

 DNNmodel.predict(np.array(["RI-SB-01_0-5_20200102"]))

为了尝试对单个字符串值进行分类,我得到值错误“ValueError:图层顺序_21 的输入 0 与图层不兼容:输入形状的预期轴 -1 具有值 10509,但接收到形状为 [无, 1]"

关于如何做到这一点的任何提示?

【问题讨论】:

  • 对否决票有点困惑......对不起,我对数据科学还是很陌生。

标签: python tensorflow machine-learning


【解决方案1】:

你不能那样做。所有输入和所有输出的形状 您的网络必须始终保持不变。

要绕过这个限制,您应该将字符串编码为 固定大小的向量。像这样,如果你想要 20 维向量:

X = ['SB-01_0-1_20200701', '11-22-4334', 'MW-01_20200621', 'Benzene']
X = [[ord(c) for c in x] for x in X]
X = [x + [0] * (20 - len(x)) for x in X]
X = np.array(X)

您的网络应相应更改:

DNNmodel = keras.Sequential([
    keras.layers.Dense(20),  #input layer size
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(1)   #output layer size
])

然后,在预测时,您必须以与您相同的方式对输入进行编码 对训练数据进行编码。

【讨论】:

  • 感谢您的反馈!我的猜测是您代码中的 X 将是训练数据集?在将代码拆分为训练和测试之前尝试运行您的代码时,我遇到了相同的形状错误。
猜你喜欢
  • 2017-05-29
  • 2019-03-15
  • 2021-07-03
  • 2019-10-20
  • 1970-01-01
  • 2021-02-08
  • 2019-04-14
  • 2021-10-16
  • 2022-10-19
相关资源
最近更新 更多