???♂? 個人主頁:@艾派森的個人主頁
???作者簡介:Python學習者
?? 希望大家多多支持,我們一起進步!??
如果文章對你有幫助的話,
歡迎評論 ??點贊???? 收藏 ??加關注+
目錄
實驗背景
實驗目的
實驗環(huán)境
實驗過程
1.加載數(shù)據(jù)
2.訓練模型
3.模型評估
源代碼
文末福利
?文章來源地址http://www.zghlxwxcb.cn/news/detail-530390.html
實驗背景
????????腦腫瘤是一種嚴重的疾病,對患者的生命和健康造成了威脅。在腦腫瘤的治療過程中,準確地識別和分類不同類型的腦腫瘤對于制定個性化的治療方案和預測患者的病情發(fā)展非常重要。
????????傳統(tǒng)的腦腫瘤分類方法通常依賴于醫(yī)學專家對影像學圖像的視覺解讀和分析,但這種方法受限于主觀性、經(jīng)驗依賴性和人力成本較高等問題。隨著深度學習技術(shù)的快速發(fā)展,特別是在計算機視覺領域的應用,基于深度學習的腦腫瘤圖片識別分類成為了一種有潛力的解決方案。深度學習模型,尤其是卷積神經(jīng)網(wǎng)絡(Convolutional Neural Networks,簡稱CNN),具備從大規(guī)模數(shù)據(jù)中自動學習特征和進行高度抽象的能力。這使得它們在圖像分類和分割任務中具有出色的表現(xiàn)。通過使用深度學習方法,可以將醫(yī)學影像圖像作為輸入,訓練一個分類器來自動識別和分類不同類型的腦腫瘤,從而為醫(yī)生提供輔助診斷和治療決策的依據(jù)?;谏疃葘W習的腦腫瘤圖片識別分類實驗具有重要的研究意義和應用前景。通過該實驗,可以評估深度學習模型在腦腫瘤分類任務中的準確性、魯棒性和可解釋性。同時,還可以探索不同深度學習架構(gòu)、數(shù)據(jù)增強技術(shù)和遷移學習方法對腦腫瘤分類性能的影響。這些研究成果有望為腦腫瘤的早期檢測、治療規(guī)劃和病情預測提供有力的支持,提高醫(yī)療診斷的精確性和效率,最終改善患者的治療結(jié)果和生存率。
實驗目的
????????本實驗旨在利用深度學習方法,特別是卷積神經(jīng)網(wǎng)絡(CNN),進行腦腫瘤圖片的識別和分類,以實現(xiàn)以下目標:
1.提高腦腫瘤識別的準確性:通過訓練深度學習模型,使其能夠準確地識別不同類型的腦腫瘤,包括惡性和良性腫瘤。通過提高準確性,可以輔助醫(yī)生進行更精確的診斷和制定個性化的治療方案。
2.探索深度學習模型的魯棒性:在面對不同的腦腫瘤圖像數(shù)據(jù)集時,評估深度學習模型的魯棒性和泛化能力。通過研究模型的魯棒性,可以提高在實際應用中的可靠性,并應對不同來源、不同質(zhì)量和不同噪聲水平的腦腫瘤圖像數(shù)據(jù)。
3.比較不同深度學習架構(gòu)的性能:嘗試使用不同的深度學習架構(gòu),如常見的卷積神經(jīng)網(wǎng)絡(CNN)模型和一些最新的架構(gòu),比較它們在腦腫瘤分類任務上的性能和效果。通過對比不同模型的表現(xiàn),可以確定最適合該任務的模型架構(gòu),為后續(xù)的研究和應用提供參考。
4.評估深度學習模型在臨床實踐中的應用價值:將深度學習模型應用到真實世界的腦腫瘤影像數(shù)據(jù)中,并與傳統(tǒng)的醫(yī)學影像診斷方法進行對比。通過評估深度學習模型在臨床實踐中的準確性和效率,可以為醫(yī)生提供輔助診斷的工具,并改善腦腫瘤患者的治療結(jié)果和預后。
實驗環(huán)境
Python3.9
Jupyter notebook
實驗過程
1.加載數(shù)據(jù)
首先導入本次實驗用到的第三方庫
定義數(shù)據(jù)集的路徑?
?
?計算該圖像數(shù)據(jù)集的均值和STD
創(chuàng)建數(shù)據(jù)加載器,為訓練和驗證數(shù)據(jù)集組合轉(zhuǎn)換
使用采樣器在訓練和驗證之間分割數(shù)據(jù)?
配置數(shù)據(jù)集定義加載器?
?
?將數(shù)據(jù)進行展示
2.訓練模型
訓練模型配置,初始化模型
開始訓練模型?
3.模型評估
繪制訓練和驗證損失
?繪制驗證精度圖
源代碼
import numpy as np
from pathlib import Path
import random
import torch
import torchvision
from torchvision import transforms
import tqdm
data_dir = Path("./brain_tumor_dataset")
list(data_dir.iterdir())
# 計算該圖像數(shù)據(jù)集的均值和STD
def calculate_dataset_mean(dataloader):
images, labels = next(iter(dataloader))
return images.mean([0,2,3])
def calculate_dataset_std(dataloader):
images, labels = next(iter(dataloader))
return images.std([0,2,3])
raw_dataset_transforms = transforms.Compose([
transforms.Resize(255),
transforms.CenterCrop(225),
transforms.ToTensor()
])
raw_dataset = torchvision.datasets.ImageFolder(root = str(data_dir), transform=raw_dataset_transforms)
raw_dataloader = torch.utils.data.DataLoader(raw_dataset, batch_size=len(raw_dataset))
print(f"mean = {calculate_dataset_mean(raw_dataloader)} and std = {calculate_dataset_std(raw_dataloader)}")
'''
創(chuàng)建數(shù)據(jù)加載器
為訓練和驗證數(shù)據(jù)集組合轉(zhuǎn)換
創(chuàng)建應用了適當轉(zhuǎn)換的數(shù)據(jù)集
使用數(shù)據(jù)集創(chuàng)建數(shù)據(jù)加載程序
'''
# 數(shù)據(jù)集配置
CLASSES = ["no","yes"]
NUMBER_OF_CLASSES = len(CLASSES)
SHUFFLE = True
VALIDATION_SIZE = 0.2
RESIZE = 64
# 為訓練和驗證數(shù)據(jù)集組合圖像轉(zhuǎn)換
normalize = transforms.Normalize(
mean=calculate_dataset_mean(raw_dataloader),
std=calculate_dataset_std(raw_dataloader),
)
training_transform = transforms.Compose([
transforms.RandomRotation(30),
transforms.Resize(RESIZE),
transforms.CenterCrop(RESIZE),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
normalize,
] )
validation_transform = transforms.Compose(
[transforms.Resize(RESIZE),
transforms.CenterCrop(RESIZE),
transforms.ToTensor(),
normalize,
])
# 創(chuàng)建數(shù)據(jù)集并應用相關轉(zhuǎn)換
training_dataset = torchvision.datasets.ImageFolder(
root = str(data_dir),
transform = training_transform,
)
validation_dataset = torchvision.datasets.ImageFolder(
root = str(data_dir),
transform = validation_transform
)
# 檢查數(shù)據(jù)集規(guī)范化
# 歸一化后,均值應接近0,std應接近1
normalized_dataloader = torch.utils.data.DataLoader(
validation_dataset,
batch_size=len(validation_dataset),
)
print(f"mean = {calculate_dataset_mean(normalized_dataloader)}",
f"std = {calculate_dataset_std(normalized_dataloader)}")
# 使用采樣器在訓練和驗證之間分割數(shù)據(jù)
split = int(np.floor(len(training_dataset) * VALIDATION_SIZE))
indices = list(range(len(training_dataset)))
if SHUFFLE:
random.shuffle(indices)
validation_indices, training_indices = indices[: split], indices[split :]
training_sampler = torch.utils.data.sampler.SubsetRandomSampler(training_indices)
validation_sampler = torch.utils.data.sampler.SubsetRandomSampler(validation_indices)
# 數(shù)據(jù)加載器配置
BATCH_SIZE = 4
NUMBER_OF_WORKERS = 2
PIN_MEMORY = False
# 創(chuàng)建數(shù)據(jù)加載器
training_dataloader = torch.utils.data.DataLoader(
training_dataset,
batch_size=BATCH_SIZE,
sampler=training_sampler,
num_workers=NUMBER_OF_WORKERS,
pin_memory=PIN_MEMORY,
)
validation_dataloader = torch.utils.data.DataLoader(
training_dataset,
batch_size=BATCH_SIZE,
sampler=validation_sampler,
num_workers=NUMBER_OF_WORKERS,
pin_memory=PIN_MEMORY,
)
import matplotlib.pyplot as plt
%matplotlib inline
# 展示圖片
for images, labels in training_dataloader:
fig = plt.figure(figsize = (14, 7))
for i in range(BATCH_SIZE):
ax = fig.add_subplot(2, 4, i + 1, xticks = [], yticks = [])
ax.set_xlabel(f"cancer = {CLASSES[labels[i]]}")
image = images[i][0, :, :]
plt.imshow(image)
break
# 訓練模型配置
MODEL_NAME = "resnet18"
WEIGHTS = "DEFAULT"
LEARNING_RATE = 0.0001
MOMENTUM = 0.9
NUMBER_OF_EPOCHS = 10
MODEL_SAVE_PATH = "model.pt"
# 初始化模型
model = torchvision.models.get_model(MODEL_NAME, weights=WEIGHTS)
model.fc = torch.nn.Linear(512, 2)
# 選擇一個損失函數(shù)和一個優(yōu)化函數(shù)
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=LEARNING_RATE, momentum=MOMENTUM)
# 開始訓練模型
# 存儲訓練過程狀態(tài)的地方
training_loss_history = []
validation_loss_history = []
validation_accuracy_history = []
# 訓練和驗證循環(huán)
for epoch in range(NUMBER_OF_EPOCHS):
model.train()
training_step_loss = []
print(f"Epoch {epoch + 1}/{NUMBER_OF_EPOCHS}")
for data in tqdm.tqdm(training_dataloader, desc="training"):
features, labels = data
optimizer.zero_grad()
outputs = model(features)
training_loss = criterion(outputs, labels)
training_loss.backward()
optimizer.step()
training_step_loss.append(training_loss.item())
training_epoch_loss = sum(training_step_loss)/len(training_step_loss)
training_loss_history.append(training_epoch_loss)
model.eval()
validation_step_loss = []
correct_predictions = 0
for data in tqdm.tqdm(validation_dataloader, desc="validating"):
features, labels = data
outputs = model(features)
correct_predictions += torch.sum(torch.argmax(outputs, axis=1)==labels)
validation_loss = criterion(outputs, labels)
validation_step_loss.append(validation_loss.item())
validation_epoch_loss = sum(validation_step_loss)/len(validation_step_loss)
validation_loss_history.append(validation_epoch_loss)
validation_epoch_accuracy = correct_predictions / (len(validation_dataloader) * BATCH_SIZE)
print(f"Training Loss: {training_epoch_loss:.4f},"
f"Validation Loss: {validation_epoch_loss:.4f},"
f"Validation Acc: {validation_epoch_accuracy:.4f}")
# 保存模型
if epoch==0 or validation_epoch_accuracy > max(validation_accuracy_history):
print("Validation loss improved, saving checkpoint.")
torch.save({
'epoch': epoch,
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'loss': validation_epoch_loss,
}, MODEL_SAVE_PATH)
print("Checkpoint saved")
validation_accuracy_history.append(validation_epoch_accuracy)
print('Finished Training')
# 繪制訓練和驗證損失
plt.plot(training_loss_history, label='training_loss')
plt.plot(validation_loss_history,label='validation_loss')
plt.legend()
plt.show
# 繪制驗證精度圖
plt.plot(validation_accuracy_history, label='validation accuracy')
plt.legend()
plt.show
文末福利
《人工智能與ChatGPT》免費包郵送出3本!
內(nèi)容簡介:
????????人們相信人工智能可以為這個時代的技術(shù)帶來突破,而ChatGPT則使這種希望成為現(xiàn)實?,F(xiàn)在,許多人都渴望了解與ChatGPT相關的一切,包括技術(shù)的歷史和背景,其神奇的功能以及如何使用它。雖然ChatGPT的使用方法很簡單,但它具有無限的潛力。如果不去親身體驗,很難體會到它的強大之處。本書盡可能全面地介紹了與ChatGPT相關的內(nèi)容,特別是許多應用示例,可以給讀者帶來啟發(fā)。
????????希望讀者通過這本書了解ChatGPT后,在自己的工作中也能充分利用它。本書適合希望了解和使用ChatGPT的人閱讀。
編輯推薦:
ChatGPT的背景:從大語言模型到GPT
ChatGPT的技術(shù):從Transformer模型到RLHF
ChatGPT的使用:從對話到OpanAI API
ChatGPT的應用:從編程到統(tǒng)計分析
ChatGPT的案例:從寫專利到出試卷
- 抽獎方式:評論區(qū)隨機抽取3位小伙伴免費送出!
- 參與方式:關注博主、點贊、收藏、評論區(qū)評論“人生苦短,拒絕內(nèi)卷!”(切記要點贊+收藏,否則抽獎無效,每個人最多評論三次!)
- 活動截止時間:2023-07-10?20:00:00
- 京東購買鏈接:https://item.jd.com/14049920.html
?名單公布時間:2023-07-10?21:00:00??
文章來源:http://www.zghlxwxcb.cn/news/detail-530390.html
?
到了這里,關于基于Pytorch深度學習的腦腫瘤分類識別(文末送書)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!