[問題] 請教有關CNN分類的問題

看板Python作者 (Shad0w)時間4年前 (2019/11/19 19:37), 4年前編輯推噓13(13051)
留言64則, 6人參與, 4年前最新討論串1/1
板上的大大好, 最近自學時所遇到這個問題不能理解, 我想利用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://www.ptt.cc/bbs/Python/M.1574163431.A.399.html

11/19 20:22, 4年前 , 1F
所以是幾%?
11/19 20:22, 1F
測了四組,第一個epoch就會99.5%以上,後面每個epoch都會是100%了,但是我以為應該 要第一個epoch就是100%,所以才會問這個問題

11/19 21:19, 4年前 , 2F
就沒有說有模型看過資料就能夠100%的規定啊
11/19 21:19, 2F

11/19 21:22, 4年前 , 3F
有可能第一個epoch 67%,第二個epoch 76%,第三個82%,
11/19 21:22, 3F

11/19 21:22, 4年前 , 4F
慢慢爬上去,說不定爬到86%就上不去了。
11/19 21:22, 4F

11/19 21:22, 4年前 , 5F
relu 還好啊。我也是新手,希望沒說錯。
11/19 21:22, 5F

11/19 21:25, 4年前 , 6F
不然就再加更多層啊。有沒有考慮第一個卷積層的 filte
11/19 21:25, 6F

