TensorFlow:创建混淆矩阵时无法将图像转换为浮点数

Posted

技术标签:

【中文标题】TensorFlow:创建混淆矩阵时无法将图像转换为浮点数【英文标题】:TensorFlow: Image cannot be converted to float when creating confusion matrix 【发布时间】:2019-06-30 02:58:22 【问题描述】:

我正在尝试在 TensorFlow 中创建一个混淆矩阵,但我得到了一个

TypeError:图像数据无法转换为浮点数。

图像被准确预测,但现在我想使用 matplotlib 显示混淆矩阵。我尝试转换为 np.array() 但错误仍然相同。

我正在关注来自 scikit-learn 的混淆矩阵的官方文档。 https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html

def plot_confusion_matrix(cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):
    """
    This function prints and plots the confusion matrix.
    Normalization can be applied by setting `normalize=True`.
    """
    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        print("Normalized confusion matrix")
    else:
        print('Confusion matrix, without normalization')

    print(cm)

    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)

    fmt = '.2f' if normalize else 'd'
    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, format(cm[i, j], fmt),
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")

    plt.ylabel('True label')
    plt.xlabel('Predicted label')
    plt.tight_layout()


if result[0][0]>0.85:
    predictions.append(result[0][0])
elif result[0][1]>0.85:
    predictions.append(result[0][1])
elif result[0][2]>0.85:
    predictions.append(result[0][2])
elif result[0][3]>0.85:
    predictions.append(result[0][3])
elif result[0][4]>0.85:
    predictions.append(result[0][4])
elif result[0][5]>0.85:
    predictions.append(result[0][5])

class_names = ['Up', 'Down', 'Left', 'Right', 'Forward', 'Backward']

# label_list contains the filename e.g. hand1.jpg, hand2.jpg....

# Compute confusion matrix
cnf_matrix = tf.confusion_matrix(label_list,predictions,num_classes=6)
np.set_printoptions(precision=2)

# Plot non-normalized confusion matrix
plt.figure()

# ERROR HERE
plot_confusion_matrix(cnf_matrix, classes=class_names,title='Confusion matrix, without normalization')

# Plot normalized confusion matrix
plt.figure()
plot_confusion_matrix(cnf_matrix, classes=class_names, normalize=True,title='Normalized confusion matrix')

plt.show()

【问题讨论】:

【参考方案1】:

我没有在我的电脑上测试过。你的描述对我来说有点模棱两可(错误行等),但你的代码和你链接的文档的主要区别是confusion_matrix()。只需尝试使用 sckit-learnconfusion_matrix() 而不是 tensorflowconfusion_matrix()(在链接中,使用前者)。在我看来,这是你可以走的最简单的方法。

编辑: 做出这样的预测:

for i in range(6):
    if result[0][i] > 0.85:
        predictions.append(i)
        continue

那么您的预测将不会是连续的。在这里,您的预测应该是整数,因为您正在预测类标签。

【讨论】:

我更改了我的代码,使其遵循 scikit-learn 但现在我得到“ValueError:分类指标无法处理多类和连续目标的混合” @hassanyf 最简单的修复方法是将您的预测作为标签编号。例如,您可以执行以下操作:for i in range(6): if result[0][i] > 0.85: predictions.append(i) continue 我已编辑答案以包含此内容。

以上是关于TensorFlow:创建混淆矩阵时无法将图像转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Tensorflow 创建预测标签和真实标签的混淆矩阵?

如何在 Tensorflow 中为预取数据集绘制混淆矩阵

TF 准确度得分和混淆矩阵不一致。 TensorFlow 是不是会在 BatchDataset 的每次访问时对数据进行洗牌?

TensorFlow 的混淆矩阵

TensorBoard 中的 Tensorflow 混淆矩阵

tensorflow 使用混淆矩阵进行评估