🗺️ AI 學習與考證地圖
中級科目三程式實戰 · 深度學習分類配方

三類互斥、單標籤:
輸出開 3 個座位,loss 認整數標籤

分類模型的最後一層是配方題:幾個類別 → 開幾個輸出單元;標籤長什麼樣 → 選哪個 loss。本頁把四個選項全部真的下水訓練:正解 B 準確率 0.970、輸出機率每列加總恰好=1;A 竟然跑得動——但損失一路鑽到 -17.75(交叉熵不可能是負的,數學已經壞掉);C 當場 Incompatible shapes;D 少一個座位、當場被拒。一份配方+三張錯誤現場,一次記牢。

閱讀模式

00題目

Keras 要處理三類互斥、單標籤分類,y_train 為 0、1、2 的整數。下列模型設定何者最合適?

import numpy as np                    # 拿出陣列工具
y_train = np.array([0, 2, 1, 0, 2])   # 標籤:整數 0/1/2,一筆一個
# 請選擇合適的輸出層與 loss           # 題目要你配的就是這兩件事

先說:「三類互斥、單標籤」是什麼處境

想像路口的紅綠燈:紅、黃、綠三盞燈,同一時刻只亮一盞——這就是「三類互斥、單標籤」:每筆資料屬於三類之一,不能同時屬於兩類。模型的輸出層就是那排燈座:三類就要三個燈座(Dense 的 3),每個燈座給一個「亮度」;softmax 把三個亮度換算成加總=100% 的機率——最亮的那盞就是預測(argmax)。

loss 那一半看的是標籤的長相:題目的 y_train 是 [0, 2, 1, 0, 2]——一筆一個整數。整數標籤直接配 sparse_categorical_crossentropy;若標籤已改成 one-hot([1,0,0] 這種),才配 categorical_crossentropy——兩者算的是同一個數學(本站實跑同值),差別只在「標籤怎麼寫」。

配方口訣(本頁反覆驗證): 幾類就開幾個輸出單元+softmax(互斥單標籤時); 整數標籤配 sparse、one-hot 配 categorical sigmoid+binary_crossentropy 是「二類」與「多標籤」的配方——拿來裝三類互斥,實跑會把損失鑽到負值。

先點開看:softmax 是什麼?sparse_categorical_crossentropy互斥與單標籤

不熟 AI 專有名詞?你需要先認識下列名詞

點擊後出現漸進式說明:白話說明 → 說清楚一點 → 常見錯誤與考點。

輸出層的兩位主角
softmaxsigmoid 對照Dense(3) 的 3機率分布:加總=1
loss 家族
sparse_categorical_crossentropycategorical_crossentropybinary_crossentropyloss 到底是什麼
任務與標籤
互斥與單標籤多類別分類多標籤對照one-hot 編碼argmax 讀預測
錯誤現場
負的交叉熵=警報label out of rangerelu+MAE 為何錯

不熟 Python?你需要先認識下列名詞

點擊後出現漸進式說明

把工具拿進來
importfrom模組 module
造陣列、存東西
np.array[ ] 中括號清單0、1、2 整數= 指派變數與命名
呼叫與設定
( ) 呼叫括號關鍵字引數"softmax" 字串設定. 點運算子方法 method# 註解

01逐行拆解:短短三行,資訊全在裡面

題目只給三行——但配方要的兩個線索(幾類?標籤長怎樣?)都藏在第 2 行。右上角的「看位置」可以把這一行放回完整程式裡看。

第 1 行拿出陣列工具
import numpy as np   # 整箱搬進來,取小名 np

老朋友了。這次它只做一件事:把標籤清單變成 numpy 陣列——Keras 的 fit 吃陣列最順。

相關名詞:import模組 module

第 2 行標籤本人:兩個線索都在這
y_train = np.array([0, 2, 1, 0, 2])   # 一筆一個整數:0、1、2 三種

讀出兩個配方線索:① 取值有 0、1、2 三種 → 三類 → 輸出層要 3 個單元(Dense 的第一個數字)。② 每筆只有「一個整數」——不是 [1,0,0] 那種一排 0/1 → 標籤是整數形式 → loss 選 sparse_categorical_crossentropy(sparse 就是「標籤用整數寫」的記號)。

順便驗「互斥、單標籤」:每個位置只有一個數字(單標籤——一筆一個答案)、一個數字只能是一類(互斥——不能同時是 0 又是 2)。若是「一部電影同時屬於動作+喜劇」那種多標籤任務,y 會長成每筆一排 0/1——那是另一份配方(05 節)。

相關名詞:np.array0、1、2 整數互斥與單標籤one-hot 編碼

第 3 行題目的任務宣言
# 請選擇合適的輸出層與 loss   # 兩個空格:輸出層(幾個單元+什麼 activation)與 loss

註解就是考題本體:要你填「輸出層」與「loss」這對必須成套的組合。填法是一條決策鏈:任務(三類互斥單標籤)→ 輸出層(Dense(3, softmax))→ 標籤長相(整數)→ loss(sparse_categorical_crossentropy)。接下來四個實驗室把這條鏈的每一環都實跑給你看。

