使用深度學習構(gòu)建腦腫瘤分類器
介紹
深度學習常常出現(xiàn)在我們的日常生活中。在現(xiàn)代社會中,我們的生活方式出現(xiàn)了各種變化,例如自動駕駛汽車、谷歌助理、Netflix 推薦、垃圾郵件檢測等等。同樣,深度學習在醫(yī)療保健領(lǐng)域也得到了發(fā)展,我們使用深度學習模型通過核磁共振掃描檢測腦腫瘤,使用肺部 X 射線檢測 covid 等。腦腫瘤是一種嚴重的疾病,每年記錄的病例超過 100 萬例。
如果一個人患有腦腫瘤,則使用核磁共振成像 (MRI) 掃描。腦瘤可以屬于任何類別,對這數(shù)百萬人進行核磁共振檢查以確定一個人是否患有這種疾病,如果是,他的類別是什么,這可能是一項艱巨的任務(wù)。這就是深度學習模型發(fā)揮重要作用的地方,它可以通過使用神經(jīng)網(wǎng)絡(luò)提供患者大腦的 MRI 圖像來判斷患者是否患有腦腫瘤。
我們將使用 CNN(卷積神經(jīng)網(wǎng)絡(luò))構(gòu)建腦腫瘤分類器,該分類器因其高精度而廣泛用于圖像分類領(lǐng)域。我們將使用的編程語言是python。
數(shù)據(jù)集概述
我們正在使用一個腦腫瘤圖像分類器數(shù)據(jù)集,該數(shù)據(jù)集有 7022 張人腦 MRI 圖像,分為訓練集和測試集,它們分為 4 類:
膠質(zhì)瘤(Glioma)
腦膜瘤 (Meningioma )
無腫瘤 (No tumor)
垂體(Pituitary)
這些圖像的像素大小為 512 x 512,并且每個圖像都有固定的標簽。
讓我們導入有助于我們對這些圖像進行分類的基本庫。
導入庫
我們將首先探索數(shù)據(jù)集并使用圖像數(shù)據(jù)生成器 ImageDataGenerator 對其進行預處理,我們將導入 Tensorflow。在 TensorFlow 中,我們將使用 Keras 庫。
import pandas as pd
import numpy as np
import tensorflow
from tensorflow import keras
import matplotlib.pyplot as plt
from keras.preprocessing.image import ImageDataGenerator as Imgen
圖像增強
當我們使用任何圖像數(shù)據(jù)集來訓練我們的模型時,有時它可能無法為我們提供準確的結(jié)果,因為其中的圖像可能需要一些預處理,例如縮放、增加亮度、更改灰度值等。
就像二進制數(shù)據(jù)需要一些數(shù)據(jù)清理和預處理一樣,圖像數(shù)據(jù)集也需要數(shù)據(jù)預處理。為此,本文使用了 Keras 庫中的圖像數(shù)據(jù)生成器。
它通過實時數(shù)據(jù)增強生成批量張量圖像數(shù)據(jù),例如調(diào)整所有圖像的大小,并調(diào)整它們的高度和寬度,從而使輸入的圖像數(shù)據(jù)是統(tǒng)一的。
Args rescale:(重新縮放因子)。默認為 None。否則,我們可以將數(shù)據(jù)乘以所提供的值。
Shear_range:剪切強度(以度為單位的逆時針方向的剪切角)
Zoom_range:隨機縮放的范圍
Height_shift_range : 總高度的分數(shù), if < 1
Width_shift_range : 總寬度的分數(shù), if < 1
Fill_mode:默認為“nearest”。根據(jù)給定的模式填充輸入邊界之外的點。
Validation_split: 保留用于驗證的圖像的一部分(在 0 和 1 之間)。
#Augmenting the training dataset
traingen = Imgen(
rescale=1./255,
shear_range= 0.2,
zoom_range = 0.3,
width_shift_range = 0.2,
height_shift_range =0.2,
fill_mode = "nearest",
validation_split=0.15)
#Augmenting the testing dataset
testgen = Imgen(# rescale the images to 1./255
rescale = 1./255
)
現(xiàn)在,我們將獲取目錄的路徑并生成批量增強數(shù)據(jù)。
trainds = traingen.flow_from_directory("Training/",
target_size = (130,130),
seed=123,
batch_size = 16,
subset="training"
)
valds = traingen.flow_from_directory("Training",
target_size = (130,130),
seed=123,
batch_size = 16,
subset="validation"
)
testds = testgen.flow_from_directory("Validation",
target_size = (130,130),
seed=123,
batch_size = 16,
shuffle=False)
這里使用的一些參數(shù)是,
Target_size:整數(shù)元組(height, width),默認為 (512, 512)。將調(diào)整所有圖像的尺寸。
nearest:用于打亂和轉(zhuǎn)換的可選隨機種子。
Batch_size:數(shù)據(jù)批次的大小(默認值:32)。**Subset **:數(shù)據(jù)子集(“training” or “validation”)。
Shuffle:是否打亂數(shù)據(jù)(默認值:True)如果設(shè)置為 False,則按字母數(shù)字順序?qū)?shù)據(jù)進行排序。
這一步將我們預處理的圖像數(shù)據(jù)集分為訓練集、驗證集和測試集,其中我們的圖像數(shù)據(jù)集分成訓練集和驗證集的比例為 80% - 20%,其中驗證數(shù)據(jù)集包含 20% 的訓練數(shù)據(jù)集。并且在測試集方面,數(shù)據(jù)集本身分為訓練集和測試集文件夾,因此無需明確劃分測試集。
驗證數(shù)據(jù)集在構(gòu)建深度學習模型以證實我們在訓練期間的模型性能時非常重要。這個過程對于稍后根據(jù)其性能調(diào)整我們的模型很重要。
識別我們數(shù)據(jù)集的類別:
c = trainds.class_indices
classes = list(c.keys())
classes
我們對數(shù)據(jù)進行了擴充,分為訓練集、驗證集和測試集,并且我們已經(jīng)確定了圖像數(shù)據(jù)集的四個類別。
現(xiàn)在讓我們可視化我們的圖像,這樣我們就可以看看圖像增強是如何執(zhí)行的,而且,我們還將使用我們的類來識別我們正在尋找的腦腫瘤類型。
x,y = next(trainds) #function returns the next item in an iterator.
def plotImages(x,y):
plt.figure(figsize=[15,11]) #size of the plot
for i in range(16): #16 images
plt.subplot(4,4,i+1) #4 by 4 plot
plt.imshow(x[i])#Imshow() is a function of matplotlib displays the image
plt.title(classes[np.a(chǎn)rgmax(y[i])]) # Class of the image will be it's title
plt.a(chǎn)xis("off")
plt.show()
現(xiàn)在我們將通過調(diào)用我們定義的函數(shù)來繪制我們的圖像。
#Call the plotImages function
plotImages(x,y)
它會給我們這樣的輸出,
現(xiàn)在,該項目最重要的一步是開始使用卷積神經(jīng)網(wǎng)絡(luò)創(chuàng)建深度學習模型。
構(gòu)建深度學習模型
神經(jīng)網(wǎng)絡(luò)因其準確性和無需明確編程即可檢測數(shù)據(jù)的能力而被廣泛用于幾乎所有深度學習項目。根據(jù)項目需要使用不同種類的神經(jīng)網(wǎng)絡(luò);例如,我們將使用人工神經(jīng)網(wǎng)絡(luò) (ANN) 處理整數(shù)數(shù)據(jù)。
CNN 廣泛用于對圖像數(shù)據(jù)進行分類。CNN 的主要優(yōu)點是它可以自動檢測任何圖像中的重要特征,而無需人工監(jiān)督。這可能就是為什么 CNN 會成為計算機視覺和圖像分類問題的完美解決方案。因此,特征提取對于 CNN 至關(guān)重要。
執(zhí)行的特征提取包括三個基本操作:
針對特定特征過濾圖像(卷積)
在過濾后的圖像中檢測該特征 (ReLU)
壓縮圖像以增強特征(最大池化)
讓我們討論一下CNN的每一個操作。
1. 卷積
卷積層執(zhí)行過濾步驟。ConvNet 在訓練期間學習的權(quán)重主要包含在其卷積層中。這些層稱為核。核通過掃描圖像并產(chǎn)生加權(quán)像素和來工作。
圖片來源:
不同類型的核為每個圖像產(chǎn)生不同的特征。
圖片來源:
2. 激活函數(shù)
這是神經(jīng)網(wǎng)絡(luò)中最重要的部分。激活函數(shù)根據(jù)它接收到的輸入來決定是否觸發(fā)一個特定的神經(jīng)元,并將其傳遞給下一層。整流線性單元或 ReLU 是最常用的激活函數(shù),因為它實現(xiàn)簡單,并且克服了由其他激活函數(shù)(如 Sigmoid)引起的許多其他障礙。
我們還在模型中使用了 Softmax 激活函數(shù),因為它用于對多類數(shù)據(jù)集進行分類。
3. 最大池化
Max Pooling 是一個卷積過程,其中核提取其覆蓋區(qū)域的最大值。像最大池化一樣,我們可以使用平均池化。函數(shù)映射中的 ReLU (Detect) 函數(shù)最終會出現(xiàn)很多“死區(qū)”,我們想壓縮函數(shù)映射以僅保留函數(shù)本身最有用的部分。
要構(gòu)建模型,讓我們首先導入創(chuàng)建模型所需的必要庫。
from keras.models import Sequential
from keras.layers import Dense, Flatten, Dropout, Conv2D, MaxPooling2D, Activation
from keras.metrics import categorical_crossentropy
from keras.optimizers import Adam
下面是CNN模型。
cnn = Sequential([
# first Layer
Conv2D(filters=16, kernel_size=(3, 3), padding = 'same', activation='relu', input_shape=(130, 130, 3)),
MaxPooling2D((2, 2)),
# second layer
Conv2D(filters=32, kernel_size=(3, 3), padding = 'same', activation='relu'),
MaxPooling2D((2, 2)),
Dropout(0.20),
Flatten(),
Dense(64, activation='relu'),
Dense(32, activation='relu'),
Dense(10, activation='relu'),
Dense(4, activation='softmax')
])
這里使用的一些基本術(shù)語是,
Dropout 層:該層用于任何隱藏層,但不能用于輸出層。該層主要用于防止我們模型的過度擬合。
Flatten 層:該層主要用于將多維輸入轉(zhuǎn)換為一維輸出。
Dense 層:每個神經(jīng)網(wǎng)絡(luò)相互連接的簡單神經(jīng)元層。
由于我們的輸出將包括神經(jīng)膠質(zhì)瘤、腦膜瘤、無腫瘤和垂體這四類,因此我們?yōu)檩敵鰧犹峁┝怂膫神經(jīng)元。
以下是創(chuàng)建模型的架構(gòu)。
cnn.summary()
Model: "sequential"
______________________________________
Layer (type) Output ShapeParam #
======================================
conv2d (Conv2D) (None, 130, 130, 16) 448
max_pooling2d (MaxPooling2D (None, 65, 65, 16) 0
)
conv2d_1 (Conv2D) (None, 65, 65, 32) 4640
max_pooling2d_1 (MaxPooling (None, 32, 32, 32) 0
2D)
dropout (Dropout) (None, 32, 32, 32) 0
flatten (Flatten) (None, 32768) 0
dense (Dense) (None, 64) 2097216
dense_1 (Dense) (None, 32) 2080
dense_2 (Dense) (None, 10) 330
dense_3 (Dense) (None, 4) 44
======================================
Total params: 2,104,758
Trainable params: 2,104,758
Non-trainable params: 0
______________________________________
編譯借助以下參數(shù)創(chuàng)建的模型,
cnn.compile(loss="categorical_crossentropy",
optimizer = "Adam",metrics=["accuracy"])
我們這里選擇的損失函數(shù)是分類交叉熵。在開發(fā)深度學習模型以測量預測輸出和實際輸出之間的差異時,損失函數(shù)是必不可少的,這樣神經(jīng)網(wǎng)絡(luò)就可以調(diào)整其權(quán)重以提高其準確性。當圖像要在許多類別中分類時,使用分類交叉熵。
神經(jīng)網(wǎng)絡(luò)中的優(yōu)化器主要用于調(diào)整神經(jīng)網(wǎng)絡(luò)的權(quán)重,提高模型的學習速度以減少損失。在這里,Adam 是最常用的優(yōu)化器。
讓我們將數(shù)據(jù)擬合到我們創(chuàng)建的 CNN 模型中。
history = cnn.fit(trainds,validation_data=valds,epochs=10, batch_size=16, verbose=1)
Epoch 1/10
304/304 [==============================] - 126s 413ms/step - loss: 0.5149 - accuracy: 0.7813 - val_loss: 0.6445 - val_accuracy: 0.7801
Epoch 2/10
304/304 [==============================] - 122s 400ms/step - loss: 0.3672 - accuracy: 0.8526 - val_loss: 0.6240 - val_accuracy: 0.7591
Epoch 3/10
304/304 [==============================] - 122s 401ms/step - loss: 0.2541 - accuracy: 0.9004 - val_loss: 0.6677 - val_accuracy: 0.7953
Epoch 4/10
304/304 [==============================] - 122s 399ms/step - loss: 0.1783 - accuracy: 0.9343 - val_loss: 0.6279 - val_accuracy: 0.8187
Epoch 5/10
304/304 [==============================] - 122s 400ms/step - loss: 0.1309 - accuracy: 0.9502 - val_loss: 0.6373 - val_accuracy: 0.8292
Epoch 6/10
304/304 [==============================] - 121s 399ms/step - loss: 0.1069 - accuracy: 0.9613 - val_loss: 0.7103 - val_accuracy: 0.8444
Epoch 7/10
304/304 [==============================] - 121s 399ms/step - loss: 0.0768 - accuracy: 0.9712 - val_loss: 0.6353 - val_accuracy: 0.8409
Epoch 8/10
304/304 [==============================] - 122s 400ms/step - loss: 0.0540 - accuracy: 0.9827 - val_loss: 0.6694 - val_accuracy: 0.8456
Epoch 9/10
304/304 [==============================] - 121s 399ms/step - loss: 0.0530 - accuracy: 0.9813 - val_loss: 0.7373 - val_accuracy: 0.8374
Epoch 10/10
304/304 [==============================] - 122s 399ms/step - loss: 0.0304 - accuracy: 0.9872 - val_loss: 0.7529 - val_accuracy: 0.8655
正如我們所見,我們提出的 CNN 模型在訓練數(shù)據(jù)上的準確率達到了 98%!在驗證數(shù)據(jù)上,我們獲得了超過 86% 的準確率,F(xiàn)在讓我們在測試數(shù)據(jù)集上評估這個模型。
cnn.evaluate(testds)
82/82 [==============================] - 9s 113ms/step - loss: 0.2257 - accuracy: 0.9458
正如我們所看到的,我們提出的 CNN 模型在測試數(shù)據(jù)上表現(xiàn)得非常好。在擬合模型時,我們在上面的代碼中將訓練數(shù)據(jù)聲明為“trainds”,并保持 epochs 為 10,這意味著我們的模型使用訓練數(shù)據(jù)訓練神經(jīng)網(wǎng)絡(luò)十次,并將 Verbose 設(shè)置為 1 ,以實時查看一個epoch后模型的擬合情況。
現(xiàn)在讓我們可視化我們的一些結(jié)果。
使用深度學習進行可視化
我們將在我們達到的準確度和 epoch 數(shù)之間繪制圖表,以了解我們的訓練和驗證準確度如何提高。
epochs = range(len(history.history['accuracy']))
plt.plot(epochs, history.history['accuracy'], 'green', label='Accuracy of Training Data')
plt.plot(epochs, history.history['val_accuracy'], 'red', label='Accuracy of Validation Data')
plt.xlabel('Total Epochs')
plt.ylabel('Accuracy achieved')
plt.title('Training and Validation Accuracy')
plt.legend(loc=0)
plt.figure()
通過這個圖表,我們可以假設(shè)我們的模型與訓練和驗證數(shù)據(jù)非常一致,F(xiàn)在我們將借助我們創(chuàng)建的模型對一些樣本圖像進行分類。
使用深度學習進行預測
為了借助我們的模型預測一些樣本圖像,我們首先需要導入該圖像,對該圖像執(zhí)行歸一化,并將其轉(zhuǎn)換為數(shù)組以進行平滑預測。
from matplotlib.pyplot import imshow
from PIL import Image, ImageOps
data = np.ndarray(shape=(1, 130, 130, 3), dtype=np.float32)
image = Image.open("image(2).jpg")
size = (130, 130)
image = ImageOps.fit(image, size, Image.ANTIALIAS)
image_array = np.a(chǎn)sarray(image)
display(image)
normalized_image_array = (image_array.a(chǎn)stype(np.float32) / 127.0) - 1
data[0] = normalized_image_array
在這里,我們使用了 matplotlib 的 imshow,它可以幫助我們顯示圖像,以及 Python Imaging Library (PIL),它處理所有類型的圖像操作。在 PIL 中,我們使用 ImageOps,這是一個用于多種成像和圖像預處理操作的模塊。
現(xiàn)在我們將使用我們的 CNN 模型預測上述圖像的類別,即腫瘤類型。
prediction = cnn.predict(data)
print(prediction)
predict_index = np.a(chǎn)rgmax(prediction)
print(predict_index)
1/1 [==============================] - 0s 142ms/step
[[0. 0. 1. 0.]]
2
確認我們的上述歸一化圖像屬于第二類,即沒有腫瘤,這是正確的答案。讓我們輸出這個答案。
print("There's {:.2f} percent probability that the person has No Tumor".format(prediction[0][2]*100))
There's 100.00 percent probability that the person has No Tumor
通過這種方式,我們可以肯定地說,我們的 CNN 模型能夠以最大的準確度有效地預測任何類型的腦腫瘤數(shù)據(jù)。你可以將上述任何腦腫瘤數(shù)據(jù)集用于給定的模型架構(gòu)。
結(jié)論
正如我們所見,技術(shù)如何極大地影響了我們的生活方式和文化。使用技術(shù)來改善我們的生活是它所能做的最好的事情。在醫(yī)療保健中使用深度學習是最佳選擇。與上述用于腦腫瘤分類的深度學習模型一樣,我們可以通過應(yīng)用某些修改在每個領(lǐng)域使用這些模型。
在本文中,我們學習了如何將 Tensorflow 和 Keras 用于這個深度學習模型和不同的技術(shù)來幫助提高我們的準確性,并且還進行了數(shù)據(jù)可視化。
原文標題 : 使用深度學習構(gòu)建腦腫瘤分類器

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀”爆發(fā)至今,五類新物種登上歷史舞臺
- 5 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計算迎來商業(yè)化突破,但落地仍需時間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機器人東風翻身?