【问题标题】:Python, Keras - Binary text classifier prediction results in array of values instead of single probabilityPython,Keras - 二进制文本分类器预测结果为值数组而不是单个概率
【发布时间】:2019-07-12 15:08:27
【问题描述】:

我正在构建一个非常简单的 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 类时进行预测。可悲的是,当我对它运行 predict 时,我得到一个预测数组,而不是属于 1 类的文章的预期 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

训练数据本身就是矢量化文本。可能有什么问题?

【问题讨论】:

    标签: python tensorflow keras nlp tf-idf


    【解决方案1】:

    您可能犯的错误是post 是一个字符串,而它应该是一个字符串列表。这就是为什么,正如您所提到的,model.predict() 会产生很多值:因为 tokenizer 已经迭代了 post 的字符并为每个字符生成了一个 Tf-idf 向量!只要把它放在一个列表中,问题就会得到解决:

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

    【讨论】:

    • 看起来这就是问题所在,在将它包装在一个数组中后,我得到了一个预测。非常烦人且难以发现的问题。谢谢。
    【解决方案2】:

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

    model.predict_classes 如西蒙所说或使用argmax

    np.argmax(model.predict(predicted_post_vector), axis=1)

    我会亲自在您的目标变量中使用pd.get_dummies(y_train),并将输出层调整为Dense(2, activation='sigmoid')

    【讨论】:

    • 谢谢,和 Simon 的 asnwer 一样,可惜它根本不应该是一个数组,只选择最高预测是作弊,并没有说太多。我查看了代码,似乎标记器返回了一个巨大的 0 矩阵,而不是带有单词向量的预期行,我猜问题可能出在标记器安装不正确的一侧(它应该安装在相同的数据虽然训练有素)。会检查的。
    【解决方案3】:

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

    model.predict(predicted_post_vector)[0] > 0.60
    

    【讨论】:

    • 我有一组类似的指令,产生 1 个概率,但是当我将它们封装在一个类中时,我开始获取数组,我一一浏览了所有指令,发现它完全一样不过,我认为这与代码有关。
    • 不,预测类给出了一个类而不是概率,但它仍然是一个值数组,而不是预期的单个预测
    • 我编辑了我的答案。但是,您能否指定 predict_post_vector 是什么,并更清楚您的预期输出是什么。
    • 指定了,predicted_post_vector 只是用 tfIdf tokenizer from tensorflow.keras.preprocessing.text import Tokenizer 向量化的文章,输出应该只是单个预测。 [0] 的答案是不正确的,因为我期待一个输出,因为我正在为 1 条记录提供特征
    • 这不是真的。 Keras 文档说:返回预测的 Numpy 数组。因此,无论输入的维度如何,您都会有一个 numpy 数组作为输出
    猜你喜欢
    • 2017-10-10
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2018-10-23
    • 2017-10-02
    • 2021-09-06
    相关资源
    最近更新 更多