譯者 | 陳峻
審校 | 孫淑娟
眾所周知,人類在很小的時(shí)候就學(xué)會了識別和標(biāo)記自己所看到的事物。如今,隨著機(jī)器學(xué)習(xí)和深度學(xué)習(xí)算法的不斷迭代,計(jì)算機(jī)已經(jīng)能夠以非常高的精度,對捕獲到的圖像進(jìn)行大規(guī)模的分類了。目前,此類先進(jìn)算法的應(yīng)用場景已經(jīng)涵括到了包括:解讀肺部掃描影像是否健康,通過移動設(shè)備進(jìn)行面部識別,以及為零售商區(qū)分不同的消費(fèi)對象類型等領(lǐng)域。
下面,我將和您共同探討計(jì)算機(jī)視覺(Computer Vision)的一種應(yīng)用——圖像分類,并逐步展示如何使用TensorFlow,在小型圖像數(shù)據(jù)集上進(jìn)行模型的訓(xùn)練。
1、數(shù)據(jù)集和目標(biāo)
在本示例中,我們將使用MNIST數(shù)據(jù)集的從0到9的數(shù)字圖像。其形態(tài)如下圖所示:
我們訓(xùn)練該模型的目的是為了將圖像分類到其各自的標(biāo)簽下,即:它們在上圖中各自對應(yīng)的數(shù)字處。通常,深度神經(jīng)網(wǎng)絡(luò)架構(gòu)會提供一個(gè)輸入、一個(gè)輸出、兩個(gè)隱藏層(Hidden Layers)和一個(gè)用于訓(xùn)練模型的Dropout層。而CNN或卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network)是識別較大圖像的首選,它能夠在減少輸入量的同時(shí),捕獲到相關(guān)的信息。
2、準(zhǔn)備工作
首先,讓我們通過TensorFlow、to_categorical(用于將數(shù)字類的值轉(zhuǎn)換為其他類別)、Sequential、Flatten、Dense、以及用于構(gòu)建神經(jīng)網(wǎng)絡(luò)架構(gòu)的 Dropout,來導(dǎo)入所有相關(guān)的代碼庫。您可能會對此處提及的部分代碼庫略感陌生。我會在下文中對它們進(jìn)行詳細(xì)的解釋。
3、超參數(shù)
- 我將通過如下方面,來選擇正確的超參數(shù)集:
- 首先,讓我們定義一些超參數(shù)作為起點(diǎn)。后續(xù),您可以針對不同的需求,對其進(jìn)行調(diào)整。在此,我選擇了128作為較小的批量尺寸(batch size)。其實(shí),批量尺寸可以取任何值,但是2的冪次方大小往往能夠提高內(nèi)存的效率,因此應(yīng)作為首選。值得注意的是,在決定合適的批量尺寸時(shí),其背后的主要參考依據(jù)是:過小的批量尺寸會使收斂過于繁瑣,而過大的批量尺寸則可能并不適合您的計(jì)算機(jī)內(nèi)存。
- 讓我們將epoch(訓(xùn)練集中每一個(gè)樣本都參與一次訓(xùn)練)的數(shù)量保持為50 ,以實(shí)現(xiàn)對模型的快速訓(xùn)練。epoch數(shù)值越低,越適合小而簡單的數(shù)據(jù)集。
- 接著,您需要添加隱藏層。在此,我為每個(gè)隱藏層都保留了128個(gè)神經(jīng)元。當(dāng)然,你也可以用64和32個(gè)神經(jīng)元進(jìn)行測試。就本例而言,像MINST這樣的簡單數(shù)據(jù)集,我并不建議使用較高的數(shù)值。
- 您可以嘗試不同的學(xué)習(xí)率(learning rate),例如0.01、0.05和0.1。在本例中,我將其保持為0.01。
- 對于其他超參數(shù),我將衰減步驟(decay steps)和衰減率(decay rate)分別選擇為2000和0.9。而隨著訓(xùn)練的進(jìn)行,它們可以被用來降低學(xué)習(xí)率。
- 在此,我選擇Adamax作為優(yōu)化器。當(dāng)然,您也可以選擇諸如Adam、RMSProp、SGD等其他優(yōu)化器。
4、創(chuàng)建訓(xùn)練和測試集
由于TensorFlow庫也包括了MNIST數(shù)據(jù)集,因此您可以通過調(diào)用對象上的 datasets.mnist ,再調(diào)用load_data() 的方法,來分別獲取訓(xùn)練(60,000個(gè)樣本)和測試(10,000個(gè)樣本)的數(shù)據(jù)集。
接著,您需要對訓(xùn)練和測試的圖像進(jìn)行整形和歸一化。其中,歸一化會將圖像的像素強(qiáng)度限制在0和1之間。
最后,我們使用之前已導(dǎo)入的to_categorical 方法,將訓(xùn)練和測試標(biāo)簽轉(zhuǎn)換為已分類標(biāo)簽。這對于向TensorFlow框架傳達(dá)輸出的標(biāo)簽(即:0到9)為類(class),而不是數(shù)字類型,是非常重要的。
5、設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)架構(gòu)
下面,讓我們來了解如何在細(xì)節(jié)上設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)架構(gòu)。
我們通過添加Flatten ,將2D圖像矩陣轉(zhuǎn)換為向量,以定義DNN(深度神經(jīng)網(wǎng)絡(luò))的結(jié)構(gòu)。輸入的神經(jīng)元在此處對應(yīng)向量中的數(shù)字。
接著,我使用Dense() 方法,添加兩個(gè)隱藏的密集層,并從之前已定義的“params”字典中提取各項(xiàng)超參數(shù)。我們可以將“relu”(Rectified Linear Unit)作為這些層的激活函數(shù)。它是神經(jīng)網(wǎng)絡(luò)隱藏層中最常用的激活函數(shù)之一。
然后,我們使用Dropout方法添加Dropout層。它將被用于在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),避免出現(xiàn)過擬合(overfitting)。畢竟,過度擬合模型傾向于準(zhǔn)確地記住訓(xùn)練集,并且無法泛化那些不可見(unseen)的數(shù)據(jù)集。
輸出層是我們網(wǎng)絡(luò)中的最后一層,它是使用Dense() 方法來定義的。需要注意的是,輸出層有10個(gè)神經(jīng)元,這對應(yīng)于類(數(shù)字)的數(shù)量。
6、訓(xùn)練
至此,我們已經(jīng)定義好了架構(gòu)。下面讓我們用給定的訓(xùn)練數(shù)據(jù),來編譯和訓(xùn)練神經(jīng)網(wǎng)絡(luò)。
首先,我們以初始學(xué)習(xí)率、衰減步驟和衰減率作為參數(shù),使用ExponentialDecay(指數(shù)衰減學(xué)習(xí)率)來定義學(xué)習(xí)率計(jì)劃。
其次,將損失函數(shù)定義為CategoricalCrossentropy(用于多類式分類)。
接著,通過將優(yōu)化器 (即:adamax)、損失函數(shù)、以及各項(xiàng)指標(biāo)(由于所有類都同等重要、且均勻分布,因此我選擇了準(zhǔn)確性)作為參數(shù),來編譯模型。
然后,我們通過使用x_train、y_train、batch_size、epochs和validation_data去調(diào)用一個(gè)擬合方法,并擬合出模型。
同時(shí),我們調(diào)用模型對象的評估方法,以獲得模型在不可見數(shù)據(jù)集上的表現(xiàn)分?jǐn)?shù)。
最后,您可以使用在模型對象上調(diào)用的save方法,保存要在生產(chǎn)環(huán)境中部署的模型對象。
7、小結(jié)
綜上所述,我們討論了為圖像分類任務(wù),訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的一些入門級的知識。您可以將其作為熟悉使用神經(jīng)網(wǎng)絡(luò),進(jìn)行圖像分類的一個(gè)起點(diǎn)。據(jù)此,您可了解到該如何選擇正確的參數(shù)集、以及架構(gòu)背后的思考邏輯。
原文鏈接:https://www.kdnuggets.com/2022/12/guide-train-image-classification-model-tensorflow.html