我正在基于Keras的CNN模型进行分类。
我将在应用程序中使用它,用户可以在其中加载应用程序并输入输入文本,然后将从权重中加载模型并进行预测。
问题是我也在使用GloVe嵌入,而CNN模型也使用填充的文本序列。
我使用Keras标记器,如下所示:
tokenizer = text.Tokenizer(num_words=max_features, lower=True, char_level=False)
tokenizer.fit_on_texts(list(train_x))
train_x = tokenizer.texts_to_sequences(train_x)
test_x = tokenizer.texts_to_sequences(test_x)
train_x = sequence.pad_sequences(train_x, maxlen=maxlen)
test_x = sequence.pad_sequences(test_x, maxlen=maxlen)
我训练了模型并根据测试数据进行了预测,但是现在我想用我加载并工作的加载模型对其进行测试。
但是我的问题是,如果我提供单个评论,则必须通过tokeniser.text_to_sequences()
,该评论将返回二维数组,形状为(num_chars, maxlength)
,因此后面是{{1 }}预测,但我需要以num_chars
的形式出现。
我正在使用以下代码进行预测:
(1, max_length)
输出为:
review = 'well free phone cingular broke stuck not abl offer kind deal number year contract up realli want razr so went look cheapest one could find so went came euro charger small adpat made fit american outlet, gillett fusion power replac cartridg number count packagemay not greatest valu out have agillett fusion power razor'
xtest = tokenizer.texts_to_sequences(review)
xtest = sequence.pad_sequences(xtest, maxlen=maxlen)
model.predict(xtest)
array([[0.29289 , 0.36136267, 0.6205081 ],
[0.362869 , 0.31441122, 0.539749 ],
[0.32059124, 0.3231736 , 0.5552745 ],
...,
[0.34428033, 0.3363668 , 0.57663095],
[0.43134686, 0.33979046, 0.48991954],
[0.22115968, 0.27314988, 0.6188136 ]], dtype=float32)
我需要一个预测,因为我只有一个评论。
答案 0 :(得分:1)
问题是您需要将字符串列表传递给texts_to_sequences
方法。因此,您需要将单个评论放入这样的列表中:
xtest = tokenizer.texts_to_sequences([review])
如果不这样做(即传递一个字符串,而不是一个字符串列表),则考虑到Python中的字符串是可迭代的,请在给定字符串的字符上it would iterate,然后考虑这些字符而不是文字,作为标记:
oov_token_index = self.word_index.get(self.oov_token)
for text in texts: # <-- it would iterate over the string instead
if self.char_level or isinstance(text, list):
这就是为什么您将得到形状为(num_chars, maxlength)
的数组作为texts_to_sequences
方法的返回值的原因。