Python,Keras-二进制文本分类器预测结果是值数组而不是单个概率

时间:2019-07-12 15:08:27

标签: python tensorflow keras nlp tf-idf

我正在构建一个非常简单的DNN二进制模型,我将其定义为:

def __build_model(self, vocabulary_size):
    model = Sequential()
    model.add(Embedding(vocabulary_size, 12, input_length=vocabulary_size))
    model.add(Flatten())
    model.add(Dense(16, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))

    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
    return model

受过以下训练:

def __train_model(self, model, model_data, training_data, labels):
    hist = model.fit(training_data, labels, epochs=20, verbose=True, validation_split=0.2)

    model.save('models/' + model_data['Key'] + '.h5')

    return model

这个想法是在训练后提供tfidf向量化的文本,并预测它属于1类还是0类。不幸的是,当我对它进行预测时,我得到了一系列的预测,而不是属于1类的文章的预期概率数组值看起来非常统一。我认为这是由于模型中的某些错误引起的。我尝试像这样弹出预测:

            self._tokenizer.fit_on_texts(asset_article_data.content)

            predicted_post_vector = self._tokenizer.texts_to_matrix(post, mode='tfidf')

            return model.predict(predicted_post_vector) > 0.60 // here return array instead of true/false

培训数据是矢量化文本本身。可能会发生什么?

3 个答案:

答案 0 :(得分:2)

您可能会犯的错误是post是一个字符串,而应该是一个字符串列表。正如您所提到的,这就是model.predict()产生大量值的原因:因为令牌化程序已经遍历post的字符并为每个字符产生了Tf-idf向量!只要将其放在列表中,问题就可以解决:

... = self._tokenizer.texts_to_matrix([post], ...)

答案 1 :(得分:1)

Keras可以预测多个输入的输出,这就是输出为数组的原因。请参阅keras doc here(返回预测的Numpy数组)。因此,如果您需要单个输出,只需选择数组的第一个元素:

model.predict(predicted_post_vector)[0] > 0.60

答案 2 :(得分:1)

有两种方法可以解决您的问题:

<annotation> <folder>Test</folder> <filename>10 2019-02-06_20-32.png</filename> <source/> <database>undefined</database> <size> <width>768</width> <height>574</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>low</name> <pose>Left</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>360</xmin> <ymin>38</ymin> <xmax>434</xmax> <ymax>113</ymax> </bndbox> </object> <object> <name>medium</name> <pose>Left</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>227</xmin> <ymin>128</ymin> <xmax>290</xmax> <ymax>200</ymax> </bndbox> </object> </annotation> ,如Simon所说,或使用model.predict_classes

argmax

我个人在目标变量中使用np.argmax(model.predict(predicted_post_vector), axis=1)并将输出层调整为pd.get_dummies(y_train)