【问题标题】:Keras model.predict() giving only one predictionKeras model.predict() 只给出一个预测
【发布时间】:2019-01-27 16:38:40
【问题描述】:

我训练了一个模型,它显示了所有 4 个预测并以 json 格式保存。当我尝试加载它并进行预测时,它只显示一个预测。会发生什么?

我的代码:

test = pd.read_csv('./Data/test.tsv', sep="\t")
from nltk.tokenize import word_tokenize
from nltk import FreqDist
from nltk.stem import SnowballStemmer,WordNetLemmatizer
stemmer=SnowballStemmer('english')
lemma=WordNetLemmatizer()
from string import punctuation
import re
testing = test.Phrase.apply(lambda x: x.lower())
tokenizer = Tokenizer(num_words= 10000)
X_test = tokenizer.texts_to_sequences(testing.values)

X_test = sequence.pad_sequences(X_test, maxlen=48)
json_file = open('model1.json', 'r')
loaded_model_json = json_file.read()    
json_file.close()
loaded_model = model_from_json(loaded_model_json)

# Load weights into new model
loaded_model.load_weights('model1.h5') 
loaded_model.compile(loss='categorical_crossentropy',
                     optimizer=Adam(lr=0.001),
                     metrics=['accuracy'])

prediction = model.predict_classes(X_test,verbose=1)
model.summary()#while training
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_1 (Embedding)      (None, None, 100)         1373200   
_________________________________________________________________
lstm_1 (LSTM)                (None, None, 64)          42240     
_________________________________________________________________
lstm_2 (LSTM)                (None, 32)                12416     
_________________________________________________________________
dense_1 (Dense)              (None, 5)                 165       
=================================================================
Total params: 1,428,021
Trainable params: 1,428,021
Non-trainable params: 0
print(X_test.shape)
(66292, 48)

【问题讨论】:

  • 你能再解释一下吗?你的意思是它只显示一个预测?你的意思是它只对一个类进行预测,还是你的意思是它只对 X_test 中的一行(四行)进行预测?打印loaded_model。 summary() 并将其粘贴在这里也会有所帮助。还能加X_test的形状吗?
  • 如果你想说它只返回一个“类”,而你的训练集是四个类?听起来您可能正在寻找建议每个班级“适合”的值的返回?
  • 实际上我已经训练了情绪分析模型。它有四个类 0,1,2,3,4。当我训练我的模型并进行预测时,它可以很好地处理输出(0,1 ,2,3,4)。当我从 json 加载模型并在数据集中进行预测时,它只显示一个结果,即 2。它应该显示所有 4 类预测。
  • 我在下面发布了答案。希望我正确理解您的问题。如果不是,请添加预期输出和实际输出并添加模型摘要(loaded_model. summary() )。

标签: python keras data-science prediction


【解决方案1】:

如果我正确理解您的问题,问题就在这里: predict_classes 将返回最终的预测标签,而不是概率。它将返回概率最高的四个标签之一。如果您想要每个类的概率,您可能应该使用相同的predict_probapredict,例如:

prediction = model.predict(X_test,verbose=1)

【讨论】:

  • 当我尝试保存预测时也做了同样的事情,它抛出了错误数据必须是 1D 下面是我用来保存预测的代码:prediction = pd.DataFrame({ "phrase": test [“短语”],“情绪”:预测})
  • 我已经更新了代码。这个模型摘要是我在训练模型并保存时得到的。
  • 我试过 predict_proba 它也只给了我所有输入的一个预测 0.110344835
【解决方案2】:

错误已解决,它没有正确地对测试值进行标记。下面的命令删除错误

tokenizer.fit_on_texts(testing.values)

【讨论】:

    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多