問題描述:
在利用神經網絡進行分類和識別的時候,使用了keras這個封裝層次比較高的框架,backend使用的是tensorflow-cpu。
在交叉驗證的時候,出現 val_categorical_accuracy: 0.0000e+00的問題。
問題分析:
首先,弄清楚,訓練集、驗證集、測試集的區別,驗證集是從訓練集中提前拿出一部分的數據集。在keras中,一般都是使用這種方式來指定驗證集佔訓練集和的總大小。
validation_split=0.2
比如,經典的數據集MNIST,共有60000個訓練集,就會
Train on 48000 samples, validate on 12000 samples
我自己學習使用的數據集比較小
訓練數據集樣本數: 498 ,標籤個數 498
Train on 398 samples, validate on 100 samples
基本上符合4:1(0.2)的分配
出現 val_categorical_accuracy: 0.0000e+00的問題,我這邊的原因主要是,樣本本身是有規律的,導致分配的驗證集的標籤可能在訓練集中可能就沒有。
(PS:我實際看了下,498個樣本共10個標籤,後100個驗證集佔據了基本上後面3個標籤(實際上,這三個標籤佔了103個樣本),也就是前面的訓練集基本上就沒有後面的標籤,整體佔據前面7個標籤)
問題解決:
把最初始的訓練集打亂,當然,標籤也要跟着移動。
index = [i for i in range(len(x_train))]
np.random.shuffle(index)
x_train = x_train[index]
y_train = y_train[index]
model.fit(x_train, y_train, batch_size=32, epochs=10, validation_split=0.2, verbose=1)
同樣的問題表現,可能有不同的原因,解決方法也不盡相同,這裏只是和大家分享我自己的問題解決過程。