泰安网站建设优化案例报告,惠州市中国建设银行网站,湖南产品网络营销推荐咨询,有哪些网站主页做的比较好看基于WIN10的64位系统演示
一、写在前面
上期我们基于TensorFlow环境做了图像识别的多分类任务建模。
本期以健康组、肺结核组、COVID-19组、细菌性#xff08;病毒性#xff09;肺炎组为数据集#xff0c;基于Pytorch环境#xff0c;构建SqueezeNet多分类模型#xff0…基于WIN10的64位系统演示
一、写在前面
上期我们基于TensorFlow环境做了图像识别的多分类任务建模。
本期以健康组、肺结核组、COVID-19组、细菌性病毒性肺炎组为数据集基于Pytorch环境构建SqueezeNet多分类模型因为它建模速度快。
同样基于GPT-4辅助编程这次改写过程就不展示了。 二、多分类建模实战
使用胸片的数据集肺结核病人和健康人的胸片的识别。其中健康人900张肺结核病人700张COVID-19病人549张、细菌性病毒性肺炎组900张分别存入单独的文件夹中。 a直接分享代码
######################################导入包###################################
# 导入必要的包
import copy
import torch
import torchvision
import torchvision.transforms as transforms
from torchvision import models
from torch.utils.data import DataLoader
from torch import optim, nn
from torch.optim import lr_scheduler
import os
import matplotlib.pyplot as plt
import warnings
import numpy as npwarnings.filterwarnings(ignore)
plt.rcParams[font.sans-serif] [SimHei]
plt.rcParams[axes.unicode_minus] False# 设置GPU
device torch.device(cuda:0 if torch.cuda.is_available() else cpu)################################导入数据集#####################################
import torch
from torchvision import datasets, transforms
import os# 数据集路径
data_dir ./MTB-1# 图像的大小
img_height 100
img_width 100# 数据预处理
data_transforms {train: transforms.Compose([transforms.RandomResizedCrop(img_height),transforms.RandomHorizontalFlip(),transforms.RandomVerticalFlip(),transforms.RandomRotation(0.2),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),val: transforms.Compose([transforms.Resize((img_height, img_width)),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),
}# 加载数据集
full_dataset datasets.ImageFolder(data_dir)# 获取数据集的大小
full_size len(full_dataset)
train_size int(0.7 * full_size) # 假设训练集占70%
val_size full_size - train_size # 验证集的大小# 随机分割数据集
torch.manual_seed(0) # 设置随机种子以确保结果可重复
train_dataset, val_dataset torch.utils.data.random_split(full_dataset, [train_size, val_size])# 将数据增强应用到训练集
train_dataset.dataset.transform data_transforms[train]# 创建数据加载器
batch_size 32
train_dataloader torch.utils.data.DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue, num_workers4)
val_dataloader torch.utils.data.DataLoader(val_dataset, batch_sizebatch_size, shuffleTrue, num_workers4)dataloaders {train: train_dataloader, val: val_dataloader}
dataset_sizes {train: len(train_dataset), val: len(val_dataset)}
class_names full_dataset.classes###############################定义SqueezeNet模型################################
# 定义SqueezeNet模型
model models.squeezenet1_1(pretrainedTrue) # 这里以SqueezeNet 1.1版本为例
num_ftrs model.classifier[1].in_channels# 根据分类任务修改最后一层
model.classifier[1] nn.Conv2d(num_ftrs, len(class_names), kernel_size(1,1))# 修改模型最后的输出层为我们需要的类别数
model.num_classes len(class_names)model model.to(device)# 打印模型摘要
print(model)#############################编译模型#########################################
# 定义损失函数
criterion nn.CrossEntropyLoss()# 定义优化器
optimizer optim.Adam(model.parameters())# 定义学习率调度器
exp_lr_scheduler lr_scheduler.StepLR(optimizer, step_size7, gamma0.1)# 开始训练模型
num_epochs 50# 初始化记录器
train_loss_history []
train_acc_history []
val_loss_history []
val_acc_history []for epoch in range(num_epochs):print(Epoch {}/{}.format(epoch, num_epochs - 1))print(- * 10)# 每个epoch都有一个训练和验证阶段for phase in [train, val]:if phase train:model.train() # 设置模型为训练模式else:model.eval() # 设置模型为评估模式running_loss 0.0running_corrects 0# 遍历数据for inputs, labels in dataloaders[phase]:inputs inputs.to(device)labels labels.to(device)# 零参数梯度optimizer.zero_grad()# 前向with torch.set_grad_enabled(phase train):outputs model(inputs)_, preds torch.max(outputs, 1)loss criterion(outputs, labels)# 只在训练模式下进行反向和优化if phase train:loss.backward()optimizer.step()# 统计running_loss loss.item() * inputs.size(0)running_corrects torch.sum(preds labels.data)epoch_loss running_loss / dataset_sizes[phase]epoch_acc (running_corrects.double() / dataset_sizes[phase]).item()# 记录每个epoch的loss和accuracyif phase train:train_loss_history.append(epoch_loss)train_acc_history.append(epoch_acc)else:val_loss_history.append(epoch_loss)val_acc_history.append(epoch_acc)print({} Loss: {:.4f} Acc: {:.4f}.format(phase, epoch_loss, epoch_acc))print()# 保存模型
torch.save(model.state_dict(), model.pth)# 加载最佳模型权重
#model.load_state_dict(best_model_wts)
#torch.save(model, shufflenet_best_model.pth)
#print(The trained model has been saved.)
###########################Accuracy和Loss可视化#################################
epoch range(1, len(train_loss_history)1)fig, ax plt.subplots(1, 2, figsize(10,4))
ax[0].plot(epoch, train_loss_history, labelTrain loss)
ax[0].plot(epoch, val_loss_history, labelValidation loss)
ax[0].set_xlabel(Epochs)
ax[0].set_ylabel(Loss)
ax[0].legend()ax[1].plot(epoch, train_acc_history, labelTrain acc)
ax[1].plot(epoch, val_acc_history, labelValidation acc)
ax[1].set_xlabel(Epochs)
ax[1].set_ylabel(Accuracy)
ax[1].legend()#plt.savefig(loss-acc.pdf, dpi300,formatpdf)####################################混淆矩阵可视化#############################
from sklearn.metrics import classification_report, confusion_matrix
import math
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib.pyplot import imshow# 定义一个绘制混淆矩阵图的函数
def plot_cm(labels, predictions):# 生成混淆矩阵conf_numpy confusion_matrix(labels, predictions)# 将矩阵转化为 DataFrameconf_df pd.DataFrame(conf_numpy, indexclass_names ,columnsclass_names) plt.figure(figsize(8,7))sns.heatmap(conf_df, annotTrue, fmtd, cmapBuPu)plt.title(Confusion matrix,fontsize15)plt.ylabel(Actual value,fontsize14)plt.xlabel(Predictive value,fontsize14)def evaluate_model(model, dataloader, device):model.eval() # 设置模型为评估模式true_labels []pred_labels []# 遍历数据for inputs, labels in dataloader:inputs inputs.to(device)labels labels.to(device)# 前向with torch.no_grad():outputs model(inputs)_, preds torch.max(outputs, 1)true_labels.extend(labels.cpu().numpy())pred_labels.extend(preds.cpu().numpy())return true_labels, pred_labels# 获取预测和真实标签
true_labels, pred_labels evaluate_model(model, dataloaders[val], device)# 计算混淆矩阵
cm_val confusion_matrix(true_labels, pred_labels)
a_val cm_val[0,0]
b_val cm_val[0,1]
c_val cm_val[1,0]
d_val cm_val[1,1]# 计算各种性能指标
acc_val (a_vald_val)/(a_valb_valc_vald_val) # 准确率
error_rate_val 1 - acc_val # 错误率
sen_val d_val/(d_valc_val) # 灵敏度
sep_val a_val/(a_valb_val) # 特异度
precision_val d_val/(b_vald_val) # 精确度
F1_val (2*precision_val*sen_val)/(precision_valsen_val) # F1值
MCC_val (d_val*a_val-b_val*c_val) / (np.sqrt((d_valb_val)*(d_valc_val)*(a_valb_val)*(a_valc_val))) # 马修斯相关系数# 打印出性能指标
print(验证集的灵敏度为, sen_val, 验证集的特异度为, sep_val,验证集的准确率为, acc_val, 验证集的错误率为, error_rate_val,验证集的精确度为, precision_val, 验证集的F1为, F1_val,验证集的MCC为, MCC_val)# 绘制混淆矩阵
plot_cm(true_labels, pred_labels)# 获取预测和真实标签
train_true_labels, train_pred_labels evaluate_model(model, dataloaders[train], device)
# 计算混淆矩阵
cm_train confusion_matrix(train_true_labels, train_pred_labels)
a_train cm_train[0,0]
b_train cm_train[0,1]
c_train cm_train[1,0]
d_train cm_train[1,1]
acc_train (a_traind_train)/(a_trainb_trainc_traind_train)
error_rate_train 1 - acc_train
sen_train d_train/(d_trainc_train)
sep_train a_train/(a_trainb_train)
precision_train d_train/(b_traind_train)
F1_train (2*precision_train*sen_train)/(precision_trainsen_train)
MCC_train (d_train*a_train-b_train*c_train) / (math.sqrt((d_trainb_train)*(d_trainc_train)*(a_trainb_train)*(a_trainc_train)))
print(训练集的灵敏度为,sen_train, 训练集的特异度为,sep_train,训练集的准确率为,acc_train, 训练集的错误率为,error_rate_train,训练集的精确度为,precision_train, 训练集的F1为,F1_train,训练集的MCC为,MCC_train)# 绘制混淆矩阵
plot_cm(train_true_labels, train_pred_labels)################################模型性能参数计算################################
from sklearn import metricsdef test_accuracy_report(model, dataloader, device):true_labels, pred_labels evaluate_model(model, dataloader, device)print(metrics.classification_report(true_labels, pred_labels, target_namesclass_names)) test_accuracy_report(model, dataloaders[val], device)def train_accuracy_report(model, dataloader, device):true_labels, pred_labels evaluate_model(model, dataloader, device)print(metrics.classification_report(true_labels, pred_labels, target_namesclass_names)) train_accuracy_report(model, dataloaders[train], device)################################AUC曲线绘制####################################
from sklearn import metrics
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
import pandas as pd
import math
from sklearn.metrics import roc_auc_score, auc
from sklearn.preprocessing import LabelBinarizerdef multiclass_roc_auc_score(y_test, y_pred, averagemacro):# 判断 y_test 是否需要进行标签二值化if len(np.unique(y_test)) 2: # 假设 y_test 是类别标签且类别数大于 2lb LabelBinarizer()lb.fit(y_test)y_test lb.transform(y_test)return roc_auc_score(y_test, y_pred, averageaverage)def plot_roc(name, labels, predictions, **kwargs):lb LabelBinarizer()labels lb.fit_transform(labels) # one-hot 编码# predictions 不需要进行标签二值化# 计算ROC曲线和AUC值fpr dict()tpr dict()roc_auc dict()class_num len(class_names)for i in range(class_num): # class_num是类别数目fpr[i], tpr[i], _ metrics.roc_curve(labels[:, i], predictions[:, i])roc_auc[i] metrics.auc(fpr[i], tpr[i])for i in range(class_num):plt.plot(fpr[i], tpr[i], labelROC curve of class {0} (area {1:0.2f}) .format(i, roc_auc[i]))plt.plot([0, 1], [0, 1], k--)plt.xlim([0.0, 1.0])plt.ylim([0.0, 1.05])plt.xlabel(False Positive Rate)plt.ylabel(True Positive Rate)plt.title(Receiver operating characteristic example)plt.legend(loclower right)plt.show()# 确保模型处于评估模式
model.eval()def evaluate_model_pre(model, data_loader, device):model.eval()predictions []labels []with torch.no_grad():for inputs, targets in data_loader:inputs inputs.to(device)targets targets.to(device)outputs model(inputs)# 使用 softmax 函数转换成概率值prob_outputs torch.nn.functional.softmax(outputs, dim1)predictions.append(prob_outputs.detach().cpu().numpy())labels.append(targets.detach().cpu().numpy())return np.concatenate(predictions, axis0), np.concatenate(labels, axis0)val_pre_auc, val_label_auc evaluate_model_pre(model, dataloaders[val], device)
train_pre_auc, train_label_auc evaluate_model_pre(model, dataloaders[train], device)auc_score_val multiclass_roc_auc_score(val_label_auc, val_pre_auc)
auc_score_train multiclass_roc_auc_score(train_label_auc, train_pre_auc)plot_roc(validation AUC: {0:.4f}.format(auc_score_val), val_label_auc, val_pre_auc, colorred, linestyle--)
plot_roc(training AUC: {0:.4f}.format(auc_score_train), train_label_auc, train_pre_auc, colorblue, linestyle--)print(训练集的AUC值为,auc_score_train, 验证集的AUC值为,auc_score_val)
b输出结果学习曲线 c输出结果混淆矩阵 d输出结果性能参数 e输出结果ROC曲线 三、数据
链接https://pan.baidu.com/s/1rqu15KAUxjNBaWYfEmPwgQ?pwdxfyn
提取码xfyn