我正在构建一个非常简单的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
培训数据是矢量化文本本身。可能会发生什么?
答案 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)
。