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

作者: zax5566x2 (Shad0w)   2019-11-19 19:37:09
板上的大大好,
最近自學時所遇到這個問題不能理解,
我想利用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)
作者: TuCH (謬客)   2019-11-19 20:22:00
所以是幾%?
作者: OnePiecePR (OPPR)   2019-11-19 21:19:00
就沒有說有模型看過資料就能夠100%的規定啊有可能第一個epoch 67%,第二個epoch 76%,第三個82%,慢慢爬上去,說不定爬到86%就上不去了。relu 還好啊。我也是新手,希望沒說錯。不然就再加更多層啊。有沒有考慮第一個卷積層的 filter 比第二層多看看?
作者: kaneson (Lance)   2019-11-19 22:32:00
因為gradient descent 找 loss 的 local min 不是一次到位, learning rate也是因素
作者: ddavid (謊言接線生)   2019-11-19 22:39:00
這要看你的準確率怎麼算的吧?如果是設定為二元分類的話,照理說這邊只有0% 50% 100%三種值,當然這是你的兩張圖在training testing data都均勻的情況但如果你不是做成二元分類而是最後拿到一個分數,比如是A這張圖的分數0.8 B是0.2,然後把1/0做為正確答案的話,就會評估出非0% 50% 100%的評估值了另外如果在testing data裡面不均勻的話,當然也可能有不一樣的值出現,就算使用二元分類。比如是4:6的話就會有0% 40% 60% 100%四種可能而以99.5%這個情況來看,應該不是不均勻的狀態,所以就比較像是你最後的結果是regression導致的,你得到了非常接近1的分數,但可能訓練還有不足、或是lr不夠小導致最後掉不到完美的那個點、又或者掉到某個99.5%的local maximum出不來了之類的
作者: numpy (那麼拍)   2019-11-19 23:43:00
兩張圖片的情況下你複製資料1000倍跟跑1000倍的epochs其實應該是一樣的意思XD剛好你batch size是2
作者: ddavid (謊言接線生)   2019-11-20 00:08:00
其實如果有洗牌的話就有可能稍微跟1000倍epochs不一樣啦,因為前者就有可能連續多次train到同一張圖,改epochs的話就算洗牌也最多就是AB BA這樣的連續兩次XD
作者: Rockman5042 (洛克麵)   2019-11-21 03:29:00
把最後一層softmax改成sigmoid ,輸出就會只有0跟1
作者: ddavid (謊言接線生)   2019-11-21 22:10:00
sigmoid也沒有直接變成0/1啊你要最後直接過一層離散化的0/1 function才行Sigmoid跟Softmax的差異不是在這邊Softmax確保一次輸出多個類別的機率值時,加總會是1而Sigmoid沒有這個特性,它可以對A類別說0.9同時也對B類別說是0.85所以如果做multi-label learning的時候就比較會採Sigmoid

Links booklink

Contact Us: admin [ a t ] ucptt.com