相關名詞:# 註解loss 到底是什麼

02softmax 手算機:三個亮度,怎麼變成加總 100% 的機率

輸出層的三個單元先各算出一個分數(logits,可正可負),softmax 再把它們換算成機率:

\[ p_i \;=\; \frac{e^{z_i}}{\sum_{j=1}^{3} e^{z_j}} \]

互動實驗室:softmax 手算機拉三個分數,看機率怎麼分配
類別 0 的分數 z₀2.0
類別 1 的分數 z₁1.0
類別 2 的分數 z₂0.0
加總 = 1.000000
本站實跑對照:python 算 softmax([2, 1, 0.1]) = [0.659, 0.242, 0.099]、加總恰為 1——跟上面的手算機一致。三個性質考題都愛: 每個機率都在 0~1; 加總永遠=1(互斥的數學表達:機率是「分」出去的); 分數全相等時機率均分([1,1,1] → 各 0.333)。預測=挑最大的那格(argmax)。

相關名詞:softmaxlogits機率分布argmax

03標籤的兩種長相:sparse 與 categorical 是同一個數學

loss 名字裡的 sparse 不是另一種數學——它只是在說「我的標籤用整數寫」。同一份 y_train,兩種寫法對照:

互動實驗室:標籤試衣間同一份標籤、兩種寫法、同一個損失值
該配的 loss
sparse_categorical_crossentropy
整數標籤直接吃
實跑損失值(同一組預測)
0.102425
兩種寫法算出一模一樣的值
標籤佔的空間
5 格
一筆一個整數
本站實跑鐵證:拿正解模型的同一組預測機率,整數標籤餵 SparseCategoricalCrossentropy、one-hot 標籤餵 CategoricalCrossentropy——損失都是 0.102425,小數點後六位一樣。兩個 loss 是同一個數學、兩種標籤介面——考題考的就是「你會不會看標籤長相選介面」。

相關名詞:sparse_categorical_crossentropycategorical_crossentropyone-hot 編碼

04四個選項全部下水:一個成功、兩個當場炸、一個無聲壞掉

本站造了 300 筆三群資料(每類 100 筆),四個選項真的各訓練一次。結局分三種——最值得記的又是那個跑得動的錯

互動實驗室:四選項的結局B 成功、C/D 當場炸、A 的損失是負的
A 是全頁最重要的一課:錯的配方不一定會報錯。Dense(1, sigmoid)+binary_crossentropy 硬吃 0/1/2,訓練照跑——但把 y=2 代進二元公式,損失從 0.38 一路鑽到 -17.75合法設定下交叉熵恆 ≥ 0——負的損失=數學已經壞掉的警報,跟第 9 頁「不報錯的 shape 錯」、第 10 頁「虛高的 0.980」是同一族:程式不喊痛,要靠你會讀儀表板

相關名詞:負的交叉熵=警報binary_crossentropyrelu+MAE 為何錯

05配方選擇器:三種分類任務,三份配方

把本題放進完整的地圖——分類任務只有三種基本款,每款一份固定配方:

互動實驗室:任務配方選擇器選任務,拿配方
A 選項的配方其實沒有錯——錯的是場合。Dense(1, sigmoid)+binary_crossentropy 是二類單標籤的標準配方(貓/狗、垃圾信/正常信);Dense(3, sigmoid)+binary_crossentropy 則是多標籤的配方(每類一個獨立開關,機率不必加總為 1)。考題最愛的陷阱就是「把二類配方搬到三類互斥」——sigmoid 一個開關裝不下三個互斥的類別。

相關名詞:sigmoid 對照多標籤對照多類別分類

06錯誤訊息讀報課:三張現場照片

這一題的三個錯誤選項,在真實工作裡對應三種你遲早會遇到的畫面。實跑原文貼給你,配讀法:

現場實跑訊息(原文)讀法與反應
D+sparse
(少一個座位)
Received a label value of 2 which is outside the valid range of [0, 2)標籤出現 2,但輸出只有 2 個單元(合法範圍 0~1)——把 Dense 的單元數改成類別數。看到這句幾乎都是座位開少了。
D+BCE
(形狀不合)
Arguments target and output must have the same rank (ndim). Received: target.shape=(None,), output.shape=(None, 2)binary_crossentropy 期待標籤跟輸出同形狀——整數標籤配它就對不上。換 sparse 家族,或檢查任務是不是真的二元
C+MAE
(回歸錯棚)
Incompatible shapes: [32] vs. [32,3]一個 batch 的 32 個整數標籤,撞上 32×3 的輸出——回歸 loss 沒有「類別」概念。分類任務回到交叉熵家族
A+BCE
(不報錯!)
Epoch 60/60 — loss: -17.75 - accuracy: 0.637沒有錯誤訊息,只有壞掉的數字:交叉熵出現負值=標籤超出該 loss 的合法範圍。防身術:訓練前 assert y.max() < 輸出單元數、開訓後看一眼 loss 的正負。

