预测与模型训练数据形状不同的值

我正在尝试训练一个深度神经网络,以便根据其值对字符串进行分类。这意味着我的数据全部是文本。然而,这些文本并不是通常在网络上讨论的文本分类主题中所指的那种句子。为了使算法能够工作,我对输入进行了独热编码(虽然这些不是分类值,所以我不知道是否有更正确的编码方式),并训练了模型。然而,问题在于,当我尝试运行算法在测试或训练数据集中未见过的新文本字符串时,算法期望输入的形状与独热编码的训练数据集的形状相同。我们应该如何训练一个模型,然后改变输入,使其能够接受一个实际字符串,该字符串的形状不一定与模型拟合的形状相同呢?

以下是训练数据的一个例子:

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

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

DNNmodel = keras.Sequential([keras.layers.Dense(1),  #input layer sizekeras.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: Input 0 of layer sequential_21 is incompatible with the layer: expected axis -1 of input shape to have value 10509 but received input with shape [None, 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])

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注