目錄
前言
1.檢查GPU
2.查看數據
3.劃分數據集
4.創建模型與編譯訓練
????5.編譯及訓練模型?
6.結果可視化
7.模型預測?
8.總結:
前言
🍨 本文為🔗365天深度學習訓練營中的學習記錄博客
🍖 原作者:K同學啊
1.檢查GPU
import numpy as np
import pandas as pd
import torch
from torch import nn
import torch.nn.functional as F
import seaborn as sns#設置GPU訓練,也可以使用CPU
device=torch.device("cuda" if torch.cuda.is_available() else "cpu")
device
2.查看數據
df = pd.read_csv("DATA/alzheimers_disease_data.csv")
# 刪除第一列和最后一列
df = df.iloc[:, 1:-1]
df
3.劃分數據集
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_splitX = df.iloc[:,:-1]
y = df.iloc[:,-1]# 將每一列特征標準化為標準正太分布,注意,標準化是針對每一列而言的
sc = StandardScaler()
X = sc.fit_transform(X)X = torch.tensor(np.array(X), dtype=torch.float32)
y = torch.tensor(np.array(y), dtype=torch.int64)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.1, random_state = 1)X_train.shape, y_train.shapefrom torch.utils.data import TensorDataset, DataLoadertrain_dl = DataLoader(TensorDataset(X_train, y_train),batch_size=64, shuffle=False)test_dl = DataLoader(TensorDataset(X_test, y_test),batch_size=64, shuffle=False)
4.創建模型與編譯訓練
class model_rnn(nn.Module):def __init__(self):super(model_rnn, self).__init__()self.rnn0 = nn.RNN(input_size=32, hidden_size=200, num_layers=1, batch_first=True)self.fc0 = nn.Linear(200, 50)self.fc1 = nn.Linear(50, 2)def forward(self, x):out, hidden1 = self.rnn0(x) out = self.fc0(out) out = self.fc1(out) return out model = model_rnn().to(device)
model
????5.編譯及訓練模型?
# 訓練循環
def train(dataloader, model, loss_fn, optimizer):size = len(dataloader.dataset) # 訓練集的大小num_batches = len(dataloader) # 批次數目, (size/batch_size,向上取整)train_loss, train_acc = 0, 0 # 初始化訓練損失和正確率for X, y in dataloader: # 獲取圖片及其標簽X, y = X.to(device), y.to(device)# 計算預測誤差pred = model(X) # 網絡輸出loss = loss_fn(pred, y) # 計算網絡輸出和真實值之間的差距,targets為真實值,計算二者差值即為損失# 反向傳播optimizer.zero_grad() # grad屬性歸零loss.backward() # 反向傳播optimizer.step() # 每一步自動更新# 記錄acc與losstrain_acc += (pred.argmax(1) == y).type(torch.float).sum().item()train_loss += loss.item()train_acc /= sizetrain_loss /= num_batchesreturn train_acc, train_lossdef test (dataloader, model, loss_fn):size = len(dataloader.dataset) # 測試集的大小num_batches = len(dataloader) # 批次數目, (size/batch_size,向上取整)test_loss, test_acc = 0, 0# 當不進行訓練時,停止梯度更新,節省計算內存消耗with torch.no_grad():for imgs, target in dataloader:imgs, target = imgs.to(device), target.to(device)# 計算losstarget_pred = model(imgs)loss = loss_fn(target_pred, target)test_loss += loss.item()test_acc += (target_pred.argmax(1) == target).type(torch.float).sum().item()test_acc /= sizetest_loss /= num_batchesreturn test_acc, test_lossloss_fn = nn.CrossEntropyLoss() # 創建損失函數
learn_rate = 1e-4 # 學習率
opt = torch.optim.Adam(model.parameters(),lr=learn_rate)
epochs = 30train_loss = []
train_acc = []
test_loss = []
test_acc = []for epoch in range(epochs):model.train()epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, opt)model.eval()epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn)train_acc.append(epoch_train_acc)train_loss.append(epoch_train_loss)test_acc.append(epoch_test_acc)test_loss.append(epoch_test_loss)# 獲取當前的學習率lr = opt.state_dict()['param_groups'][0]['lr']template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}, Lr:{:.2E}')print(template.format(epoch+1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss, lr))
print("="*20, 'Done', "="*20)
6.結果可視化
import matplotlib.pyplot as plt
#隱藏警告
import warnings
warnings.filterwarnings("ignore") #忽略警告信息
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號
plt.rcParams['figure.dpi'] = 100 #分辨率from datetime import datetime
current_time = datetime.now() # 獲取當前時間epochs_range = range(epochs)plt.figure(figsize=(12, 3))
plt.subplot(1, 2, 1)plt.plot(epochs_range, train_acc, label='Training Accuracy')
plt.plot(epochs_range, test_acc, label='Test Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.xlabel(current_time) # 打卡請帶上時間戳,否則代碼截圖無效plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss, label='Training Loss')
plt.plot(epochs_range, test_loss, label='Test Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay# 計算混淆矩陣
cm = confusion_matrix(y_test, pred)plt.figure(figsize=(6,5))
plt.suptitle('')
sns.heatmap(cm, annot=True, fmt="d", cmap="Blues")# 修改字體大小
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.title("Confusion Matrix", fontsize=12)
plt.xlabel("Predicted Label", fontsize=10)
plt.ylabel("True Label", fontsize=10)# 顯示圖
plt.tight_layout() # 調整布局防止重疊
plt.show()
??
?
7.模型預測?
test_X = X_test[0].reshape(1, -1) # X_test[0]即我們的輸入數據pred = model(test_X.to(device)).argmax(1).item()
print("模型預測結果為:",pred)
print("=="*20)
print("0:未患病")
print("1:已患病")
?
?
8.總結:
代碼展示了如何使用PyTorch框架進行阿爾茨海默病數據集的分類任務。以下是該代碼的主要步驟和功能總結:
檢查GPU:首先,代碼檢查是否有可用的GPU,并設置相應的設備(cuda或cpu)。
查看數據:通過Pandas庫加載數據集,并刪除第一列和最后一列,這可能是為了去除非特征信息(如ID)或冗余信息。
劃分數據集:對數據進行預處理,包括標準化以及將數據劃分為訓練集和測試集。接著,使用PyTorch的DataLoader創建數據加載器以便于后續模型訓練時的數據批次處理。
創建模型與編譯訓練:定義了一個基于RNN的神經網絡模型model_rnn,包含RNN層和兩個全連接層。模型被移動到之前設定的設備(GPU或CPU)上。
編譯及訓練模型:定義了訓練和測試函數,分別用于執行模型的訓練過程和評估過程。采用交叉熵損失作為損失函數,Adam優化器作為優化算法。經過30個epoch的訓練后,記錄并打印出每個epoch的訓練和測試準確率及損失值。
結果可視化:使用Matplotlib繪制訓練和測試的準確率與損失的變化曲線圖,直觀地展示模型的學習效果。同時,還生成了混淆矩陣以進一步分析模型性能。
模型預測:最后,選取了一條測試數據進行模型預測,輸出預測結果,并解釋了預測結果的意義(是否患病)。