使用深度學(xué)習(xí)構(gòu)建腦腫瘤分類器
介紹
深度學(xué)習(xí)常常出現(xiàn)在我們的日常生活中。在現(xiàn)代社會(huì)中,我們的生活方式出現(xiàn)了各種變化,例如自動(dòng)駕駛汽車、谷歌助理、Netflix 推薦、垃圾郵件檢測(cè)等等。同樣,深度學(xué)習(xí)在醫(yī)療保健領(lǐng)域也得到了發(fā)展,我們使用深度學(xué)習(xí)模型通過(guò)核磁共振掃描檢測(cè)腦腫瘤,使用肺部 X 射線檢測(cè) covid 等。腦腫瘤是一種嚴(yán)重的疾病,每年記錄的病例超過(guò) 100 萬(wàn)例。
如果一個(gè)人患有腦腫瘤,則使用核磁共振成像 (MRI) 掃描。腦瘤可以屬于任何類別,對(duì)這數(shù)百萬(wàn)人進(jìn)行核磁共振檢查以確定一個(gè)人是否患有這種疾病,如果是,他的類別是什么,這可能是一項(xiàng)艱巨的任務(wù)。這就是深度學(xué)習(xí)模型發(fā)揮重要作用的地方,它可以通過(guò)使用神經(jīng)網(wǎng)絡(luò)提供患者大腦的 MRI 圖像來(lái)判斷患者是否患有腦腫瘤。
我們將使用 CNN(卷積神經(jīng)網(wǎng)絡(luò))構(gòu)建腦腫瘤分類器,該分類器因其高精度而廣泛用于圖像分類領(lǐng)域。我們將使用的編程語(yǔ)言是python。
數(shù)據(jù)集概述
我們正在使用一個(gè)腦腫瘤圖像分類器數(shù)據(jù)集,該數(shù)據(jù)集有 7022 張人腦 MRI 圖像,分為訓(xùn)練集和測(cè)試集,它們分為 4 類:
膠質(zhì)瘤(Glioma)
腦膜瘤 (Meningioma )
無(wú)腫瘤 (No tumor)
垂體(Pituitary)
這些圖像的像素大小為 512 x 512,并且每個(gè)圖像都有固定的標(biāo)簽。
讓我們導(dǎo)入有助于我們對(duì)這些圖像進(jìn)行分類的基本庫(kù)。
導(dǎo)入庫(kù)
我們將首先探索數(shù)據(jù)集并使用圖像數(shù)據(jù)生成器 ImageDataGenerator 對(duì)其進(jìn)行預(yù)處理,我們將導(dǎo)入 Tensorflow。在 TensorFlow 中,我們將使用 Keras 庫(kù)。
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ù)集來(lái)訓(xùn)練我們的模型時(shí),有時(shí)它可能無(wú)法為我們提供準(zhǔn)確的結(jié)果,因?yàn)槠渲械膱D像可能需要一些預(yù)處理,例如縮放、增加亮度、更改灰度值等。
就像二進(jìn)制數(shù)據(jù)需要一些數(shù)據(jù)清理和預(yù)處理一樣,圖像數(shù)據(jù)集也需要數(shù)據(jù)預(yù)處理。為此,本文使用了 Keras 庫(kù)中的圖像數(shù)據(jù)生成器。
它通過(guò)實(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í)針?lè)较虻募羟薪牵?/p>
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)證集和測(cè)試集,其中我們的圖像數(shù)據(jù)集分成訓(xùn)練集和驗(yàn)證集的比例為 80% - 20%,其中驗(yàn)證數(shù)據(jù)集包含 20% 的訓(xùn)練數(shù)據(jù)集。并且在測(cè)試集方面,數(shù)據(jù)集本身分為訓(xùn)練集和測(cè)試集文件夾,因此無(wú)需明確劃分測(cè)試集。
驗(yàn)證數(shù)據(jù)集在構(gòu)建深度學(xué)習(xí)模型以證實(shí)我們?cè)谟?xùn)練期間的模型性能時(shí)非常重要。這個(gè)過(guò)程對(duì)于稍后根據(jù)其性能調(diào)整我們的模型很重要。
識(shí)別我們數(shù)據(jù)集的類別:
c = trainds.class_indices
classes = list(c.keys())
classes
我們對(duì)數(shù)據(jù)進(jìn)行了擴(kuò)充,分為訓(xùn)練集、驗(yàn)證集和測(cè)試集,并且我們已經(jīng)確定了圖像數(shù)據(jù)集的四個(gè)類別。
現(xiàn)在讓我們可視化我們的圖像,這樣我們就可以看看圖像增強(qiáng)是如何執(zhí)行的,而且,我們還將使用我們的類來(lái)識(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)在我們將通過(guò)調(diào)用我們定義的函數(shù)來(lái)繪制我們的圖像。
#Call the plotImages function
plotImages(x,y)
它會(huì)給我們這樣的輸出,
現(xiàn)在,該項(xiàng)目最重要的一步是開(kāi)始使用卷積神經(jīng)網(wǎng)絡(luò)創(chuàng)建深度學(xué)習(xí)模型。
構(gòu)建深度學(xué)習(xí)模型
神經(jīng)網(wǎng)絡(luò)因其準(zhǔn)確性和無(wú)需明確編程即可檢測(cè)數(shù)據(jù)的能力而被廣泛用于幾乎所有深度學(xué)習(xí)項(xiàng)目。根據(jù)項(xiàng)目需要使用不同種類的神經(jīng)網(wǎng)絡(luò);例如,我們將使用人工神經(jīng)網(wǎng)絡(luò) (ANN) 處理整數(shù)數(shù)據(jù)。
CNN 廣泛用于對(duì)圖像數(shù)據(jù)進(jìn)行分類。CNN 的主要優(yōu)點(diǎn)是它可以自動(dòng)檢測(cè)任何圖像中的重要特征,而無(wú)需人工監(jiān)督。這可能就是為什么 CNN 會(huì)成為計(jì)算機(jī)視覺(jué)和圖像分類問(wèn)題的完美解決方案。因此,特征提取對(duì)于 CNN 至關(guān)重要。
執(zhí)行的特征提取包括三個(gè)基本操作:
針對(duì)特定特征過(guò)濾圖像(卷積)
在過(guò)濾后的圖像中檢測(cè)該特征 (ReLU)
壓縮圖像以增強(qiáng)特征(最大池化)
讓我們討論一下CNN的每一個(gè)操作。
1. 卷積
卷積層執(zhí)行過(guò)濾步驟。ConvNet 在訓(xùn)練期間學(xué)習(xí)的權(quán)重主要包含在其卷積層中。這些層稱為核。核通過(guò)掃描圖像并產(chǎn)生加權(quán)像素和來(lái)工作。
圖片來(lái)源:
不同類型的核為每個(gè)圖像產(chǎn)生不同的特征。
圖片來(lái)源:
2. 激活函數(shù)
這是神經(jīng)網(wǎng)絡(luò)中最重要的部分。激活函數(shù)根據(jù)它接收到的輸入來(lái)決定是否觸發(fā)一個(gè)特定的神經(jīng)元,并將其傳遞給下一層。整流線性單元或 ReLU 是最常用的激活函數(shù),因?yàn)樗鼘?shí)現(xiàn)簡(jiǎn)單,并且克服了由其他激活函數(shù)(如 Sigmoid)引起的許多其他障礙。
我們還在模型中使用了 Softmax 激活函數(shù),因?yàn)樗糜趯?duì)多類數(shù)據(jù)集進(jìn)行分類。
3. 最大池化
Max Pooling 是一個(gè)卷積過(guò)程,其中核提取其覆蓋區(qū)域的最大值。像最大池化一樣,我們可以使用平均池化。函數(shù)映射中的 ReLU (Detect) 函數(shù)最終會(huì)出現(xiàn)很多“死區(qū)”,我們想壓縮函數(shù)映射以僅保留函數(shù)本身最有用的部分。
要構(gòu)建模型,讓我們首先導(dǎo)入創(chuàng)建模型所需的必要庫(kù)。
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ù)語(yǔ)是,
Dropout 層:該層用于任何隱藏層,但不能用于輸出層。該層主要用于防止我們模型的過(guò)度擬合。
Flatten 層:該層主要用于將多維輸入轉(zhuǎn)換為一維輸出。
Dense 層:每個(gè)神經(jīng)網(wǎng)絡(luò)相互連接的簡(jiǎn)單神經(jīng)元層。
由于我們的輸出將包括神經(jīng)膠質(zhì)瘤、腦膜瘤、無(wú)腫瘤和垂體這四類,因此我們?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ù)是分類交叉熵。在開(kāi)發(fā)深度學(xué)習(xí)模型以測(cè)量預(yù)測(cè)輸出和實(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
正如我們所見(jiàn),我們提出的 CNN 模型在訓(xùn)練數(shù)據(jù)上的準(zhǔn)確率達(dá)到了 98%!在驗(yàn)證數(shù)據(jù)上,我們獲得了超過(guò) 86% 的準(zhǔn)確率,F(xiàn)在讓我們?cè)跍y(cè)試數(shù)據(jù)集上評(píng)估這個(gè)模型。
cnn.evaluate(testds)
82/82 [==============================] - 9s 113ms/step - loss: 0.2257 - accuracy: 0.9458
正如我們所看到的,我們提出的 CNN 模型在測(cè)試數(shù)據(jù)上表現(xiàn)得非常好。在擬合模型時(shí),我們?cè)谏厦娴拇a中將訓(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()
通過(guò)這個(gè)圖表,我們可以假設(shè)我們的模型與訓(xùn)練和驗(yàn)證數(shù)據(jù)非常一致。現(xiàn)在我們將借助我們創(chuàng)建的模型對(duì)一些樣本圖像進(jìn)行分類。
使用深度學(xué)習(xí)進(jìn)行預(yù)測(cè)
為了借助我們的模型預(yù)測(cè)一些樣本圖像,我們首先需要導(dǎo)入該圖像,對(duì)該圖像執(zhí)行歸一化,并將其轉(zhuǎn)換為數(shù)組以進(jìn)行平滑預(yù)測(cè)。
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ù)測(cè)上述圖像的類別,即腫瘤類型。
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)我們的上述歸一化圖像屬于第二類,即沒(méi)有腫瘤,這是正確的答案。讓我們輸出這個(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
通過(guò)這種方式,我們可以肯定地說(shuō),我們的 CNN 模型能夠以最大的準(zhǔn)確度有效地預(yù)測(cè)任何類型的腦腫瘤數(shù)據(jù)。你可以將上述任何腦腫瘤數(shù)據(jù)集用于給定的模型架構(gòu)。
結(jié)論
正如我們所見(jiàn),技術(shù)如何極大地影響了我們的生活方式和文化。使用技術(shù)來(lái)改善我們的生活是它所能做的最好的事情。在醫(yī)療保健中使用深度學(xué)習(xí)是最佳選擇。與上述用于腦腫瘤分類的深度學(xué)習(xí)模型一樣,我們可以通過(guò)應(yīng)用某些修改在每個(gè)領(lǐng)域使用這些模型。
在本文中,我們學(xué)習(xí)了如何將 Tensorflow 和 Keras 用于這個(gè)深度學(xué)習(xí)模型和不同的技術(shù)來(lái)幫助提高我們的準(zhǔn)確性,并且還進(jìn)行了數(shù)據(jù)可視化。
原文標(biāo)題 : 使用深度學(xué)習(xí)構(gòu)建腦腫瘤分類器
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 1 【一周車話】沒(méi)有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車,還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 8 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類何去何從?
- 10 Open AI融資后成萬(wàn)億獨(dú)角獸,AI人才之爭(zhēng)開(kāi)啟
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市