繁体   English   中英

预测值与 model 适合的训练数据的形状不同

[英]Predicting values that are not the same shape as the training data that the model fit to

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

以下是训练数据的示例:

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

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

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但接收到形状为[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
])

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM