Downloads · 30 days
0
chenqitao/swinb
swinb is a machine learning model from chenqitao. Use it for the machine learning task on the model card, and read the license before you ship it in a product.
import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms, models from sklearn.metrics import confusionmatrix, roccurve, auc, accuracyscore, ConfusionMatrixDisplay imp…
Downloads · 30 days
0
Access
Public
Updated Jun 28, 2024
Repo size
—
Likes
0
Public
Click a slice to open those files.
.md5.7 KB · 79%
From the Hugging Face model README
import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms, models from sklearn.metrics import confusion_matrix, roc_curve, auc, accuracy_score, ConfusionMatrixDisplay import os import numpy as np import matplotlib.pyplot as plt from torchvision.datasets import ImageFolder
train_data_dir = "/root/autodl-tmp/vqvaeboi/train" val_data_dir = '/root/autodl-tmp/vqvaeboi/test'
best_accuracy = 0.0
data_transform = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), # 随机水平翻转 transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1), # 随机颜色抖动 transforms.RandomRotation(degrees=15), # 随机旋转 transforms.ToTensor(), # This should come before Normalize transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), # This should be after ToTensor ])
train_dataset: ImageFolder = datasets.ImageFolder(root=train_data_dir, transform=data_transform) val_dataset = datasets.ImageFolder(root=val_data_dir, transform=data_transform)
dataloaders = { 'train': torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4), 'val': torch.utils.data.DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=4), }
model = models.swin_b(pretrained=True) num_ftrs = model.head.in_features # 获取最后一个线性层输入的特征数量 model.head = nn.Linear(num_ftrs, 2) # 创建一个新的线性层,输出特征维度为 2
criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.0001)
num_epochs = 100 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = model.to(device)
train_losses = [] val_losses = [] train_accuracies = [] val_accuracies = []
best_val_labels = [] best_val_preds = []
for epoch in range(num_epochs): for phase in ['train', 'val']: if phase == 'train': model.train() else: model.eval()
running_loss = 0.0
running_corrects = 0
all_labels = []
all_preds = []
for inputs, labels in dataloaders[phase]:
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
with torch.set_grad_enabled(phase == 'train'):
outputs = model(inputs)
loss = criterion(outputs, labels)
if phase == 'train':
loss.backward()
optimizer.step()
running_loss += loss.item() * inputs.size(0)
_, preds = torch.max(outputs, 1)
running_corrects += torch.sum(preds == labels.data)
if phase == 'val':
all_labels.extend(labels.cpu().numpy())
all_preds.extend(preds.cpu().numpy())
epoch_loss = running_loss / len(dataloaders[phase].dataset)
epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)
print(f'Epoch {epoch}/{num_epochs} | {phase} | Loss: {epoch_loss:.4f} | Acc: {epoch_acc:.4f}')
if phase == 'train':
train_losses.append(epoch_loss)
train_accuracies.append(epoch_acc)
else:
val_losses.append(epoch_loss)
val_accuracies.append(epoch_acc)
if epoch_acc > best_accuracy:
best_accuracy = epoch_acc
torch.save(model.state_dict(), 'best_model.pth')
best_val_labels = all_labels
best_val_preds = all_preds
model.load_state_dict(torch.load('best_model.pth'))
plt.figure(figsize=(10, 5)) plt.plot(train_losses, label='Training Loss') plt.plot(val_losses, label='Validation Loss') plt.xlabel('Epochs') plt.ylabel('Loss') plt.title('Training and Validation Loss') plt.legend() plt.show()
plt.figure(figsize=(10, 5)) plt.plot(train_accuracies, label='Training Accuracy') plt.plot(val_accuracies, label='Validation Accuracy') plt.xlabel('Epochs') plt.ylabel('Accuracy') plt.title('Training and Validation Accuracy') plt.legend() plt.show()
conf_matrix = confusion_matrix(best_val_labels, best_val_preds) print("Confusion Matrix:") print(conf_matrix)
class_names = sorted(train_dataset.classes) disp = ConfusionMatrixDisplay(confusion_matrix=conf_matrix, display_labels=class_names) disp.plot(cmap='Blues', values_format='d') plt.title('Confusion Matrix') plt.show()
fpr, tpr, _ = roc_curve(best_val_labels, best_val_preds) roc_auc = auc(fpr, tpr)
conf_matrix = confusion_matrix(best_val_labels, best_val_preds)
TN, FP, FN, TP = conf_matrix.ravel()
Specificity = TN / (TN + FP) Sensitivity = TP / (TP + FN)
print(f'Specificity: {Specificity:.4f}') print(f'Sensitivity: {Sensitivity:.4f}')
plt.figure(figsize=(8, 8)) plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'AUC = {roc_auc:.2f}') plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') 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') plt.legend(loc="lower right") plt.show()
print(f'Best Validation Accuracy: {best_accuracy:.4f}')