是这样的,本来是拿了一个卷积锚狗识别模型,是二分类问题,
现在我多加了一个花朵类,由binary改成categorical,模型是训练出来了,但是test的时候不清楚怎么使用categorical的独热编码标签。
之前那个二分类模型是检测label的大小,大于0.5的是dog,否则是cat。变成多分类模型后不清楚怎么改
#二分类的test调用原码
def fig_predict_result(model, count):
test_datagen = ImageDataGenerator(rescale=1. / 255)
test_generator = test_datagen.flow_from_directory(
'./data/test/',
target_size=(150, 150),
batch_size=256,
class_mode='binary')
text_labels = []
plt.figure(figsize=(30, 20))
# 迭代器可以迭代很多条数据,但我这里只取第一个结果看看
for batch, label in test_generator:
pred = model.predict(batch)
for i in range(count):
true_reuslt = label[i]
print(true_reuslt)
if pred[i] > 0.5:
text_labels.append('dog')
else:
text_labels.append('cat')
# 4列,若干行的图
plt.subplot(count / 4 + 1, 4, i + 1)
plt.title('This is a ' + text_labels[i])
imgplot = plt.imshow(batch[i])
plt.show()
————————————————
版权声明:本文为CSDN博主「zhangphil」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhangphil/article/details/103581736
在多分类问题中,输出的结果应该是每个类别的概率分布,而不是一个二分类的结果。所以你需要将 class_mode 参数从 'binary' 改成 'categorical',并且将模型的输出层改成一个有多个神经元的输出层,其中每个神经元对应一个类别。
假设你的类别有 num_classes 个,可以将输出层改成一个 Dense 层,其中神经元的数量为 num_classes,激活函数为 softmax。这样,输出就是一个概率分布向量,其中每个元素表示对应类别的概率。
以下是修改后的代码:
import numpy as np
def fig_predict_result(model, count, class_names):
test_datagen = ImageDataGenerator(rescale=1. / 255)
test_generator = test_datagen.flow_from_directory(
'./data/test/',
target_size=(150, 150),
batch_size=256,
class_mode='categorical', # 修改为 categorical
shuffle=False # 不要打乱顺序,以便按顺序读取标签
)
plt.figure(figsize=(30, 20))
# 迭代器可以迭代很多条数据,但我这里只取第一个结果看看
for batch, labels in test_generator:
preds = model.predict(batch)
preds = np.argmax(preds, axis=-1) # 将概率向量转换为类别id
for i in range(count):
true_label = class_names[np.argmax(labels[i])]
pred_label = class_names[preds[i]]
print(true_label)
print(pred_label)
# 4列,若干行的图
plt.subplot(count / 4 + 1, 4, i + 1)
plt.title('True label: {}\nPredicted label: {}'.format(true_label, pred_label))
imgplot = plt.imshow(batch[i])
plt.show()
其中 class_names 是一个列表,包含所有类别的名称,例如 ['cat', 'dog', 'flower']。在输出结果时,我们将真实标签和预测标签都转换成对应的类别名称。
在多分类问题中,你需要使用categorical或sparse_categorical的class_mode,并使用to_categorical函数将标签转换为独热编码形式。然后,在测试时,你需要使用predict_classes函数来获取每个样本的预测类别。下面是一个示例代码:
from keras.utils import to_categorical
def fig_predict_result(model, count):
test_datagen = ImageDataGenerator(rescale=1. / 255)
test_generator = test_datagen.flow_from_directory(
'./data/test/',
target_size=(150, 150),
batch_size=256,
class_mode='categorical') # or class_mode='sparse_categorical'
text_labels = []
plt.figure(figsize=(30, 20))
# 迭代器可以迭代很多条数据,但我这里只取第一个结果看看
for batch, label in test_generator:
pred = model.predict(batch)
pred_classes = np.argmax(pred, axis=1) # 获取预测类别
for i in range(count):
true_reuslt = label[i]
print(true_reuslt)
if pred_classes[i] == 0:
text_labels.append('cat')
elif pred_classes[i] == 1:
text_labels.append('dog')
else:
text_labels.append('flower')
# 4列,若干行的图
plt.subplot(count / 4 + 1, 4, i + 1)
plt.title('This is a ' + text_labels[i])
imgplot = plt.imshow(batch[i])
plt.show()
# 转换标签为独热编码
test_datagen = ImageDataGenerator(rescale=1. / 255)
test_generator = test_datagen.flow_from_directory(
'./data/test/',
target_size=(150, 150),
batch_size=256,
class_mode='categorical') # or class_mode='sparse_categorical'
labels = test_generator.classes
labels = to_categorical(labels)
# 使用模型进行预测
model = ... # 加载模型
pred = model.predict(batch)
# 获取预测类别
pred_classes = np.argmax(pred, axis=1)
在这个示例中,我们使用categorical的class_mode来表示多分类问题,并使用to_categorical函数将标签转换为独热编码形式。在预测时,我们使用predict函数获取每个样本的预测概率,并使用argmax函数获取预测类别。最后,根据预测类别的不同,我们为每个样本设置相应的文本标签。