訂閱
糾錯
加入自媒體

使用深度學習構(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)像素和來工作。

圖片來源:

image.png

不同類型的核為每個圖像產(chǎn)生不同的特征。

圖片來源:

image.png

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)建腦腫瘤分類器

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號