我正在尝试训练一个深度神经网络,以便能够根据其值对字符串进行分类。因此,这意味着我的数据全部为文本。但是,它不是句子意义上的文本,这是我在互联网上看到的大多数文本分类主题。为了使算法起作用,我对输入进行了一次热编码(尽管它们不是分类值,所以我不确定是否存在更正确的编码方法)并训练了模型。但是,问题在于,当我尝试运行该算法未在测试或训练数据集中看到的新文本字符串时,该算法期望输入为一次性编码训练数据集的形状。我们应该如何训练模型,然后更改输入,以便它可以接受不一定与模型适合的形状相同的实际字符串?
以下是训练数据的示例:
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:sequence_21层的输入0与该层不兼容:预期输入形状的轴-1的值为10509,但接收到形状为[None的输入,1]“
有关此操作的任何提示?
答案 0 :(得分: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
])
然后,在预测时,必须以与输入相同的方式对输入进行编码 对训练数据进行了编码。