【深度学习】实战深度学习检测疟疾
作者 | Tommy
編譯 | VK
來(lái)源 | Towards Data Science
在這個(gè)項(xiàng)目中,我們將通過(guò)美國(guó)國(guó)立衛(wèi)生研究院提供的一個(gè)數(shù)據(jù)集,從150名感染了惡性瘧原蟲(chóng)寄生蟲(chóng)的患者身上獲取27558張不同的細(xì)胞圖像,并與50名健康患者的細(xì)胞圖像混合,這些圖像可以通過(guò)這里的鏈接下載:
https://www.kaggle.com/iarunava/cell-images-for-detecting-malaria
我們的任務(wù)是建立一個(gè)機(jī)器學(xué)習(xí)/深度學(xué)習(xí)算法,能夠?qū)z測(cè)到的細(xì)胞是否被寄生蟲(chóng)感染進(jìn)行分類(lèi)。
在這個(gè)項(xiàng)目中,我們將使用一種深度學(xué)習(xí)算法,即卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)算法,它通過(guò)訓(xùn)練來(lái)分類(lèi)某個(gè)細(xì)胞的圖像是否被感染。由于這是一個(gè)超過(guò)330mb數(shù)據(jù)的大項(xiàng)目,我建議將其應(yīng)用到j(luò)upiter Notebook中。
首先,我們需要導(dǎo)入必要的起始庫(kù):
import?pandas?as?pd import?numpy?as?np import?os import?cv2 import?random你之前可能使用panda.read_csv()導(dǎo)入csv格式的數(shù)據(jù)集,但是,由于所有數(shù)據(jù)都是png格式的,因此可能需要使用os和cv2庫(kù)以不同的方式導(dǎo)入它們。
OS是一個(gè)強(qiáng)大的Python庫(kù),允許你與操作系統(tǒng)進(jìn)行交互,無(wú)論操作系統(tǒng)是Windows、Mac OS還是Linux。
另一方面,cv2是一個(gè)專(zhuān)門(mén)設(shè)計(jì)用于解決各種計(jì)算機(jī)視覺(jué)問(wèn)題,如讀取和加載圖像。
首先,我們需要設(shè)置一個(gè)變量來(lái)設(shè)置我們的路徑,因?yàn)槲覀円院髸?huì)繼續(xù)使用它:
root?=?'../Malaria/cell_images/' in?=?'/Parasitized/' un?=?'/Uninfected/'因此,從上面的路徑是名為“瘧疾(Malaria)”的文件夾是我的細(xì)胞圖像文件夾文件存儲(chǔ)的地方,這也是寄生和未感染細(xì)胞的圖像存儲(chǔ)的地方。這樣,我們就能更容易地操縱這些路徑。
現(xiàn)在讓我們操作系統(tǒng)列表目錄(“path”)函數(shù)列出被寄生和未受感染文件夾中的所有圖像,如下所示:
Parasitized?=?os.listdir(root+in) Uninfected?=?os.listdir(root+un)使用OpenCV和Matplotlib顯示圖像
例如,與csv文件不同,我們只能使用pandas的函數(shù)head列出多個(gè)數(shù)據(jù),df.head(10) 顯示10行數(shù)據(jù),對(duì)于圖像,我們需要使用for循環(huán)和matplotlib庫(kù)來(lái)顯示數(shù)據(jù)。
因此,首先讓我們導(dǎo)入matplotlib并為每個(gè)寄生和未感染的細(xì)胞圖像繪制圖像,如下所示:
import?matplotlib.pyplot?as?plt然后繪制圖像:
plt.figure(figsize?=?(12,24)) for?i?in?range(4):plt.subplot(1,?4,?i+1)img?=?cv2.imread(root+in+?Parasitized[i])plt.imshow(img)plt.title('PARASITIZED?:?1')plt.tight_layout() plt.show()plt.figure(figsize?=?(12,24)) for?i?in?range(4):plt.subplot(2,?4,?i+1)img?=?cv2.imread(root+un+?Uninfected[i+1])plt.imshow(img)plt.title('UNINFECTED?:?0')plt.tight_layout() plt.show()因此,為了繪制圖像,我們需要matplotlib中的figure函數(shù),然后我們需要根據(jù)figsize函數(shù)確定每個(gè)圖形的大小。
如上所示,其中第一個(gè)數(shù)字是寬度,第二個(gè)數(shù)字是高度。然后在for循環(huán)中,我們將使用i作為變量來(lái)迭代range()中指示的次數(shù)。
在本例中,我們將只顯示4個(gè)圖像。隨后,我們將使用library中的subplot函數(shù)來(lái)指示某個(gè)迭代的行數(shù)、列數(shù)和繪圖數(shù),我們使用i+1來(lái)實(shí)現(xiàn)。
由于我們已經(jīng)創(chuàng)建了子圖,但是子圖仍然是空的,因此,我們需要使用OpenCV庫(kù),通過(guò)使用cv2.imread()函數(shù)導(dǎo)入圖像,并包括其中的路徑和變量i,這樣它將繼續(xù)循環(huán)到下一張圖片,直到提供的最大范圍為止。
最后,我們將cv2庫(kù)導(dǎo)入的圖像用plt.imshow()函數(shù)繪出,我們將獲得以下輸出:
將圖像和標(biāo)簽分配到變量中
接下來(lái),我們要將所有圖像(無(wú)論是寄生細(xì)胞圖像還是未感染細(xì)胞圖像)及其標(biāo)簽插入到一個(gè)變量中,其中1表示寄生細(xì)胞,0表示未感染細(xì)胞。因此,首先,我們需要為圖像和標(biāo)簽創(chuàng)建一個(gè)空變量。但在此之前,我們需要使用Keras的img_to_array()函數(shù)。
假設(shè)存儲(chǔ)圖像的變量稱(chēng)為data,存儲(chǔ)標(biāo)簽的變量稱(chēng)為labels,那么我們可以執(zhí)行以下代碼:
data?=?[] labels?=?[]for?img?in?Parasitized:try:img_read?=?plt.imread(root+in+?img)img_resize?=?cv2.resize(img_read,?(100,?100))img_array?=?img_to_array(img_resize)data.append(img_array)labels.append(1)except:Nonefor?img?in?Uninfected:try:img_read?=?plt.imread(root+un+?img)img_resize?=?cv2.resize(img_read,?(100,?100))img_array?=?img_to_array(img_resize)data.append(img_array)labels.append(0)except:None在為空數(shù)組賦值變量數(shù)據(jù)和標(biāo)簽之后,我們需要使用for循環(huán)插入每一張圖像。
這里有一些不同之處,for循環(huán)中還包含了try和except。try用于在for循環(huán)中正常運(yùn)行代碼,另一方面,except用于代碼遇到錯(cuò)誤或崩潰時(shí),以便代碼可以繼續(xù)循環(huán)。
與上面的圖像顯示代碼類(lèi)似,我們可以使用plt.imread(“path”)函數(shù),但這一次,我們不需要顯示任何子圖。
你可能想知道我們?yōu)槭裁从胮lt.imread()而不是cv2.imread()。它們的功能是一樣的,事實(shí)上,還有很多其他的圖像讀取庫(kù),例如,Pillow庫(kù)的image.open()或Scikit-Image庫(kù)的io.imread()。
然而,OpenCV以BGR或藍(lán)、綠、紅的順序讀取圖像,這就是為什么上面顯示的圖像是藍(lán)色的,盡管實(shí)際的圖片是粉色的。因此,我們需要使用以下代碼將其轉(zhuǎn)換回RGB順序:
cv2.cvtColor(img,?cv2.COLOR_BGR2RGB)另一方面,Matplotlib、Scikit Image和Pillow Image reading函數(shù)會(huì)自動(dòng)按RGB順序讀取圖像,因此,對(duì)于我們的單元格圖像實(shí)際顏色,我們不需要再進(jìn)行轉(zhuǎn)換:
plt.imshow(data[0]) plt.show()之后,我們可以通過(guò)使用OpenCV的cv2.resize()函數(shù)來(lái)調(diào)整圖像的大小,以將加載的圖像設(shè)置為一個(gè)特定的高度和寬度,如上面所示的100 width和100 height。
接下來(lái),因?yàn)槲覀兊膱D像是抽象格式的,我們以后將無(wú)法對(duì)其進(jìn)行訓(xùn)練、測(cè)試或?qū)⑵洳迦胱兞恐?#xff0c;因此,我們需要使用keras的img_to_array()函數(shù)將其轉(zhuǎn)換為數(shù)組格式。這樣,我們就可以使用.append()函數(shù)將每個(gè)圖像插入變量的方括號(hào)中,該函數(shù)用于在不改變?cè)紶顟B(tài)的情況下將對(duì)象插入數(shù)組的最后一個(gè)列表。
所以在我們的循環(huán)中,我們不斷地在每個(gè)循環(huán)中添加一個(gè)新的圖像。
預(yù)處理數(shù)據(jù)
不像機(jī)器學(xué)習(xí)項(xiàng)目,我們可以立即分割我們的數(shù)據(jù),在深入學(xué)習(xí),特別是神經(jīng)網(wǎng)絡(luò),以減少方差,并減少過(guò)擬合。在Python中,有許多方法可以隨機(jī)化數(shù)據(jù),比如使用Sklearn,如下所示:
或使用如下所示的隨機(jī)方法:
from?random?import?shuffle但在這個(gè)項(xiàng)目中,我們將使用Numpy的隨機(jī)函數(shù)。因此,我們需要將數(shù)組轉(zhuǎn)換成Numpy的數(shù)組函數(shù),然后對(duì)圖像數(shù)據(jù)進(jìn)行隨機(jī)化,如下所示:
image_data?=?np.array(data) labels?=?np.array(labels)idx?=?np.arange(image_data.shape[0]) np.random.shuffle(idx) image_data?=?image_data[idx] labels?=?labels[idx]首先,我們將數(shù)據(jù)和標(biāo)簽變量轉(zhuǎn)換為Numpy格式。然后,我們可以使用np.arange()然后使用np.random.shuffle()功能。最后,我們將被隨機(jī)數(shù)據(jù)重新分配到它們的原始變量中,以確保被隨機(jī)的數(shù)據(jù)被保存。
用于訓(xùn)練、測(cè)試和驗(yàn)證的拆分?jǐn)?shù)據(jù)
在數(shù)據(jù)被隨機(jī)之后,我們應(yīng)該通過(guò)導(dǎo)入必要的庫(kù)將它們拆分為訓(xùn)練、測(cè)試和驗(yàn)證標(biāo)簽和數(shù)據(jù),如下所示:
然后我們?cè)O(shè)置一個(gè)函數(shù),將數(shù)據(jù)轉(zhuǎn)換為32位數(shù)據(jù)以保存:
def?prep_dataset(X,y):X_prep?=?X.astype('float32')/255y_prep?=?to_categorical(np.array(y))return?(X_prep,?y_prep)然后通過(guò)使用Sklearn庫(kù),我們可以將數(shù)據(jù)分為訓(xùn)練、測(cè)試和驗(yàn)證:
X_tr,?X_ts,?Y_tr,?Y_ts?=?train_test_split(image_data,labels,?test_size=0.15,?shuffle=True,stratify=labels,random_state=42) X_ts,?X_val,?Y_ts,?Y_val?=?train_test_split(X_ts,Y_ts,?test_size=0.5,?stratify=Y_ts,random_state=42)X_tr,?Y_tr?=?prep_dataset(X_tr,Y_tr) X_val,?Y_val?=?prep_dataset(X_val,Y_val) X_ts,?_?=?prep_dataset(X_ts,Y_ts)由于存在驗(yàn)證數(shù)據(jù),因此需要執(zhí)行兩次拆分。在spliting函數(shù)中,我們需要在前兩個(gè)參數(shù)中分配數(shù)據(jù)和標(biāo)簽,然后告訴它們被劃分成的百分比,隨機(jī)狀態(tài)是為了確保它們產(chǎn)生的數(shù)據(jù)總是以一致的順序排列。
卷積神經(jīng)網(wǎng)絡(luò)模型的建立
在建立CNN模型之前,讓我們從理論上對(duì)它有一點(diǎn)更深入的了解。CNN主要應(yīng)用于圖像分類(lèi),自1998年發(fā)明以來(lái),由于其高性能和高精度,一直受到人們的歡迎。那么它是如何工作的呢?
正如我們從上面的插圖中看到的,CNN對(duì)圖像進(jìn)行分類(lèi),取圖像的一部分,并將其通過(guò)幾層卷積處理來(lái)分類(lèi)圖像。從這幾個(gè)層中,可以將它們分為三種類(lèi)型的層,分別是卷積層、池化層和全連接層。
卷積層
第一層,卷積層是CNN最重要的方面之一,它的名字來(lái)源于此。其目的是利用核函數(shù)從輸入圖像中提取特征。該核將使用點(diǎn)積連續(xù)掃描輸入圖像,創(chuàng)建一個(gè)新的分析層,稱(chēng)為特征圖/激活圖。其機(jī)理如下:
2*1 + 4*2 + 9*3 + 2*(-4) + 1*7 + 4*4 + 1*2 + 1*(-5) + 2*1 = 51
然后繼續(xù),直到所有特征圖的單元格都被填滿。
池化層
在我們創(chuàng)建了特征圖之后,我們將應(yīng)用一個(gè)池化層來(lái)減小其大小以減少過(guò)擬合。此步驟中有幾個(gè)操作,但是,最流行的技術(shù)是最大池,其中特征圖的掃描區(qū)域?qū)H取最高值,如下圖所示:
卷積和池的步驟可以重復(fù),直到理想的大小是最后敲定,然后我們可以繼續(xù)分類(lèi)部分,它被稱(chēng)為全連接層。
全連通層
在這一階段,變換后的特征圖將被展平為一個(gè)列向量,該列向量將在每個(gè)迭代過(guò)程中經(jīng)過(guò)前饋神經(jīng)網(wǎng)絡(luò)和反向傳播過(guò)程,持續(xù)數(shù)個(gè)階段。最后,CNN模型將區(qū)分主要特征和非主要特征,利用Softmax分類(lèi)對(duì)圖像進(jìn)行分類(lèi)。
在Python中,我們需要從Keras庫(kù)導(dǎo)入CNN函數(shù):
from?tensorflow.keras?import?models,?layers from?tensorflow.keras.callbacks?import?EarlyStopping然后,我們將構(gòu)建我們自己的CNN模型,包括4個(gè)卷積層和池化層:
model?=?models.Sequential()#Input?+?Conv?1?+?ReLU?+?Max?Pooling model.add(layers.Conv2D(32,(5,5),activation='relu',padding='same',input_shape=X_tr.shape[1:]))model.add(layers.MaxPool2D(strides=4)) model.add(layers.BatchNormalization())#?Conv?2?+?ReLU?+?Max?Pooling model.add(layers.Conv2D(64,(5,5),padding='same',activation='relu'))model.add(layers.MaxPool2D(strides=2)) model.add(layers.BatchNormalization())#?Conv?3?+?ReLU?+?Max?Pooling model.add(layers.Conv2D(128,(3,3),padding='same',activation='relu'))model.add(layers.MaxPool2D(strides=2)) model.add(layers.BatchNormalization())#?Conv?4?+?ReLU?+?Max?Pooling model.add(layers.Conv2D(256,(3,3),dilation_rate=(2,2),padding='same',activation='relu')) model.add(layers.Conv2D(256,(3,3),activation='relu')) model.add(layers.MaxPool2D(strides=2)) model.add(layers.BatchNormalization())#?Fully?Connected?+?ReLU model.add(layers.Flatten())model.add(layers.Dense(300,?activation='relu')) model.add(layers.Dense(100,?activation='relu'))#Output model.add(layers.Dense(2,?activation='softmax'))model.summary()Keras中的卷積層
好的,在這段代碼中,你可能會(huì)感到困惑的第一件事是model .sequential()。
利用Keras構(gòu)建深度學(xué)習(xí)模型有兩種選擇,一種是序列模型,另一種是函數(shù)模型。他們兩人之間的差異是序列模型只允許一層一層地建立一個(gè)模型,另一方面,函數(shù)模型允許層連接到前一層,多層,甚至任何層,你想建立一個(gè)更復(fù)雜的模型。由于我們正在構(gòu)建一個(gè)簡(jiǎn)單的CNN模型,所以我們將使用序列模型。
我們之前了解到,CNN由卷積層組成,卷積層后來(lái)使用池化層進(jìn)行簡(jiǎn)化,因此,我們需要使用Keras函數(shù)model.add()添加層,然后添加我們喜歡的層。
由于我們的圖像是2D形式,我們只需要2D卷積層,同樣使用卷積層的Keras函數(shù):layers.Conv2D(). 正如你在每一層所看到的,第一層有一個(gè)數(shù)字32,第二層有一個(gè)數(shù)字64,乘以2并以此類(lèi)推。這叫做濾波器。它所做的是試圖捕捉圖像的模式。
因此,隨著濾波器尺寸的增大,我們可以在較小的圖像上捕獲更多的模式,盡管沒(méi)有太多理論的證明,然而,這被認(rèn)為是最優(yōu)方法。
接下來(lái),(5,5)和(3,3)矩陣是我們上面討論的用于創(chuàng)建特征圖的核。然后這里有兩個(gè)有趣的部分:ReLu的激活和填充。那些是什么?我們先來(lái)討論ReLu。它是由Rectified Linear Unit縮短而來(lái)的,其想法是采用更簡(jiǎn)單的模型,提高訓(xùn)練過(guò)程的效率。
下一個(gè)問(wèn)題是填充。如我們所知,卷積層不斷減小圖像的大小,因此,如果我們?cè)谛碌奶卣鲌D的所有四個(gè)邊上添加填充,我們將保持相同的大小。所以我們?cè)谔幚砗蟮膱D像周?chē)砑有碌膯卧?#xff0c;值為0,以保持圖像的大小。填充有兩個(gè)選項(xiàng):相同或零。接下來(lái)就是input_shape,它只是我們的輸入圖像,只在第一層中用于輸入我們的訓(xùn)練數(shù)據(jù)。
Keras中的池化層
讓我們轉(zhuǎn)到池化層,我們可以使用Keras的layers.MaxPool2D()。這里有一種東西叫做跨步(stride)。它是核將在輸入上每次移動(dòng)的步數(shù)。因此,如果我們用5x5的核,并且跨步為4,核將計(jì)算圖像最左邊的部分,然后跳過(guò)右邊的4個(gè)單元格來(lái)執(zhí)行下一次計(jì)算。
你可能會(huì)注意到,每個(gè)卷積層和池化層都以批標(biāo)準(zhǔn)化結(jié)束。為什么?因?yàn)樵诿恳粚又?#xff0c;都有不同的分布,訓(xùn)練過(guò)程會(huì)變慢,因?yàn)樗枰m應(yīng)每一層。但是,如果強(qiáng)制所有層具有相似的分布,則可以跳過(guò)此步驟并提高訓(xùn)練速度。這就是為什么我們?cè)诿恳粚又袘?yīng)用批標(biāo)準(zhǔn)化,通過(guò)如下所示的4個(gè)步驟對(duì)每一層中的輸入進(jìn)行標(biāo)準(zhǔn)化:
Keras全連接層
現(xiàn)在我們已經(jīng)到了CNN的最后階段,也就是全連接的階段。但在進(jìn)入這個(gè)階段之前,由于我們將在全連接階段使用“Dense”層,所以我們需要使用Keras層將處理過(guò)的數(shù)據(jù)平鋪成一維。Flatten()函數(shù)用于將垂直和水平的數(shù)據(jù)合并到單個(gè)列中。
我們將數(shù)據(jù)展平后,現(xiàn)在需要使用layers.Dense()函數(shù)將它們?nèi)B接起來(lái),然后指定要用作輸出的神經(jīng)元數(shù)量,考慮到當(dāng)前的神經(jīng)元是1024個(gè)。所以我們先使用300個(gè)神經(jīng)元,然后是100個(gè)神經(jīng)元,并使用ReLu對(duì)其進(jìn)行優(yōu)化。
最后,我們到達(dá)輸出階段,這也是通過(guò)使用Dense函數(shù)來(lái)完成的,然而,由于我們的分類(lèi)只有2個(gè)概率,即感染瘧疾或未感染瘧疾,因此,我們將輸出單位設(shè)置為2。此外,在分類(lèi)任務(wù)中,我們?cè)谳敵鰧邮褂肧oftmax激活而不是ReLu,因?yàn)镽eLu將所有負(fù)類(lèi)設(shè)置為零。
綜上所述,我們構(gòu)建的模型如下:
然后,我們將把我們的訓(xùn)練和驗(yàn)證數(shù)據(jù)整合到模型中:
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])es?=?EarlyStopping(monitor='val_accuracy',mode='max',patience=3,verbose=1)history=?model.fit(X_tr,Y_tr,epochs=20,batch_size=50,validation_data=(X_val,Y_val),callbacks=[es])由于數(shù)據(jù)量很大,這個(gè)過(guò)程需要一些時(shí)間。如下圖所示,每個(gè)epoch平均運(yùn)行9分鐘。
評(píng)估
我們可以通過(guò)繪制評(píng)估圖來(lái)評(píng)估模型性能,但在此之前,我們需要導(dǎo)入seaborn庫(kù):
然后將準(zhǔn)確度和損失繪制如下:
fig,?ax=plt.subplots(2,1,figsize=(12,10)) fig.suptitle('Train?evaluation')sns.lineplot(ax=?ax[0],x=np.arange(0,len(history.history['accuracy'])),y=history.history['accuracy']) sns.lineplot(ax=?ax[0],x=np.arange(0,len(history.history['accuracy'])),y=history.history['val_accuracy'])ax[0].legend(['Train','Validation']) ax[0].set_title('Accuracy')sns.lineplot(ax=?ax[1],x=np.arange(0,len(history.history['loss'])),y=history.history['loss']) sns.lineplot(ax=?ax[1],x=np.arange(0,len(history.history['loss'])),y=history.history['val_loss'])ax[1].legend(['Train','Validation']) ax[1].set_title('Loss')plt.show()這將給我們一個(gè)輸出:
它的平均性能似乎超過(guò)90%,這是非常好的,正如CNN模型所預(yù)期的。不過(guò),為了讓我們更具體地了解數(shù)據(jù)性能,讓我們使用Sklearn構(gòu)建一個(gè)混淆矩陣,并預(yù)測(cè)輸出:
from?sklearn.metrics?import?confusion_matrix,?accuracy_scoreY_pred?=?model.predict(X_ts)Y_pred?=?np.argmax(Y_pred,?axis=1)conf_mat?=?confusion_matrix(Y_ts,Y_pred)sns.set_style(style='white') plt.figure(figsize=(12,8)) heatmap?=?sns.heatmap(conf_mat,vmin=np.min(conf_mat.all()),?vmax=np.max(conf_mat),?annot=True,fmt='d',?annot_kws={"fontsize":20},cmap='Spectral') heatmap.set_title('Confusion?Matrix?Heatmap\n?Is?the?cell?infected?',?fontdict={'fontsize':15},?pad=12) heatmap.set_xlabel('Predicted',fontdict={'fontsize':14}) heatmap.set_ylabel('Actual',fontdict={'fontsize':14}) heatmap.set_xticklabels(['NO','YES'],?fontdict={'fontsize':12}) heatmap.set_yticklabels(['NO','YES'],?fontdict={'fontsize':12}) plt.show()print('-Acuracy?achieved:?{:.2f}%\n-Accuracy?by?model?was:?{:.2f}%\n-Accuracy?by?validation?was:?{:.2f}%'.format(accuracy_score(Y_ts,Y_pred)*100,(history.history['accuracy'][-1])*100,(history.history['val_accuracy'][-1])*100))這將為我們提供以下準(zhǔn)確度:
錯(cuò)誤樣本
讓我們看看錯(cuò)誤示例的樣子:
輸出:
盡管未感染,但錯(cuò)誤的預(yù)測(cè)圖像似乎包含了細(xì)胞上的幾個(gè)紫色斑塊,因此,模型實(shí)際預(yù)測(cè)它們?yōu)楦腥炯?xì)胞是可以理解的。
我想說(shuō)CNN是一個(gè)非常強(qiáng)大的圖像分類(lèi)模型,不需要做很多預(yù)處理任務(wù),因?yàn)樘幚戆诰矸e層和池化層中。
希望通過(guò)本文的學(xué)習(xí),讓你能夠利用卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行圖像分類(lèi)。
感謝你的閱讀。
?------------------------------------------------
看到這里,說(shuō)明你喜歡這篇文章,請(qǐng)點(diǎn)擊「在看」或順手「轉(zhuǎn)發(fā)」「點(diǎn)贊」。
往期精彩回顧適合初學(xué)者入門(mén)人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專(zhuān)輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專(zhuān)輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專(zhuān)輯溫州大學(xué)《機(jī)器學(xué)習(xí)課程》視頻 本站qq群851320808,加入微信群請(qǐng)掃碼:總結(jié)
以上是生活随笔為你收集整理的【深度学习】实战深度学习检测疟疾的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 时光手帐如何打印 时光手帐打印的方法
- 下一篇: 温州大学《深度学习》课程课件(八、深度卷