作者zax5566x2 (Shad0w)
看板Python
標題[問題] 請教有關CNN分類的問題
時間Tue Nov 19 19:37:09 2019
板上的大大好,
最近自學時所遇到這個問題不能理解,
我想利用keras分類2個圖片,
我將這2個圖片資料複製成2000個,
也就是各1000個相同的資料,
並將其中20%設為驗證組,
在沒有設定Dropout的情況下,
為什麼訓練組在第1次訓練時,準確率不會是100%,
因為是用一模一樣的資料不是應該不會有錯誤的情況,
我想問是因為activation的選用所造成的,還是有其他因素導致這個結果?
希望有人能替我解惑,感謝。
以下是模型有關的code
#建立模型
model = Sequential()
# 模型加入【輸入層】與【第一層卷積層】
model.add(Conv2D(filters=16,
kernel_size=(5,5),
padding='same',
input_shape=(306,102,1),
activation='relu'))
# 模型加入【第一層池化層】
model.add(MaxPooling2D(pool_size=(2, 2)))
# 模型加入【第二層卷積層】
model.add(Conv2D(filters=64,
kernel_size=(5,5),
padding='same',
activation='relu')
# 模型加入【第二層池化層】
model.add(MaxPooling2D(pool_size=(2, 2)))
# 模型加入【平坦層】
model.add(Flatten())
# 模型加入【隱藏層】
model.add(Dense( units = 128,
activation='relu'))
model.add(Dense(2,
activation='softmax'))
print(model.summary())
# 設定模型的訓練方式
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
train_history=model.fit(x=x_Train4D_normalize,
y=y_TrainOneHot,
validation_split=0.2,
epochs=5,
batch_size=2,
verbose=2)
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.156.98 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1574163431.A.399.html
1F:推 TuCH: 所以是幾%?11/19 20:22
測了四組,第一個epoch就會99.5%以上,後面每個epoch都會是100%了,但是我以為應該
要第一個epoch就是100%,所以才會問這個問題
2F:推 OnePiecePR: 就沒有說有模型看過資料就能夠100%的規定啊11/19 21:19
3F:推 OnePiecePR: 有可能第一個epoch 67%,第二個epoch 76%,第三個82%,11/19 21:22
4F:→ OnePiecePR: 慢慢爬上去,說不定爬到86%就上不去了。11/19 21:22
5F:→ OnePiecePR: relu 還好啊。我也是新手,希望沒說錯。11/19 21:22
6F:推 OnePiecePR: 不然就再加更多層啊。有沒有考慮第一個卷積層的 filte11/19 21:25
7F:→ OnePiecePR: r 比第二層多看看?11/19 21:25
我會覺得要100%是因為都是同樣兩個資料的關係啦XD 所以想說有沒有其他原因導致這個
問題 基本上20個data在第二個epoch就會100%了 但我想說同樣的資料不是應該第一個e
poch就應該100%嗎(? 才會提出這個問題
※ 編輯: zax5566x2 (140.113.156.98 臺灣), 11/19/2019 21:34:29
8F:推 kaneson: 因為gradient descent 找 loss 的 local min 不是一次到11/19 22:32
9F:→ kaneson: 位, learning rate也是因素11/19 22:32
瞭解,這感覺是我的問題的答案
10F:推 ddavid: 這要看你的準確率怎麼算的吧?11/19 22:39
11F:→ ddavid: 如果是設定為二元分類的話,照理說這邊只有0% 50% 100%三11/19 22:41
12F:→ ddavid: 種值,當然這是你的兩張圖在training testing data都均勻11/19 22:42
13F:→ ddavid: 的情況11/19 22:42
14F:→ ddavid: 但如果你不是做成二元分類而是最後拿到一個分數,比如是A11/19 22:43
15F:→ ddavid: 這張圖的分數0.8 B是0.2,然後把1/0做為正確答案的話,就11/19 22:44
16F:→ ddavid: 會評估出非0% 50% 100%的評估值了11/19 22:45
17F:→ ddavid: 另外如果在testing data裡面不均勻的話,當然也可能有不一11/19 22:46
18F:→ ddavid: 樣的值出現,就算使用二元分類。比如是4:6的話就會有11/19 22:46
19F:→ ddavid: 0% 40% 60% 100%四種可能11/19 22:47
20F:→ ddavid: 而以99.5%這個情況來看,應該不是不均勻的狀態,所以就比 11/19 22:47
21F:→ ddavid: 較像是你最後的結果是regression導致的,你得到了非常接近 11/19 22:48
22F:→ ddavid: 1的分數,但可能訓練還有不足、或是lr不夠小導致最後掉不 11/19 22:49
23F:→ ddavid: 到完美的那個點、又或者掉到某個99.5%的local maximum出不 11/19 22:50
24F:→ ddavid: 來了之類的 11/19 22:50
不太懂二元分類跟分數的說法,二元分類是指只有兩種分類情況就是二元分類,還是說需
要特別去設定。
然後不均勻的狀態是指兩種資料的分佈嗎?但batch size不是會隨機將資料分配,還是因
為只有兩種資料,batch size 設為2容易造成分佈不均勻的情況。
25F:推 numpy: 兩張圖片的情況下你複製資料1000倍跟跑1000倍的epochs其實 11/19 23:43
26F:→ numpy: 應該是一樣的意思XD 11/19 23:43
27F:推 numpy: 剛好你batch size是211/19 23:47
其實主要是我主觀認為應該要第一個epoch就要100%啦XD,因為我自己也沒講清楚我的問
題,但上面好像已經有答案了,就結果而言用相同的資料最終會達到100%是沒問題的,只
是不會在第1個epoch而已QQ。
28F:推 ddavid: 其實如果有洗牌的話就有可能稍微跟1000倍epochs不一樣啦,11/20 00:08
29F:→ ddavid: 因為前者就有可能連續多次train到同一張圖,改epochs的話11/20 00:08
30F:→ ddavid: 就算洗牌也最多就是AB BA這樣的連續兩次XD11/20 00:09
有洗牌的話是指batch size會隨機分佈,導致每個batch裡兩種圖像數量分佈不一樣,所
以還是跟1000倍epoch不一樣嘛(?希望我理解沒有錯
※ 編輯: zax5566x2 (140.113.156.98 臺灣), 11/20/2019 21:39:12
※ 編輯: zax5566x2 (140.113.156.98 臺灣), 11/20/2019 21:41:15
31F:推 ddavid: 二元分類其實就是你最後吐output之前有沒有過一層強制把它 11/20 22:45
32F:→ ddavid: 變成1/0 or 1/-1 or 1/2這樣的輸出 11/20 22:46
33F:→ ddavid: 如果沒有的話,例如兩個類別是1 2,那就可能吐出0.892、 11/20 22:47
34F:→ ddavid: 1.812、1.433之類的值,而我們看離1近還離2近最終判斷是哪 11/20 22:48
35F:→ ddavid: 一邊,但計算Error的時候是用實際的y去減預測出來這個值( 11/20 22:49
36F:→ ddavid: 然後看取絕對值或平方或其他處理)來評估的 11/20 22:50
37F:→ ddavid: 也就是說當你最後有沒有通過那層強制離散化處理,則計算的 11/20 22:51
38F:→ ddavid: Error概念是有一點差別的 11/20 22:51
39F:→ ddavid: 有通過的話,你評估的是 預測正確數/應預測總數,也就是以 11/20 22:52
40F:→ ddavid: 案例「數量」為單位的評估 11/20 22:52
41F:→ ddavid: 但最後沒有通過那樣一層的話,你評估的就會是「你的預測平 11/20 22:53
42F:→ ddavid: 均離實際答案多近」。也就是答案是第2類,結果吐出1.9跟 11/20 22:54
43F:→ ddavid: 1.6,雖然到最後實用時都會當成預測第2類正確來處理,但在 11/20 22:55
44F:→ ddavid: 內部分析評估時1.9顯然是比1.6更好的預測 11/20 22:55
45F:→ ddavid: 也因此,例如以你的情況,就算2000張圖都猜對了,但是對第 11/20 22:56
46F:→ ddavid: 1類圖吐出的output都是1.005,對第2類圖吐出的都是1.995, 11/20 22:56
47F:→ ddavid: 那麼你就還是有個0.005的平均誤差存在 11/20 22:57
48F:→ ddavid: 即便實用上它吐出1.995我們就會做為預測為第2類來使用 11/20 22:58
49F:→ ddavid: 然後洗牌的部分是說單一epoch裡面train圖的順序會打亂 11/20 22:58
50F:→ ddavid: 比如你的training data裡面有500張A跟500張B,但連進500張 11/20 22:59
51F:→ ddavid: A再進500張B循環,或者ABABABABAB循環,或者每個epoch都打 11/20 23:00
52F:→ ddavid: 亂,第一個epoch AAABAAABBBABABBA...,第二個BBABAABBAB 11/20 23:00
53F:→ ddavid: ...,不同的打亂方式是有可能讓訓練出來的模型出現差異的 11/20 23:01
54F:→ ddavid: ,並不會因為都是同樣張數就肯定有一樣結果 11/20 23:02
55F:→ ddavid: 這也會跟使用的機器學習模型有關,有些模型確實不受順序影 11/20 23:02
56F:→ ddavid: 響,但以NN往往相對都比較會受到training data順序影響 11/20 23:03
57F:推 Rockman5042: 把最後一層softmax改成sigmoid ,輸出就會只有0跟1 11/21 03:29
58F:推 ddavid: sigmoid也沒有直接變成0/1啊 11/21 22:10
59F:→ ddavid: 你要最後直接過一層離散化的0/1 function才行 11/21 22:11
60F:→ ddavid: Sigmoid跟Softmax的差異不是在這邊 11/21 22:11
61F:推 ddavid: Softmax確保一次輸出多個類別的機率值時,加總會是1 11/21 22:18
62F:→ ddavid: 而Sigmoid沒有這個特性,它可以對A類別說0.9同時也對B類別 11/21 22:18
63F:→ ddavid: 說是0.85 11/21 22:18
64F:→ ddavid: 所以如果做multi-label learning的時候就比較會採Sigmoid 11/21 22:19