使用TensorFlow訓練影像分類模型的指南
譯者 | 陳峻
審校 | 孫淑娟
眾所周知,人類在很小的時候就學會了辨識和標記自己所看到的事物。如今,隨著機器學習和深度學習演算法的不斷迭代,電腦已經能夠以非常高的精度,對捕獲的圖像進行大規模的分類了。目前,此類先進演算法的應用場景已經涵括到了包括:解讀肺部掃描影像是否健康,透過行動裝置進行臉部識別,以及為零售商區分不同的消費對象類型等領域。
下面,我將與您共同探討電腦視覺(Computer Vision)的一種應用-影像分類,並逐步展示如何使用TensorFlow,在小型影像資料集上進行模型的訓練。
1、資料集和目標
在本範例中,我們將使用MNIST資料集的從0到9的數位影像。其形態如下圖所示:
我們訓練模型的目的是為了將圖像分類到其各自的標籤下,即:它們在上圖中各自對應的數字處。通常,深度神經網路架構會提供一個輸入、一個輸出、兩個隱藏層(Hidden Layers)和一個用於訓練模型的Dropout層。而CNN或卷積神經網路(Convolutional Neural Network)是識別較大影像的首選,它能夠在減少輸入量的同時,捕捉到相關的資訊。
2、準備工作
首先,讓我們透過TensorFlow、to_categorical(用於將數字類別的值轉換為其他類別)、Sequential、Flatten、Dense、以及用於建立神經網絡架構的Dropout,來導入所有相關的程式碼庫。您可能會對此處提及的部分程式碼庫略感陌生。我會在下文中對它們進行詳細的解釋。
3、超參數
- 我將透過如下方面,來選擇正確的超參數集:
- 首先,讓我們定義一些超參數作為起點。後續,您可以針對不同的需求,對其進行調整。在此,我選擇了128作為較小的批量尺寸(batch size)。其實,批次尺寸可以取任何值,但是2的冪次方大小往往能夠提高記憶體的效率,因此應作為首選。值得注意的是,在決定合適的批量尺寸時,其背後的主要參考依據是:過小的批量尺寸會使收斂過於繁瑣,而過大的批量尺寸則可能並不適合您的計算機內存。
- 讓我們將epoch(訓練集中每個樣本都參與一次訓練)的數量保持為50 ,以實現對模型的快速訓練。 epoch數值越低,越適合小而簡單的資料集。
- 接著,您需要新增隱藏層。在此,我為每個隱藏層保留了128個神經元。當然,你也可以用64和32個神經元來測試。就本例而言,像MINST這樣的簡單資料集,我並不建議使用較高的數值。
- 您可以嘗試不同的學習率(learning rate),例如0.01、0.05和0.1。在本例中,我將其保持為0.01。
- 對於其他超參數,我將衰減步驟(decay steps)和衰減率(decay rate)分別選擇為2000和0.9。而隨著訓練的進行,它們可以用來降低學習率。
- 在此,我選擇Adamax作為最佳化器。當然,您也可以選擇諸如Adam、RMSProp、SGD等其他優化器。
import tensorflow as tf from tensorflow.keras.utils import to_categorical from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Flatten, Dense, Dropout params = { 'dropout': 0.25, 'batch-size': 128, 'epochs': 50, 'layer-1-size': 128, 'layer-2-size': 128, 'initial-lr': 0.01, 'decay-steps': 2000, 'decay-rate': 0.9, 'optimizer': 'adamax' } mnist = tf.keras.datasets.mnist num_class = 10 # split between train and test sets (x_train, y_train), (x_test, y_test) = mnist.load_data() # reshape and normalize the data x_train = x_train.reshape(60000, 784).astype("float32")/255 x_test = x_test.reshape(10000, 784).astype("float32")/255 # convert class vectors to binary class matrices y_train = to_categorical(y_train, num_class) y_test = to_categorical(y_test, num_class)
4、建立訓練和測試集
由於TensorFlow函式庫也包含了MNIST資料集,因此您可以透過呼叫物件上的datasets.mnist ,再呼叫load_data()的方法,來分別取得訓練(60,000個樣本)和測試(10,000個樣本)的資料集。
接著,您需要對訓練和測試的影像進行整形和歸一化。其中,歸一化會將影像的像素強度限制在0和1之間。
最後,我們使用先前已匯入的to_categorical 方法,將訓練和測試標籤轉換為已分類標籤。這對於向TensorFlow框架傳達輸出的標籤(即:0到9)為類別(class),而不是數字類型,是非常重要的。
5、設計神經網路架構
下面,讓我們來了解如何在細節上設計神經網路架構。
我們透過加入Flatten ,將2D影像矩陣轉換為向量,以定義DNN(深度神經網路)的結構。輸入的神經元在此對應向量中的數字。
接著,我使用Dense() 方法,新增兩個隱藏的密集層,並從先前已定義的「params」字典中提取各項超參數。我們可以將「relu」(Rectified Linear Unit)作為這些層的激活函數。它是神經網路隱藏層中最常用的活化函數之一。
然後,我們使用Dropout方法加入Dropout層。它將被用於在訓練神經網路時,避免出現過擬合(overfitting)。畢竟,過度擬合模型傾向於準確地記住訓練集,並且無法泛化那些不可見(unseen)的資料集。
输出层是我们网络中的最后一层,它是使用Dense() 方法来定义的。需要注意的是,输出层有10个神经元,这对应于类(数字)的数量。
# Model Definition # Get parameters from logged hyperparameters model = Sequential([ Flatten(input_shape=(784, )), Dense(params('layer-1-size'), activatinotallow='relu'), Dense(params('layer-2-size'), activatinotallow='relu'), Dropout(params('dropout')), Dense(10) ]) lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay( initial_learning_rate=experiment.get_parameter('initial-lr'), decay_steps=experiment.get_parameter('decay-steps'), decay_rate=experiment.get_parameter('decay-rate') ) loss_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=True) model.compile(optimizer='adamax', loss=loss_fn, metrics=['accuracy']) model.fit(x_train, y_train, batch_size=experiment.get_parameter('batch-size'), epochs=experiment.get_parameter('epochs'), validation_data=(x_test, y_test),) score = model.evaluate(x_test, y_test) # Log Model model.save('tf-mnist-comet.h5')
6、训练
至此,我们已经定义好了架构。下面让我们用给定的训练数据,来编译和训练神经网络。
首先,我们以初始学习率、衰减步骤和衰减率作为参数,使用ExponentialDecay(指数衰减学习率)来定义学习率计划。
其次,将损失函数定义为CategoricalCrossentropy(用于多类式分类)。
接着,通过将优化器 (即:adamax)、损失函数、以及各项指标(由于所有类都同等重要、且均匀分布,因此我选择了准确性)作为参数,来编译模型。
然后,我们通过使用x_train、y_train、batch_size、epochs和validation_data去调用一个拟合方法,并拟合出模型。
同时,我们调用模型对象的评估方法,以获得模型在不可见数据集上的表现分数。
最后,您可以使用在模型对象上调用的save方法,保存要在生产环境中部署的模型对象。
7、小结
综上所述,我们讨论了为图像分类任务,训练深度神经网络的一些入门级的知识。您可以将其作为熟悉使用神经网络,进行图像分类的一个起点。据此,您可了解到该如何选择正确的参数集、以及架构背后的思考逻辑。
原文链接:https://www.kdnuggets.com/2022/12/guide-train-image-classification-model-tensorflow.html
以上是使用TensorFlow訓練影像分類模型的指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

