更復雜的體系結構能保證更好的模型嗎?
使用的數(shù)據(jù)集和數(shù)據(jù)預處理
我們將使用Kaggle的狗與貓數(shù)據(jù)集。它是根據(jù)知識共享許可證授權的,這意味著你可以免費使用它:
該數(shù)據(jù)集相當大——25000張圖像均勻分布在不同的類中(12500張狗圖像和12500張貓圖像)。它應該足夠大,以訓練一個像樣的圖像分類器。
你還應該刪除train/cat/666.jpg和train/dog/11702.jpg圖像,這些已經損壞,你的模型將無法使用它們進行訓練。
接下來,讓我們看看如何使用TensorFlow加載圖像。
如何使用TensorFlow加載圖像數(shù)據(jù)
今天你將看到的模型將比前幾篇文章中的模型具有更多的層。
為了可讀性,我們將從TensorFlow中導入單個類。如果你正在跟進,請確保有一個帶有GPU的系統(tǒng),或者至少使用Google Colab。
讓我們把庫的導入放在一邊:
這是很多,但模型會因此看起來格外干凈。
我們現(xiàn)在將像往常一樣加載圖像數(shù)據(jù)——使用ImageDataGenerator類。
我們將把圖像矩陣轉換為0–1范圍,使用用三個顏色通道,將所有圖像調整為224x224。出于內存方面的考慮,我們將barch大小降低到32:
以下是你應該看到的輸出:
讓我們鼓搗第一個模型!
向TensorFlow模型中添加層會有什么不同嗎?
從頭開始編寫卷積模型總是一項棘手的任務。網格搜索最優(yōu)架構是不可行的,因為卷積模型需要很長時間來訓練,而且有太多的參數(shù)需要檢查。實際上,你更有可能使用遷移學習。這是我們將在不久的將來探討的主題。
今天,這一切都是為了理解為什么在模型架構上大刀闊斧是不值得的。我們用一個簡單的模型獲得了75%的準確率,所以這是我們必須超越的基線。
模型1-兩個卷積塊
我們將宣布第一個模型在某種程度上類似于VGG體系結構——兩個卷積層,后面是一個池層。濾波器設置如下,第一個塊32個,第二個塊64個。
至于損失和優(yōu)化器,我們將堅持基本原則——分類交叉熵和Adam。數(shù)據(jù)集中的類是完全平衡的,這意味著我們只需跟蹤準確率即可:
model_1 = tf.keras.Sequential([
Conv2D(filters=32, kernel_size=(3, 3), input_shape=(224, 224, 3), activation='relu'),
Conv2D(filters=32, kernel_size=(3, 3), activation='relu'),
MaxPool2D(pool_size=(2, 2), padding='same'),
Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
MaxPool2D(pool_size=(2, 2), padding='same'),
Flatten(),
Dense(units=128, activation='relu'),
Dense(units=2, activation='softmax')
])
model_1.compile(
loss=categorical_crossentropy,
optimizer=Adam(),
metrics=[BinaryAccuracy(name='accuracy')]
)
model_1_history = model_1.fit(
train_data,
validation_data=valid_data,
epochs=10
)
以下是經過10個epoch后的訓練結果:
看起來我們的表現(xiàn)并沒有超過基線,因為驗證準確率仍然在75%左右。如果我們再加上一個卷積塊會發(fā)生什么?
模型2-三個卷積塊
我們將保持模型體系結構相同,唯一的區(qū)別是增加了一個包含128個濾波器的卷積塊:
model_2 = Sequential([
Conv2D(filters=32, kernel_size=(3, 3), input_shape=(224, 224, 3), activation='relu'),
Conv2D(filters=32, kernel_size=(3, 3), activation='relu'),
MaxPool2D(pool_size=(2, 2), padding='same'),
Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
MaxPool2D(pool_size=(2, 2), padding='same'),
Conv2D(filters=128, kernel_size=(3, 3), activation='relu'),
Conv2D(filters=128, kernel_size=(3, 3), activation='relu'),
MaxPool2D(pool_size=(2, 2), padding='same'),
Flatten(),
Dense(units=128, activation='relu'),
Dense(units=2, activation='softmax')
])
model_2.compile(
loss=categorical_crossentropy,
optimizer=Adam(),
metrics=[BinaryAccuracy(name='accuracy')]
)
model_2_history = model_2.fit(
train_data,
validation_data=valid_data,
epochs=10
)
日志如下:
效果變差了。雖然你可以隨意調整batch大小和學習率,但效果可能仍然不行。第一個架構在我們的數(shù)據(jù)集上工作得更好,所以讓我們試著繼續(xù)調整一下。
模型3-帶Dropout的卷積塊
第三個模型的架構與第一個模型相同,唯一的區(qū)別是增加了一個全連接層和一個Dropout層。讓我們看看這是否會有所不同:
model_3 = tf.keras.Sequential([
Conv2D(filters=32, kernel_size=(3, 3), input_shape=(224, 224, 3), activation='relu'),
Conv2D(filters=32, kernel_size=(3, 3), activation='relu'),
MaxPool2D(pool_size=(2, 2), padding='same'),
Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
Conv2D(filters=64, kernel_size=(3, 3), activation='relu'),
MaxPool2D(pool_size=(2, 2), padding='same'),
Flatten(),
Dense(units=512, activation='relu'),
Dropout(rate=0.3),
Dense(units=128),
Dense(units=2, activation='softmax')
])
model_3.compile(
loss=categorical_crossentropy,
optimizer=Adam(),
metrics=[BinaryAccuracy(name='accuracy')]
)
model_3_history = model_3.fit(
train_data,
validation_data=valid_data,
epochs=10
)
以下是訓練日志:
太可怕了,現(xiàn)在還不到70%!上一篇文章中的簡單架構非常好。反而是數(shù)據(jù)質量問題限制了模型的預測能力。
結論
這就證明了,更復雜的模型體系結構并不一定會產生性能更好的模型。也許你可以找到一個更適合貓狗數(shù)據(jù)集的架構,但這可能是徒勞的。
你應該將重點轉移到提高數(shù)據(jù)集質量上。當然,有20K個訓練圖像,但我們仍然可以增加多樣性。這就是數(shù)據(jù)增強的用武之地。
感謝閱讀!
原文標題 : 更復雜的體系結構能保證更好的模型嗎?

