from glob import glob
class_names = glob("*") # Reads all the folders in which images are present
class_names = sorted(class_names) # Sorting them
name_id_map = dict(zip(class_names, range(len(class_names))))
# data labels = [1, 2, 1...]
labels_index = { "website" : 0, "money" : 1 ....}
# to feed model
label_categories = to_categorical(np.asarray(labels))
然后,对于预测:
texts = ["hello, rejoins moi sur skype", "bonjour comment ça va ?", "tu me donnes de l'argent"]
sequences = tokenizer.texts_to_sequences(texts)
data = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)
predictions = model.predict(data)
t = 0
for text in texts:
i = 0
print("Prediction for \"%s\": " % (text))
for label in labels_index:
print("\t%s ==> %f" % (label, predictions[t][i]))
i = i + 1
t = t + 1
这给出:
Prediction for "hello, rejoins moi sur skype":
website ==> 0.759483
money ==> 0.037091
under ==> 0.010587
camsite ==> 0.114436
email ==> 0.075975
abuse ==> 0.002428
Prediction for "bonjour comment ça va ?":
website ==> 0.433079
money ==> 0.084878
under ==> 0.048375
camsite ==> 0.036674
email ==> 0.369197
abuse ==> 0.027798
Prediction for "tu me donnes de l'argent":
website ==> 0.006223
money ==> 0.095308
under ==> 0.003586
camsite ==> 0.003115
email ==> 0.884112
abuse ==> 0.007655
# assume we get labels as list
labels = ["cat","dog","horse","tomato"]
# here we start building our model with input image 299x299 and one output layer
xx = Input(shape=(299,299,3))
flat = Flatten()(xx)
output = Dense(shape=(4))(flat)
# here we perform injection of labels
tf_labels = tf.constant([labels],dtype="string")
tf_labels = tf.tile(labels,[tf.shape(xx)[0],1])
output_labels = Lambda(lambda x: tf_labels,name="label_injection")(xx)
#and finaly creating a model
model=tf.keras.Model(xx,[output,output_labels])
# Data generator and prediction
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
inputpath,
target_size=(150, 150),
batch_size=20,
class_mode='categorical',
shuffle=False)
pred = model.predict_generator(test_generator, steps=len(test_generator), verbose=0)
# Get classes by max element in np (as a list)
classes = list(np.argmax(pred, axis=1))
# Get filenames (set shuffle=false in generator is important)
filenames = test_generator.filenames
9条答案
按热度按时间b5lpy0ml1#
如建议here。
k2arahey2#
当使用flow_from_directory时,问题是如何解释概率输出。如在中,如何Map概率输出和类标签,如flow_from_directory如何创建独热向量在先前是未知的。
我们可以得到一个字典,它将类标签Map到预测向量的索引,当我们使用
label_map变量是一个字典,如下所示
然后,由此可以导出概率得分和类名之间的关系。
基本上,你可以通过这段代码创建这个字典。
上述代码中的变量name_id_map也包含与从flow_from_directory的class_indices函数获得的字典相同的字典。
希望这对你有帮助!
y0u0uwnf3#
更新:这对较新的Keras版本不再有效。请使用
argmax()
作为Emilia Apostolova的答案。函数API模型只有
predict()
函数,用于分类时将返回类概率。然后,您可以使用probas_to_classes()
实用程序函数选择最可能的类。示例:这相当于顺序模型上的
model.predict_classes(x)
。这样做的原因是函数API支持更一般的任务类,其中
predict_classes()
没有意义。更多信息:https://github.com/fchollet/keras/issues/2524
6rvt4ljy4#
除了@Emilia Apostolova的答案,以获得地面真相标签,从
只要打电话
ej83mcc05#
你必须使用标签索引你有,这里我做的文本分类:
然后,对于预测:
这给出:
nafvub8i6#
可以直接在keras模型中保存标签“列表”。这样,使用模型进行预测且没有任何其他信息源的用户可以自己执行查找。下面是一个如何执行标签“注入”的虚拟示例
当用于预测时,该模型返回分数的Tensor和字符串标签的Tensor。这样的模型可以保存到h5。在这种情况下,文件包含标签。该模型也可以导出到saved_model并用于在云中服务。
dxxyhpgq7#
要使用
ImageDataGenerator
Map预测类和文件名,我用途:我可以使用以下语句循环预测的类和关联的文件名:
附录:
图片所在的路径
inputpath
需要有一个实际存放图片的子目录,原因是生成器查找子目录,在预测时生成器会给予反馈:1 classes
部分引用 one 子目录(这来自生成器,与实际预测无关)。因此,当您的
inputpath
为(例如)C:/images/
时,实际图像位于C:/images/temp/
中。z18hc3ub8#
只需在数据生成器上执行此操作
它将打印(我箱子上有猫、狗)
vddsk6oq9#
您可以用途: