1. 程式人生 > 程式設計 >Keras構建神經網路踩坑(解決model.predict預測值全為0.0的問題)

Keras構建神經網路踩坑(解決model.predict預測值全為0.0的問題)

終於構建出了第一個神經網路,Keras真的很方便。

之前不知道Keras這麼方便,在構建神經網路的過程中繞了很多彎路,最開始學的TensorFlow,後來才知道Keras。

TensorFlow和Keras的關係,就像c語言和python的關係,所以Keras是真的好用。

搞不清楚資料的標準化和歸一化的關係,想對原始資料做歸一化,卻誤把資料做了標準化,導致用model.predict預測出來的值全是0.0,在網上搜了好久但是沒搜到答案,後來自己又把程式讀了一遍,突然靈光一現好像是資料歸一化出了問題,於是把資料預處理部分的標準化改成了歸一化,修改過來之後才能正常預測出來值,才得到應有的資料趨勢。

標準化:

(x-mean(x))/std(x) 這是使用z-score方法規範化

歸一化:

(x-min(x))/(max(x)-min(x)) 這是常用的最小最大規範化方法

補充知識:keras載入已經訓練好的模型檔案,進行預測時卻發現預測結果幾乎為同一類(本人預測時幾乎均為為第0類)**

原因:在進行keras訓練時候,使用了keras內建的資料讀取方式,但是在進行預測時候,使用了自定義的資料讀取方式,本人為圖片讀取。

解決辦法檢視如下程式碼:

##############訓練:
train_gen = ImageDataGenerator(rotation_range=10,width_shift_range=0.2,shear_range=0.2,zoom_range=0.2,fill_mode='constant',cval=0)
train_generator = train_gen.flow_from_directory(train_path,target_size=(224,224),batch_size=16,class_mode='categorical',save_to_dir=train_g,save_prefix='man',save_format='jpg')

#############預測
img = cv2.imread(img_path)
img = cv2.resize(img,(row,col))
img = np.expands(img,axis=0)
out = model.predict(img)
# 上述方法是不行的,仔細檢視keras內建讀取方式,可以觀察到內建了load_img方式
# 因此,我們在預測時候,將讀取圖片的方式改為
from keras.preprocessing.image import load_img,img_to_array
img = load_img(img_path)
img = img_to_array(img,target_size=(row,axis=0)
out = model.predict(img)

注:本文意在說明 對訓練資料和預測資料的讀取、預處理方式上應該在某種程度上保持一致,從而避免訓練結果和真實預測結果相差過大的情況。

以上這篇Keras構建神經網路踩坑(解決model.predict預測值全為0.0的問題)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。