看板 Python 關於我們 聯絡資訊
板上的大大好, 最近自學時所遇到這個問題不能理解, 我想利用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
TuCH: 所以是幾%?11/19 20:22
測了四組,第一個epoch就會99.5%以上,後面每個epoch都會是100%了,但是我以為應該 要第一個epoch就是100%,所以才會問這個問題
OnePiecePR: 就沒有說有模型看過資料就能夠100%的規定啊11/19 21:19
OnePiecePR: 有可能第一個epoch 67%,第二個epoch 76%,第三個82%,11/19 21:22
OnePiecePR: 慢慢爬上去,說不定爬到86%就上不去了。11/19 21:22
OnePiecePR: relu 還好啊。我也是新手,希望沒說錯。11/19 21:22
OnePiecePR: 不然就再加更多層啊。有沒有考慮第一個卷積層的 filte11/19 21:25
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
kaneson: 因為gradient descent 找 loss 的 local min 不是一次到11/19 22:32
kaneson: 位, learning rate也是因素11/19 22:32
瞭解,這感覺是我的問題的答案
ddavid: 這要看你的準確率怎麼算的吧?11/19 22:39
ddavid: 如果是設定為二元分類的話,照理說這邊只有0% 50% 100%三11/19 22:41
ddavid: 種值,當然這是你的兩張圖在training testing data都均勻11/19 22:42
ddavid: 的情況11/19 22:42
ddavid: 但如果你不是做成二元分類而是最後拿到一個分數,比如是A11/19 22:43
ddavid: 這張圖的分數0.8 B是0.2,然後把1/0做為正確答案的話,就11/19 22:44
ddavid: 會評估出非0% 50% 100%的評估值了11/19 22:45
ddavid: 另外如果在testing data裡面不均勻的話,當然也可能有不一11/19 22:46
ddavid: 樣的值出現,就算使用二元分類。比如是4:6的話就會有11/19 22:46
ddavid: 0% 40% 60% 100%四種可能11/19 22:47
ddavid: 而以99.5%這個情況來看,應該不是不均勻的狀態,所以就比 11/19 22:47
ddavid: 較像是你最後的結果是regression導致的,你得到了非常接近 11/19 22:48
ddavid: 1的分數,但可能訓練還有不足、或是lr不夠小導致最後掉不 11/19 22:49
ddavid: 到完美的那個點、又或者掉到某個99.5%的local maximum出不 11/19 22:50
ddavid: 來了之類的 11/19 22:50
不太懂二元分類跟分數的說法,二元分類是指只有兩種分類情況就是二元分類,還是說需 要特別去設定。 然後不均勻的狀態是指兩種資料的分佈嗎?但batch size不是會隨機將資料分配,還是因 為只有兩種資料,batch size 設為2容易造成分佈不均勻的情況。
numpy: 兩張圖片的情況下你複製資料1000倍跟跑1000倍的epochs其實 11/19 23:43
numpy: 應該是一樣的意思XD 11/19 23:43
numpy: 剛好你batch size是211/19 23:47
其實主要是我主觀認為應該要第一個epoch就要100%啦XD,因為我自己也沒講清楚我的問 題,但上面好像已經有答案了,就結果而言用相同的資料最終會達到100%是沒問題的,只 是不會在第1個epoch而已QQ。
ddavid: 其實如果有洗牌的話就有可能稍微跟1000倍epochs不一樣啦,11/20 00:08
ddavid: 因為前者就有可能連續多次train到同一張圖,改epochs的話11/20 00:08
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
ddavid: 二元分類其實就是你最後吐output之前有沒有過一層強制把它 11/20 22:45
ddavid: 變成1/0 or 1/-1 or 1/2這樣的輸出 11/20 22:46
ddavid: 如果沒有的話,例如兩個類別是1 2,那就可能吐出0.892、 11/20 22:47
ddavid: 1.812、1.433之類的值,而我們看離1近還離2近最終判斷是哪 11/20 22:48
ddavid: 一邊,但計算Error的時候是用實際的y去減預測出來這個值( 11/20 22:49
ddavid: 然後看取絕對值或平方或其他處理)來評估的 11/20 22:50
ddavid: 也就是說當你最後有沒有通過那層強制離散化處理,則計算的 11/20 22:51
ddavid: Error概念是有一點差別的 11/20 22:51
ddavid: 有通過的話,你評估的是 預測正確數/應預測總數,也就是以 11/20 22:52
ddavid: 案例「數量」為單位的評估 11/20 22:52
ddavid: 但最後沒有通過那樣一層的話,你評估的就會是「你的預測平 11/20 22:53
ddavid: 均離實際答案多近」。也就是答案是第2類,結果吐出1.9跟 11/20 22:54
ddavid: 1.6,雖然到最後實用時都會當成預測第2類正確來處理,但在 11/20 22:55
ddavid: 內部分析評估時1.9顯然是比1.6更好的預測 11/20 22:55
ddavid: 也因此,例如以你的情況,就算2000張圖都猜對了,但是對第 11/20 22:56
ddavid: 1類圖吐出的output都是1.005,對第2類圖吐出的都是1.995, 11/20 22:56
ddavid: 那麼你就還是有個0.005的平均誤差存在 11/20 22:57
ddavid: 即便實用上它吐出1.995我們就會做為預測為第2類來使用 11/20 22:58
ddavid: 然後洗牌的部分是說單一epoch裡面train圖的順序會打亂 11/20 22:58
ddavid: 比如你的training data裡面有500張A跟500張B,但連進500張 11/20 22:59
ddavid: A再進500張B循環,或者ABABABABAB循環,或者每個epoch都打 11/20 23:00
ddavid: 亂,第一個epoch AAABAAABBBABABBA...,第二個BBABAABBAB 11/20 23:00
ddavid: ...,不同的打亂方式是有可能讓訓練出來的模型出現差異的 11/20 23:01
ddavid: ,並不會因為都是同樣張數就肯定有一樣結果 11/20 23:02
ddavid: 這也會跟使用的機器學習模型有關,有些模型確實不受順序影 11/20 23:02
ddavid: 響,但以NN往往相對都比較會受到training data順序影響 11/20 23:03
Rockman5042: 把最後一層softmax改成sigmoid ,輸出就會只有0跟1 11/21 03:29
ddavid: sigmoid也沒有直接變成0/1啊 11/21 22:10
ddavid: 你要最後直接過一層離散化的0/1 function才行 11/21 22:11
ddavid: Sigmoid跟Softmax的差異不是在這邊 11/21 22:11
ddavid: Softmax確保一次輸出多個類別的機率值時,加總會是1 11/21 22:18
ddavid: 而Sigmoid沒有這個特性,它可以對A類別說0.9同時也對B類別 11/21 22:18
ddavid: 說是0.85 11/21 22:18
ddavid: 所以如果做multi-label learning的時候就比較會採Sigmoid 11/21 22:19