想像一下,一個人工智慧模型,不僅擁有超越傳統運算的能力,還能以更低的成本實現更有效率的效能。這不是科幻,DeepSeek-V2[1],全球最強開源MoE模型來了。 DeepSeek-V2是一個強大的專家混合(MoE)語言模型,具有訓練經濟、推理高效的特點。它由236B個參數組成,其中21B個參數用於啟動每個標記。與DeepSeek67B相比,DeepSeek-V2效能更強,同時節省了42.5%的訓練成本,減少了93.3%的KV緩存,最大生成吞吐量提高到5.76倍。 DeepSeek是一家探索通用人工智

AI,的確正在改變數學。最近,一直十分關注這個議題的陶哲軒,轉發了最近一期的《美國數學學會通報》(BulletinoftheAmericanMathematicalSociety)。圍繞著「機器會改變數學嗎?」這個話題,許多數學家發表了自己的觀點,全程火花四射,內容硬核,精彩紛呈。作者陣容強大,包括菲爾茲獎得主AkshayVenkatesh、華裔數學家鄭樂雋、紐大電腦科學家ErnestDavis等多位業界知名學者。 AI的世界已經發生了天翻地覆的變化,要知道,其中許多文章是在一年前提交的,而在這一

谷歌力推的JAX在最近的基準測試中表現已經超過Pytorch和TensorFlow,7項指標排名第一。而且測試並不是JAX性能表現最好的TPU上完成的。雖然現在在開發者中,Pytorch依然比Tensorflow更受歡迎。但未來,也許有更多的大型模型會基於JAX平台進行訓練和運行。模型最近,Keras團隊為三個後端(TensorFlow、JAX、PyTorch)與原生PyTorch實作以及搭配TensorFlow的Keras2進行了基準測試。首先,他們為生成式和非生成式人工智慧任務選擇了一組主流