最新活動更多
-
10月23日火熱報名中>> 2025是德科技創(chuàng)新技術峰會
-
10月23日立即報名>> Works With 開發(fā)者大會深圳站
-
11月7日立即參評>> 【評選】維科杯·OFweek 2025(第十屆)物聯(lián)網行業(yè)年度評選
-
即日-11.25立即下載>>> 費斯托白皮書《柔性:汽車生產未來的關鍵》
-
11月27日立即報名>> 【工程師系列】汽車電子技術在線大會
-
12月18日立即報名>> 【線下會議】OFweek 2025(第十屆)物聯(lián)網產業(yè)大會
-
8 每日AI全球觀察
- 1 特斯拉工人被故障機器人打成重傷,索賠3.6億
- 2 【行業(yè)深度研究】退居幕后四年后,張一鳴終于把算法公司變成AI公司?
- 3 AI 時代,阿里云想當“安卓” ,那誰是“蘋果”?
- 4 拐點已至!匯川領跑工控、埃斯頓份額第一、新時達海爾賦能扭虧為盈
- 5 硬剛英偉達!華為發(fā)布全球最強算力超節(jié)點和集群
- 6 隱退4年后,張一鳴久違現(xiàn)身!互聯(lián)網大佬正集體殺回
- 7 00后華裔女生靠兩部AI電影狂賺7.8億人民幣,AI正式進軍好萊塢
- 8 谷歌“香蕉”爆火啟示:國產垂類AI的危機還是轉機?
- 9 機器人9月大事件|3家國產機器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 10 美光:AI Capex瘋投不止,終于要拉起存儲超級周期了?
- 生產部總監(jiān) 廣東省/廣州市
- 資深管理人員 廣東省/江門市
- Regional Sales Manager 廣東省/深圳市
- 銷售總監(jiān) 廣東省/深圳市
- 結構工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 自動化高級工程師 廣東省/深圳市
- 技術專家 廣東省/江門市
- 激光器高級銷售經理 上海市/虹口區(qū)
- 封裝工程師 北京市/海淀區(qū)