[問題] CNN模型只會預測同一個分類結果

作者: chuneee (chuneee)   2020-03-26 20:30:19
更新:補充資料集&code
我的資料集是使用 Free Music Archive
參照的方法是像此網址 https://bit.ly/3aoIbUh
只是我想嘗試只用CNN進行分類預測
原始資料如以下,每筆資料的數值都介於 -80~0
[[-33.74863434 -27.84932709 -22.6257019 ... -21.47132492 -19.61938477
-14.22393227]
[-16.31633759 -29.69265747 -25.40621376 ... -28.50727081 -11.46302605
-4.04836655]
[ -9.1305275 -10.00378227 -28.46733665 ... -23.54629517 -20.91897202
-1.38314819]
...
[-63.33175659 -66.34197998 -68.40023804 ... -73.8707428 -68.64536285
-67.72910309]
[-67.61167908 -67.59188843 -66.96526337 ... -70.63095856 -74.70448303
-72.90202332]
[-71.49047852 -74.54782104 -69.39613342 ... -80. -80.
-80. ]]
我所進行的處理是全部取絕對值並標準化到0~1
如下
[[0.42185793]
[0.34811659]
[0.28282127]
...
[0.26839156]
[0.24524231]
[0.17779915]]
[[0.20395422]
[0.37115822]
[0.31757767]
...
[0.35634089]
[0.14328783]
[0.05060458]]
[[0.11413159]
[0.12504728]
[0.35584171]
...
[0.29432869]
[0.26148715]
[0.01728935]]
...
[[0.79164696]
[0.82927475]
[0.85500298]
...
[0.92338428]
[0.85806704]
[0.84661379]]
[[0.84514599]
[0.84489861]
[0.83706579]
...
[0.88288698]
[0.93380604]
[0.91127529]]
[[0.89363098]
[0.93184776]
[0.86745167]
...
[1. ]
[1. ]
[1. ]]
以下是訓練部分完整程式
result=np.load('specarc_128640_8442.npz')
spl=result['spec']
tid=result['trackgenre']
#Onthot Encoding
from sklearn.preprocessing import LabelEncoder
enc = LabelEncoder()
temp=tid
enc.fit(temp)
temp=enc.transform(temp)
print(temp)
from sklearn.preprocessing import OneHotEncoder
ohe=OneHotEncoder()
encoded=ohe.fit(temp.reshape(-1,1))
temp=encoded.transform(temp.reshape(-1,1)).toarray()
print(temp)
print('length:',len(temp))
#給定特徵值&標籤
labels = temp
Features = spl
x_train = Features[:8000]
y_train = labels[:8000]
x_test = Features[8000:]
y_test = labels[8000:]
x_train=np.abs(x_train)
x_test=np.abs(x_test)
x_train = x_train.reshape(8000,128,646,1)/80
x_test = x_test.reshape(442,128,646,1)/80
print(x_train.shape)
print(x_train[0].shape)
print(x_train[0])
model = Sequential()
model.add(Conv2D(16, kernel_size=(5,5),
activation='relu',kernel_initializer='random_uniform',
input_shape=(128,646,1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())
model.add(Conv2D(8, kernel_size=(5,5), activation='relu',
kernel_initializer='random_uniform', input_shape=(64,321,1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(BatchNormalization())
model.add(Flatten())
model.add(Dense(16, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(9, activation = 'softmax'))
opt=optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999,
amsgrad=False)
model.compile(loss='categorical_crossentropy', optimizer=opt,
metrics=['accuracy'])
print(model.summary())
=====================================================================
(以下原文)
大家好~
我目前在嘗試用CNN來做圖片的分類,不過遇到了一個問題
就是訓練出來的模型,只會output同一個結果,因此準確度極低
我的資料集總共有9類,每類包含一千張圖片,每張圖片大小是128*646
我的程式碼和訓練結果如圖
https://i.imgur.com/j5t84k1.png
(圖裡左下角是實際標籤跟預測的值)
可以看到不管input是什麼,模型output的值都一模一樣
但同一個模型在跑MNIST這個資料集的分類時,是有九成五的效果
不曉得是哪裡出了問題...
我總共嘗試過更改:
初始化方法、最佳化方法、損失函數、或是跑更多個epoch但結果都一樣
不過當我:
把kernel數量設為1 或是把激發函數設為tanh的時候,預測的值就會不同了
(但準確度只能達到兩三成而已)
1.我覺得很疑惑的地方是為什麼kernel數為1時 模型看起來比較有在學習
2.我的圖片中的值的範圍在0~80,都是正數,為何用tanh會避免單一預測結果
(不過可以觀察到tanh的預測結果仍是偏向某個類別)
爬過很多stackoverflow的問題都沒有找到可以解決的方法...
在這裡向大家請教~希望有人可以解惑
另外先謝謝大家的回答!
作者: watashino (我同學數學很爛)   2020-03-26 21:59:00
你model太小了吧,mnist圖大小也才28x28x1你光是圖片的一個邊都比他大了另外你說圖片的值都在0到80之間,建議還是做一下normalization吧就算只是除80意思一下也會好很多還有就是你的模型長得大概跟你想得不太一樣,基本的東西先看熟吧欸對還有,model連train起來都有問題了不要dropout
作者: zax5566x2 (Shad0w)   2020-03-26 22:04:00
你input圖片蠻大的,可以調大filter試試看吧我說的是filter數量
作者: watashino (我同學數學很爛)   2020-03-27 01:34:00
建議先去翻翻書吧或看看李弘毅
作者: karco (karco)   2020-03-27 02:37:00
我覺得需要標準化,filter數量也可以調大一點,可以去了解filter移動的原理,因為你圖片的長寬不同,所以可以去自己調一下size然後加深一點的效果應該會好一點
作者: Starcraft2 (來自星海的你)   2020-03-27 04:05:00
http://speech.ee.ntu.edu.tw/~tlkagk/courses.html推李弘毅 可以跟3月剛開始的ML課程 還有看他之前youtube channel上的影片集林軒田的課也推薦 不過比較從數學跟統計的角度切入
作者: empireisme (empireisme)   2020-03-27 11:02:00
不如請妳把程式碼和dataset貼上來這樣大家要改也比較好改
作者: watashino (我同學數學很爛)   2020-03-27 14:36:00
我再強調一次 你應該不知道自己每一層的output shape是甚麼你conv接linear那邊從10000多維直接降到16維我不確定是不是導致了這個原因,可以修的地方很多所以才建議你先翻書或者是找一個好一點的model跟著做做看
作者: Ryspon (Ry)   2020-03-28 03:27:00
把第二個 Conv2D 的 input shape 拿掉試試看

Links booklink

Contact Us: admin [ a t ] ucptt.com