訂閱
糾錯(cuò)
加入自媒體

使用深度學(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)源:

image.png

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

圖片來(lái)源:

image.png

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

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

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

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

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