波士頓動力Atlas,正式進入電動機器人時代!昨天,液壓Atlas剛「含淚」退出歷史舞台,今天波士頓動力就宣布:電動Atlas上崗。看來,在商用人形機器人領域,波士頓動力是下定決心要跟特斯拉硬剛一把了。新影片放出後,短短十幾小時內,就已經有一百多萬觀看。舊人離去,新角色登場,這是歷史的必然。毫無疑問,今年是人形機器人的爆發年。網友銳評:機器人的進步,讓今年看起來像人類的開幕式動作、自由度遠超人類,但這真不是恐怖片?影片一開始,Atlas平靜地躺在地上,看起來應該是仰面朝天。接下來,讓人驚掉下巴

本月初,來自MIT等機構的研究者提出了一種非常有潛力的MLP替代方法—KAN。 KAN在準確性和可解釋性方面表現優於MLP。而且它能以非常少的參數量勝過以更大參數量運行的MLP。例如,作者表示,他們用KAN以更小的網路和更高的自動化程度重現了DeepMind的結果。具體來說,DeepMind的MLP有大約300,000個參數,而KAN只有約200個參數。 KAN與MLP一樣具有強大的數學基礎,MLP基於通用逼近定理,而KAN基於Kolmogorov-Arnold表示定理。如下圖所示,KAN在邊上具

特斯拉機器人Optimus最新影片出爐,已經可以在工廠裡打工了。正常速度下,它分揀電池(特斯拉的4680電池)是這樣的:官方還放出了20倍速下的樣子——在小小的「工位」上,揀啊揀啊揀:這次放出的影片亮點之一在於Optimus在廠子裡完成這項工作,是完全自主的,全程沒有人為的干預。而且在Optimus的視角之下,它還可以把放歪了的電池重新撿起來放置,主打一個自動糾錯:對於Optimus的手,英偉達科學家JimFan給出了高度的評價:Optimus的手是全球五指機器人裡最靈巧的之一。它的手不僅有觸覺

這篇論文探討了在自動駕駛中,從不同視角(如透視圖和鳥瞰圖)準確檢測物體的問題,特別是如何有效地從透視圖(PV)到鳥瞰圖(BEV)空間轉換特徵,這一轉換是透過視覺轉換(VT)模組實施的。現有的方法大致分為兩種策略:2D到3D和3D到2D轉換。 2D到3D的方法透過預測深度機率來提升密集的2D特徵,但深度預測的固有不確定性,尤其是在遠處區域,可能會引入不準確性。而3D到2D的方法通常使用3D查詢來採樣2D特徵,並透過Transformer學習3D和2D特徵之間對應關係的注意力權重,這增加了計算和部署的

目標偵測在自動駕駛系統當中是一個比較成熟的問題,其中行人偵測是最早得以部署演算法之一。在多數論文當中已經進行了非常全面的研究。然而,利用魚眼相機進行環視的距離感知相對來說研究較少。由於徑向畸變大,標準的邊界框表示在魚眼相機當中很難實施。為了緩解上述描述,我們探索了擴展邊界框、橢圓、通用多邊形設計為極座標/角度表示,並定義一個實例分割mIOU度量來分析這些表示。所提出的具有多邊形形狀的模型fisheyeDetNet優於其他模型,並同時在用於自動駕駛的Valeo魚眼相機資料集上實現了49.5%的mAP