11/19 21:25, 4年前 , 7F
r 比第二層多看看?
11/19 21:25, 7F
我會覺得要100%是因為都是同樣兩個資料的關係啦XD 所以想說有沒有其他原因導致這個 問題 基本上20個data在第二個epoch就會100%了 但我想說同樣的資料不是應該第一個e poch就應該100%嗎(? 才會提出這個問題 ※ 編輯: zax5566x2 (140.113.156.98 臺灣), 11/19/2019 21:34:29

11/19 22:32, 4年前 , 8F
因為gradient descent 找 loss 的 local min 不是一次到
11/19 22:32, 8F

11/19 22:32, 4年前 , 9F
位, learning rate也是因素
11/19 22:32, 9F
瞭解,這感覺是我的問題的答案

11/19 22:39, 4年前 , 10F
這要看你的準確率怎麼算的吧?
11/19 22:39, 10F

11/19 22:41, 4年前 , 11F
如果是設定為二元分類的話,照理說這邊只有0% 50% 100%三
11/19 22:41, 11F

11/19 22:42, 4年前 , 12F
種值,當然這是你的兩張圖在training testing data都均勻
11/19 22:42, 12F

11/19 22:42, 4年前 , 13F
的情況
11/19 22:42, 13F

11/19 22:43, 4年前 , 14F
但如果你不是做成二元分類而是最後拿到一個分數,比如是A
11/19 22:43, 14F

11/19 22:44, 4年前 , 15F
這張圖的分數0.8 B是0.2,然後把1/0做為正確答案的話,就
11/19 22:44, 15F

11/19 22:45, 4年前 , 16F
會評估出非0% 50% 100%的評估值了
11/19 22:45, 16F

11/19 22:46, 4年前 , 17F
另外如果在testing data裡面不均勻的話,當然也可能有不一
11/19 22:46, 17F

11/19 22:46, 4年前 , 18F
樣的值出現,就算使用二元分類。比如是4:6的話就會有
11/19 22:46, 18F

11/19 22:47, 4年前 , 19F
0% 40% 60% 100%四種可能
11/19 22:47, 19F

11/19 22:47, 4年前 , 20F
而以99.5%這個情況來看,應該不是不均勻的狀態,所以就比
11/19 22:47, 20F

11/19 22:48, 4年前 , 21F
較像是你最後的結果是regression導致的,你得到了非常接近
11/19 22:48, 21F

11/19 22:49, 4年前 , 22F
1的分數,但可能訓練還有不足、或是lr不夠小導致最後掉不
11/19 22:49, 22F

11/19 22:50, 4年前 , 23F
到完美的那個點、又或者掉到某個99.5%的local maximum出不
11/19 22:50, 23F

11/19 22:50, 4年前 , 24F
來了之類的
11/19 22:50, 24F
不太懂二元分類跟分數的說法,二元分類是指只有兩種分類情況就是二元分類,還是說需 要特別去設定。 然後不均勻的狀態是指兩種資料的分佈嗎?但batch size不是會隨機將資料分配,還是因 為只有兩種資料,batch size 設為2容易造成分佈不均勻的情況。

11/19 23:43, 4年前 , 25F
兩張圖片的情況下你複製資料1000倍跟跑1000倍的epochs其實
11/19 23:43, 25F

11/19 23:43, 4年前 , 26F
應該是一樣的意思XD
11/19 23:43, 26F

11/19 23:47, 4年前 , 27F
剛好你batch size是2
11/19 23:47, 27F
其實主要是我主觀認為應該要第一個epoch就要100%啦XD,因為我自己也沒講清楚我的問 題,但上面好像已經有答案了,就結果而言用相同的資料最終會達到100%是沒問題的,只 是不會在第1個epoch而已QQ。

11/20 00:08, 4年前 , 28F
其實如果有洗牌的話就有可能稍微跟1000倍epochs不一樣啦,
11/20 00:08, 28F

11/20 00:08, 4年前 , 29F
因為前者就有可能連續多次train到同一張圖,改epochs的話
11/20 00:08, 29F

11/20 00:09, 4年前 , 30F
就算洗牌也最多就是AB BA這樣的連續兩次XD
11/20 00:09, 30F
有洗牌的話是指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

11/20 22:45, 4年前 , 31F
二元分類其實就是你最後吐output之前有沒有過一層強制把它
11/20 22:45, 31F

11/20 22:46, 4年前 , 32F
變成1/0 or 1/-1 or 1/2這樣的輸出
11/20 22:46, 32F

11/20 22:47, 4年前 , 33F
如果沒有的話,例如兩個類別是1 2,那就可能吐出0.892、
11/20 22:47, 33F

11/20 22:48, 4年前 , 34F
1.812、1.433之類的值,而我們看離1近還離2近最終判斷是哪
11/20 22:48, 34F

11/20 22:49, 4年前 , 35F
一邊,但計算Error的時候是用實際的y去減預測出來這個值(
11/20 22:49, 35F

11/20 22:50, 4年前 , 36F
然後看取絕對值或平方或其他處理)來評估的
11/20 22:50, 36F

11/20 22:51, 4年前 , 37F
也就是說當你最後有沒有通過那層強制離散化處理,則計算的
11/20 22:51, 37F

11/20 22:51, 4年前 , 38F
Error概念是有一點差別的
11/20 22:51, 38F

11/20 22:52, 4年前 , 39F
有通過的話,你評估的是 預測正確數/應預測總數,也就是以
11/20 22:52, 39F

11/20 22:52, 4年前 , 40F
案例「數量」為單位的評估
11/20 22:52, 40F

11/20 22:53, 4年前 , 41F
但最後沒有通過那樣一層的話,你評估的就會是「你的預測平
11/20 22:53, 41F

11/20 22:54, 4年前 , 42F
均離實際答案多近」。也就是答案是第2類,結果吐出1.9跟
11/20 22:54, 42F

11/20 22:55, 4年前 , 43F
1.6,雖然到最後實用時都會當成預測第2類正確來處理,但在
11/20 22:55, 43F

11/20 22:55, 4年前 , 44F
內部分析評估時1.9顯然是比1.6更好的預測
11/20 22:55, 44F

11/20 22:56, 4年前 , 45F
也因此,例如以你的情況,就算2000張圖都猜對了,但是對第
11/20 22:56, 45F

11/20 22:56, 4年前 , 46F
1類圖吐出的output都是1.005,對第2類圖吐出的都是1.995,
11/20 22:56, 46F

11/20 22:57, 4年前 , 47F
那麼你就還是有個0.005的平均誤差存在
11/20 22:57, 47F

11/20 22:58, 4年前 , 48F
即便實用上它吐出1.995我們就會做為預測為第2類來使用
11/20 22:58, 48F

11/20 22:58, 4年前 , 49F
然後洗牌的部分是說單一epoch裡面train圖的順序會打亂
11/20 22:58, 49F

11/20 22:59, 4年前 , 50F
比如你的training data裡面有500張A跟500張B,但連進500張
11/20 22:59, 50F

11/20 23:00, 4年前 , 51F
A再進500張B循環,或者ABABABABAB循環,或者每個epoch都打
11/20 23:00, 51F

11/20 23:00, 4年前 , 52F
亂,第一個epoch AAABAAABBBABABBA...,第二個BBABAABBAB
11/20 23:00, 52F

11/20 23:01, 4年前 , 53F
...,不同的打亂方式是有可能讓訓練出來的模型出現差異的
11/20 23:01, 53F

11/20 23:02, 4年前 , 54F
,並不會因為都是同樣張數就肯定有一樣結果
11/20 23:02, 54F

11/20 23:02, 4年前 , 55F
這也會跟使用的機器學習模型有關,有些模型確實不受順序影
11/20 23:02, 55F

11/20 23:03, 4年前 , 56F
響,但以NN往往相對都比較會受到training data順序影響
11/20 23:03, 56F

11/21 03:29, 4年前 , 57F
把最後一層softmax改成sigmoid ,輸出就會只有0跟1
11/21 03:29, 57F

11/21 22:10, 4年前 , 58F
sigmoid也沒有直接變成0/1啊
11/21 22:10, 58F

11/21 22:11, 4年前 , 59F
你要最後直接過一層離散化的0/1 function才行
11/21 22:11, 59F

11/21 22:11, 4年前 , 60F
Sigmoid跟Softmax的差異不是在這邊
11/21 22:11, 60F

11/21 22:18, 4年前 , 61F
Softmax確保一次輸出多個類別的機率值時,加總會是1
11/21 22:18, 61F

11/21 22:18, 4年前 , 62F
而Sigmoid沒有這個特性,它可以對A類別說0.9同時也對B類別
11/21 22:18, 62F

11/21 22:18, 4年前 , 63F
說是0.85
11/21 22:18, 63F

11/21 22:19, 4年前 , 64F
所以如果做multi-label learning的時候就比較會採Sigmoid
11/21 22:19, 64F
文章代碼(AID): #1TqzFdEP (Python)
文章代碼(AID): #1TqzFdEP (Python)