tensorflow 二分类、多分类指标评价

我用的是tensorflow 2.5,搜索网上的教程大部分说用的是tf.keras.metrics中的api,但是经过实验发现都用不了,如今tensorflow 2.5可能不支持这些api了。

于是我采用sklearn库的函数实现二分类问题和多分类问题的评价指标计算。

f1_score, precision_score, recall_score, accuracy_score

二分类问题

# binary classify
from sklearn.metrics import confusion_matrix, f1_score, precision_score, recall_score, accuracy_score
import matplotlib as mpl
import matplotlib.pyplot as plt

# 绘制正例ROC曲线
def plot_roc(name, labels, predictions, **kwargs):
  fp, tp, _ = sklearn.metrics.roc_curve(labels, predictions, pos_label=0)

  plt.plot(100*fp, 100*tp, label=name, linewidth=2, **kwargs)
  plt.xlabel('False positives [%]')
  plt.ylabel('True positives [%]')
  plt.xlim([-0.5,100.5])
  plt.ylim([-0.5,100.5])
  plt.grid(True)
  ax = plt.gca()
  ax.set_aspect('equal')
  plt.legend(loc='lower right')
  plt.savefig("./img/multi_roc.png")

loss,acc= model.evaluate(x_test,y_test)
test_predictions = model.predict(x_test)
true_labels=y_test.astype('uint8')
test_scores = 1-(test_predictions - test_predictions.min())/(test_predictions.max() - test_predictions.min())
    
mpl.rcParams['figure.figsize'] = (12, 10)
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
plot_roc("My Model", true_labels, test_scores, color=colors[0])

recall = recall_score(true_labels,test_predictions.round())
f1 = f1_score(true_labels,test_predictions.round())
precision = precision_score(true_labels,test_predictions.round())
print('accuracy: ',acc)
print('loss: ',loss)
print('recall: ',recall)
print('precision: ',precision)
print('f1: ',f1)

多分类问题

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import sklearn
from sklearn.metrics import confusion_matrix, f1_score, precision_score, recall_score, accuracy_score

# 绘制正例ROC曲线
def plot_roc(name, labels, predictions, **kwargs):
  fp, tp, _ = sklearn.metrics.roc_curve(labels, predictions, pos_label=0)

  plt.plot(100*fp, 100*tp, label=name, linewidth=2, **kwargs)
  plt.xlabel('False positives [%]')
  plt.ylabel('True positives [%]')
  plt.xlim([-0.5,100.5])
  plt.ylim([-0.5,100.5])
  plt.grid(True)
  ax = plt.gca()
  ax.set_aspect('equal')
  plt.legend(loc='lower right')
  plt.savefig("./img/multi_roc.png")

y_pred = model.predict(x_test)
test_predictions = np.argmax(y_pred, axis=1)
y_true=y_test.astype('uint8')
test_scores = 1-(test_predictions - test_predictions.min())/(test_predictions.max() - test_predictions.min())

mpl.rcParams['figure.figsize'] = (12, 10)
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
plot_roc("My Model", y_test, test_scores, color=colors[0])

acc = accuracy_score(y_true,test_predictions)
recall = recall_score(y_true,test_predictions,average='micro')
precision = precision_score(y_true,test_predictions,average='micro')
f1 = f1_score(y_true,test_predictions,average='micro')
print('accuracy: ',acc)
print('recall: ',recall)
print('precision: ',precision)
print('f1: ',f1)

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是您需要的代码: 1. 数据集准备和预处理 ```python import tensorflow as tf import numpy as np import os # 定义数据集目录和类别数 data_dir = 'path/to/dataset' num_classes = 2 # 定义图像大小和批次大小 image_size = 224 batch_size = 32 # 定义数据增强器,包括随机裁剪、水平翻转和随机亮度、对比度和饱和度变换 data_augmentation = tf.keras.Sequential([ tf.keras.layers.experimental.preprocessing.RandomCrop(image_size, image_size), tf.keras.layers.experimental.preprocessing.RandomFlip(mode='horizontal'), tf.keras.layers.experimental.preprocessing.RandomContrast(0.1), tf.keras.layers.experimental.preprocessing.RandomBrightness(0.1), tf.keras.layers.experimental.preprocessing.RandomSaturation(0.1), ]) # 定义训练集和验证集 train_ds = tf.keras.preprocessing.image_dataset_from_directory( data_dir, validation_split=0.2, subset='training', seed=123, image_size=(image_size, image_size), batch_size=batch_size ) val_ds = tf.keras.preprocessing.image_dataset_from_directory( data_dir, validation_split=0.2, subset='validation', seed=123, image_size=(image_size, image_size), batch_size=batch_size ) # 对训练集应用数据增强器 train_ds = train_ds.map(lambda x, y: (data_augmentation(x, training=True), y)) # 对验证集进行缓存和预取以加速读取速度 val_ds = val_ds.cache().prefetch(buffer_size=tf.data.AUTOTUNE) ``` 2. 模型构建 ```python from tensorflow.keras.applications import MobileNetV3Small # 加载 MobileNetV3 模型,不包括分类层 base_model = MobileNetV3Small(include_top=False, weights='imagenet', input_shape=(image_size, image_size, 3)) # 冻结模型的所有层,以便只训练新添加的分类层 base_model.trainable = False # 添加全局平均池化层和分类层 global_average_layer = tf.keras.layers.GlobalAveragePooling2D() prediction_layer = tf.keras.layers.Dense(num_classes, activation='softmax') # 构建完整模型 model = tf.keras.Sequential([ base_model, global_average_layer, prediction_layer ]) ``` 3. 模型编译和训练 ```python # 编译模型,选择损失函数、优化器和评价指标 model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型,选择训练轮数和回调函数 epochs = 10 history = model.fit(train_ds, epochs=epochs, validation_data=val_ds, callbacks=[tf.keras.callbacks.ModelCheckpoint('model.h5', save_best_only=True)]) ``` 4. 模型预测和保存 ```python # 加载保存的最优模型 model = tf.keras.models.load_model('model.h5') # 对单张图像进行预测 img_path = 'path/to/image' img = tf.keras.preprocessing.image.load_img(img_path, target_size=(image_size, image_size)) img_array = tf.keras.preprocessing.image.img_to_array(img) img_array = tf.expand_dims(img_array, 0) # 扩展维度以匹配模型输入 predictions = model.predict(img_array) print(predictions) # 保存整个模型为 SavedModel 格式 tf.saved_model.save(model, 'saved_model') ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值