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