使用深度學(xué)習(xí)構(gòu)建腦腫瘤分類器
介紹
深度學(xué)習(xí)常常出現(xiàn)在我們的日常生活中。在現(xiàn)代社會(huì)中,我們的生活方式出現(xiàn)了各種變化,例如自動(dòng)駕駛汽車、谷歌助理、Netflix 推薦、垃圾郵件檢測等等。同樣,深度學(xué)習(xí)在醫(yī)療保健領(lǐng)域也得到了發(fā)展,我們使用深度學(xué)習(xí)模型通過核磁共振掃描檢測腦腫瘤,使用肺部 X 射線檢測 covid 等。腦腫瘤是一種嚴(yán)重的疾病,每年記錄的病例超過 100 萬例。
如果一個(gè)人患有腦腫瘤,則使用核磁共振成像 (MRI) 掃描。腦瘤可以屬于任何類別,對這數(shù)百萬人進(jìn)行核磁共振檢查以確定一個(gè)人是否患有這種疾病,如果是,他的類別是什么,這可能是一項(xiàng)艱巨的任務(wù)。這就是深度學(xué)習(xí)模型發(fā)揮重要作用的地方,它可以通過使用神經(jīng)網(wǎng)絡(luò)提供患者大腦的 MRI 圖像來判斷患者是否患有腦腫瘤。
我們將使用 CNN(卷積神經(jīng)網(wǎng)絡(luò))構(gòu)建腦腫瘤分類器,該分類器因其高精度而廣泛用于圖像分類領(lǐng)域。我們將使用的編程語言是python。
數(shù)據(jù)集概述
我們正在使用一個(gè)腦腫瘤圖像分類器數(shù)據(jù)集,該數(shù)據(jù)集有 7022 張人腦 MRI 圖像,分為訓(xùn)練集和測試集,它們分為 4 類:
膠質(zhì)瘤(Glioma)
腦膜瘤 (Meningioma )
無腫瘤 (No tumor)
垂體(Pituitary)
這些圖像的像素大小為 512 x 512,并且每個(gè)圖像都有固定的標(biāo)簽。
讓我們導(dǎo)入有助于我們對這些圖像進(jìn)行分類的基本庫。
導(dǎo)入庫
我們將首先探索數(shù)據(jù)集并使用圖像數(shù)據(jù)生成器 ImageDataGenerator 對其進(jìn)行預(yù)處理,我們將導(dǎo)入 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
圖像增強(qiáng)
當(dāng)我們使用任何圖像數(shù)據(jù)集來訓(xùn)練我們的模型時(shí),有時(shí)它可能無法為我們提供準(zhǔn)確的結(jié)果,因?yàn)槠渲械膱D像可能需要一些預(yù)處理,例如縮放、增加亮度、更改灰度值等。
就像二進(jìn)制數(shù)據(jù)需要一些數(shù)據(jù)清理和預(yù)處理一樣,圖像數(shù)據(jù)集也需要數(shù)據(jù)預(yù)處理。為此,本文使用了 Keras 庫中的圖像數(shù)據(jù)生成器。
它通過實(shí)時(shí)數(shù)據(jù)增強(qiáng)生成批量張量圖像數(shù)據(jù),例如調(diào)整所有圖像的大小,并調(diào)整它們的高度和寬度,從而使輸入的圖像數(shù)據(jù)是統(tǒng)一的。
Args rescale:(重新縮放因子)。默認(rèn)為 None。否則,我們可以將數(shù)據(jù)乘以所提供的值。
Shear_range:剪切強(qiáng)度(以度為單位的逆時(shí)針方向的剪切角)
Zoom_range:隨機(jī)縮放的范圍
Height_shift_range : 總高度的分?jǐn)?shù), if < 1
Width_shift_range : 總寬度的分?jǐn)?shù), if < 1
Fill_mode:默認(rèn)為“nearest”。根據(jù)給定的模式填充輸入邊界之外的點(diǎn)。
Validation_split: 保留用于驗(yàn)證的圖像的一部分(在 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)在,我們將獲取目錄的路徑并生成批量增強(qiáng)數(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),默認(rèn)為 (512, 512)。將調(diào)整所有圖像的尺寸。
nearest:用于打亂和轉(zhuǎn)換的可選隨機(jī)種子。
Batch_size:數(shù)據(jù)批次的大。J(rèn)值:32)。**Subset **:數(shù)據(jù)子集(“training” or “validation”)。
Shuffle:是否打亂數(shù)據(jù)(默認(rèn)值:True)如果設(shè)置為 False,則按字母數(shù)字順序?qū)?shù)據(jù)進(jìn)行排序。
這一步將我們預(yù)處理的圖像數(shù)據(jù)集分為訓(xùn)練集、驗(yàn)證集和測試集,其中我們的圖像數(shù)據(jù)集分成訓(xùn)練集和驗(yàn)證集的比例為 80% - 20%,其中驗(yàn)證數(shù)據(jù)集包含 20% 的訓(xùn)練數(shù)據(jù)集。并且在測試集方面,數(shù)據(jù)集本身分為訓(xùn)練集和測試集文件夾,因此無需明確劃分測試集。
驗(yàn)證數(shù)據(jù)集在構(gòu)建深度學(xué)習(xí)模型以證實(shí)我們在訓(xùn)練期間的模型性能時(shí)非常重要。這個(gè)過程對于稍后根據(jù)其性能調(diào)整我們的模型很重要。
識(shí)別我們數(shù)據(jù)集的類別:
c = trainds.class_indices
classes = list(c.keys())
classes
我們對數(shù)據(jù)進(jìn)行了擴(kuò)充,分為訓(xùn)練集、驗(yàn)證集和測試集,并且我們已經(jīng)確定了圖像數(shù)據(jù)集的四個(gè)類別。
現(xiàn)在讓我們可視化我們的圖像,這樣我們就可以看看圖像增強(qiáng)是如何執(zhí)行的,而且,我們還將使用我們的類來識(shí)別我們正在尋找的腦腫瘤類型。
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)
它會(huì)給我們這樣的輸出,
現(xiàn)在,該項(xiàng)目最重要的一步是開始使用卷積神經(jīng)網(wǎng)絡(luò)創(chuàng)建深度學(xué)習(xí)模型。
構(gòu)建深度學(xué)習(xí)模型
神經(jīng)網(wǎng)絡(luò)因其準(zhǔn)確性和無需明確編程即可檢測數(shù)據(jù)的能力而被廣泛用于幾乎所有深度學(xué)習(xí)項(xiàng)目。根據(jù)項(xiàng)目需要使用不同種類的神經(jīng)網(wǎng)絡(luò);例如,我們將使用人工神經(jīng)網(wǎng)絡(luò) (ANN) 處理整數(shù)數(shù)據(jù)。
CNN 廣泛用于對圖像數(shù)據(jù)進(jìn)行分類。CNN 的主要優(yōu)點(diǎn)是它可以自動(dòng)檢測任何圖像中的重要特征,而無需人工監(jiān)督。這可能就是為什么 CNN 會(huì)成為計(jì)算機(jī)視覺和圖像分類問題的完美解決方案。因此,特征提取對于 CNN 至關(guān)重要。
執(zhí)行的特征提取包括三個(gè)基本操作:
針對特定特征過濾圖像(卷積)
在過濾后的圖像中檢測該特征 (ReLU)
壓縮圖像以增強(qiáng)特征(最大池化)
讓我們討論一下CNN的每一個(gè)操作。
1. 卷積
卷積層執(zhí)行過濾步驟。ConvNet 在訓(xùn)練期間學(xué)習(xí)的權(quán)重主要包含在其卷積層中。這些層稱為核。核通過掃描圖像并產(chǎn)生加權(quán)像素和來工作。
圖片來源:
不同類型的核為每個(gè)圖像產(chǎn)生不同的特征。
圖片來源:
2. 激活函數(shù)
這是神經(jīng)網(wǎng)絡(luò)中最重要的部分。激活函數(shù)根據(jù)它接收到的輸入來決定是否觸發(fā)一個(gè)特定的神經(jīng)元,并將其傳遞給下一層。整流線性單元或 ReLU 是最常用的激活函數(shù),因?yàn)樗鼘?shí)現(xiàn)簡單,并且克服了由其他激活函數(shù)(如 Sigmoid)引起的許多其他障礙。
我們還在模型中使用了 Softmax 激活函數(shù),因?yàn)樗糜趯Χ囝悢?shù)據(jù)集進(jìn)行分類。
3. 最大池化
Max Pooling 是一個(gè)卷積過程,其中核提取其覆蓋區(qū)域的最大值。像最大池化一樣,我們可以使用平均池化。函數(shù)映射中的 ReLU (Detect) 函數(shù)最終會(huì)出現(xiàn)很多“死區(qū)”,我們想壓縮函數(shù)映射以僅保留函數(shù)本身最有用的部分。
要構(gòu)建模型,讓我們首先導(dǎo)入創(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 層:每個(gè)神經(jīng)網(wǎng)絡(luò)相互連接的簡單神經(jīng)元層。
由于我們的輸出將包括神經(jīng)膠質(zhì)瘤、腦膜瘤、無腫瘤和垂體這四類,因此我們?yōu)檩敵鰧犹峁┝怂膫(gè)神經(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ā)深度學(xué)習(xí)模型以測量預(yù)測輸出和實(shí)際輸出之間的差異時(shí),損失函數(shù)是必不可少的,這樣神經(jīng)網(wǎng)絡(luò)就可以調(diào)整其權(quán)重以提高其準(zhǔn)確性。當(dāng)圖像要在許多類別中分類時(shí),使用分類交叉熵。
神經(jīng)網(wǎng)絡(luò)中的優(yōu)化器主要用于調(diào)整神經(jīng)網(wǎng)絡(luò)的權(quán)重,提高模型的學(xué)習(xí)速度以減少損失。在這里,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 模型在訓(xùn)練數(shù)據(jù)上的準(zhǔn)確率達(dá)到了 98%!在驗(yàn)證數(shù)據(jù)上,我們獲得了超過 86% 的準(zhǔn)確率,F(xiàn)在讓我們在測試數(shù)據(jù)集上評估這個(gè)模型。
cnn.evaluate(testds)
82/82 [==============================] - 9s 113ms/step - loss: 0.2257 - accuracy: 0.9458
正如我們所看到的,我們提出的 CNN 模型在測試數(shù)據(jù)上表現(xiàn)得非常好。在擬合模型時(shí),我們在上面的代碼中將訓(xùn)練數(shù)據(jù)聲明為“trainds”,并保持 epochs 為 10,這意味著我們的模型使用訓(xùn)練數(shù)據(jù)訓(xùn)練神經(jīng)網(wǎng)絡(luò)十次,并將 Verbose 設(shè)置為 1 ,以實(shí)時(shí)查看一個(gè)epoch后模型的擬合情況。
現(xiàn)在讓我們可視化我們的一些結(jié)果。
使用深度學(xué)習(xí)進(jìn)行可視化
我們將在我們達(dá)到的準(zhǔn)確度和 epoch 數(shù)之間繪制圖表,以了解我們的訓(xùn)練和驗(yàn)證準(zhǔn)確度如何提高。
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()
通過這個(gè)圖表,我們可以假設(shè)我們的模型與訓(xùn)練和驗(yàn)證數(shù)據(jù)非常一致,F(xiàn)在我們將借助我們創(chuàng)建的模型對一些樣本圖像進(jìn)行分類。
使用深度學(xué)習(xí)進(jìn)行預(yù)測
為了借助我們的模型預(yù)測一些樣本圖像,我們首先需要導(dǎo)入該圖像,對該圖像執(zhí)行歸一化,并將其轉(zhuǎn)換為數(shù)組以進(jìn)行平滑預(yù)測。
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,這是一個(gè)用于多種成像和圖像預(yù)處理操作的模塊。
現(xiàn)在我們將使用我們的 CNN 模型預(yù)測上述圖像的類別,即腫瘤類型。
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
確認(rèn)我們的上述歸一化圖像屬于第二類,即沒有腫瘤,這是正確的答案。讓我們輸出這個(gè)答案。
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 模型能夠以最大的準(zhǔn)確度有效地預(yù)測任何類型的腦腫瘤數(shù)據(jù)。你可以將上述任何腦腫瘤數(shù)據(jù)集用于給定的模型架構(gòu)。
結(jié)論
正如我們所見,技術(shù)如何極大地影響了我們的生活方式和文化。使用技術(shù)來改善我們的生活是它所能做的最好的事情。在醫(yī)療保健中使用深度學(xué)習(xí)是最佳選擇。與上述用于腦腫瘤分類的深度學(xué)習(xí)模型一樣,我們可以通過應(yīng)用某些修改在每個(gè)領(lǐng)域使用這些模型。
在本文中,我們學(xué)習(xí)了如何將 Tensorflow 和 Keras 用于這個(gè)深度學(xué)習(xí)模型和不同的技術(shù)來幫助提高我們的準(zhǔn)確性,并且還進(jìn)行了數(shù)據(jù)可視化。
原文標(biāo)題 : 使用深度學(xué)習(xí)構(gòu)建腦腫瘤分類器

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評 >> 【評選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評選
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺(tái)
- 5 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?