另外把 C 的概念錯也說完:就算形狀對得上,用回歸距離量類別也毫無意義——類別 2 跟類別 0「差 2」、類別 1「差 1」是假距離(0/1/2 只是名字,不是數量);而 relu 輸出是任意非負數、不會加總成 1,不是機率,連「信心」都讀不出來。

07四個選項收工

ADense(1, activation="sigmoid") 搭配 binary_crossentropy最陰:跑得動但壞掉

這是二類的配方——一個 sigmoid 開關只能表達「是/不是」,裝不下三個互斥類別。實跑硬餵 0/1/2:訓練照跑不報錯,但 y=2 代進二元公式讓損失一路鑽到 -17.75——合法設定下交叉熵恆 ≥ 0,負值就是配方壞掉的警報;準確率卡在 0.637,第三類根本無處安放。

BDense(3, activation="softmax") 搭配 sparse_categorical_crossentropy正確

配方兩環全對:三類 → 3 個輸出單元+softmax(輸出變成加總=1 的機率分布,互斥的數學表達);整數標籤 → sparse 版交叉熵直接吃 0/1/2。實跑:準確率 0.970、每列機率加總恰為 1、argmax 就是預測類別。標籤若改 one-hot,換 categorical_crossentropy——實跑兩者損失同值 0.102425。

CDense(3, activation="relu") 搭配 mean_absolute_error回歸錯棚

兩個都錯:relu 輸出是任意非負數、不加總成 1——不是機率;MAE 是回歸的尺,量的是「數值差多少」——但 0/1/2 是類別名字不是數量,「類別 2 跟 0 差 2」是假距離。實跑當場炸:Incompatible shapes: [32] vs. [32,3]——連形狀都對不上。

DDense(2, activation="softmax") 搭配 binary_crossentropy少一個座位

三類只開兩個座位——類別 2 沒有位置。實跑配 binary_crossentropy 當場 rank 錯誤(target (None,) vs output (None, 2));就算改配 sparse,也立刻拋出經典的 Received a label value of 2 which is outside the valid range of [0, 2)輸出單元數必須等於類別數——這是配方的第一環。

回到題目:現在再作答一次

再看一次同一段程式。這次你知道第 2 行藏著兩個配方線索了。

Keras 要處理三類互斥、單標籤分類,y_train 為 0、1、2 的整數。下列模型設定何者最合適?

y_train = np.array([0, 2, 1, 0, 2])   # 三種取值 → 3 個座位;一筆一個整數 → sparse

08自我檢測

八題,全部都是本題的延伸。答錯會直接告訴你錯在哪。

09重點整理

  1. 三行程式的分工:第 1 行拿工具、第 2 行標籤本人(兩個配方線索都在這:三種取值、整數形式)、第 3 行任務宣言。決策鏈:任務 → 輸出層 → 標籤長相 → loss。
  2. 正確答案 B:Dense(3, activation="softmax") + sparse_categorical_crossentropy。實跑:準確率 0.970、輸出機率每列加總恰為 1、argmax 即預測。
  3. 配方第一環:幾類就開幾個輸出單元——三類 → Dense(3)。D 只開 2 個座位,配 sparse 立刻 Received a label value of 2 which is outside the valid range of [0, 2)
  4. 配方第二環:互斥單標籤用 softmax——把三個分數變成加總=1 的機率分布(實跑 softmax([2, 1, 0.1]) = [0.659, 0.242, 0.099]);「加總=1」就是互斥的數學表達。
  5. 配方第三環:看標籤長相選 loss——整數 0/1/2 配 sparse_categorical_crossentropy;one-hot 配 categorical_crossentropy。兩者同一個數學:實跑同一組預測,損失都是 0.102425。
  6. A 的死法最陰:不報錯——Dense(1, sigmoid)+BCE 硬吃 0/1/2 照樣訓練,但損失從 0.38 鑽到 -17.75。合法設定下交叉熵恆 ≥ 0——負的 loss = 配方壞掉的警報。準確率卡 0.637(第三類無處安放)。
  7. C 的死法:回歸錯棚——relu 輸出不是機率(不加總成 1);MAE 量「數值差」但 0/1/2 是名字不是數量(假距離)。實跑當場 Incompatible shapes: [32] vs. [32,3]
  8. D 的死法:形狀與座位——BCE 要求標籤與輸出同形狀(target (None,) vs output (None, 2) 當場拒收);座位也少一個。
  9. sigmoid+BCE 的正當用途:二類單標籤(Dense(1, sigmoid))與多標籤(Dense(3, sigmoid)——每類獨立開關、機率不必加總 1)。A 的配方沒有錯,錯的是場合。
  10. 三份配方一張表:二類單標籤 → Dense(1, sigmoid)+binary_crossentropy;多類互斥單標籤 → Dense(K, softmax)+sparse/categorical_crossentropy;多標籤 → Dense(K, sigmoid)+binary_crossentropy。
  11. 讀預測:softmax 輸出後 argmax(axis=1) 挑最大機率的類別;最大機率本身可當信心分數。
  12. 防身術:訓練前 assert y_train.max() < 輸出單元數;開訓後看一眼 loss——分類任務的交叉熵不該是負的
完整程式碼