1. 程式人生 > 程式設計 >keras輸出預測值和真實值方式

keras輸出預測值和真實值方式

在使用keras搭建神經網路時,有時需要檢視一下預測值和真是值的具體數值,然後可以進行一些其他的操作。這幾天查閱了很多資料。好像沒辦法直接access到訓練時的資料。所以我們可以通過回撥函式,傳入新的資料,然後檢視預測值和真是值。

參考這篇解決:

https://stackoverflow.com/questions/47079111/create-keras-callback-to-save-model-predictions-and-targets-for-each-batch-durin

我的解決方法是這樣的:

from keras.callbacks import Callback
import tensorflow as tf
import numpy as np
class my_callback(Callback):
 def __init__(self,dataGen,showTestDetail=True):
  self.dataGen=dataGen
  self.showTestDetail=showTestDetail
  self.predhis = []
  self.targets = []
 def mape(self,y,predict):
  diff = np.abs(np.array(y) - np.array(predict))
  return np.mean(diff / y)
 def on_epoch_end(self,epoch,logs=None):
  x_test,y_test=next(self.dataGen)
  prediction = self.model.predict(x_test)
  self.predhis.append(prediction)
  #print("Prediction shape: {}".format(prediction.shape))
  #print("Targets shape: {}".format(y_test.shape))
  if self.showTestDetail:
   for index,item in enumerate(prediction):
    print(item,"=====",y_test[index],"====",y_test[index]-item)
  testLoss=self.mape(y_test,prediction)
  print("test loss is :{}".format(testLoss))

畫一下知識點,我們在繼承的callback中實現 on_epoch_end方法:

x_test,y_test=next(self.dataGen)

這個資料生成方法是這樣的

import numpy as np
def shuffleDatas(x,y):

 shuffleIndex=np.arange(len(x))
 np.random.shuffle(shuffleIndex)
 x=x[shuffleIndex]
 y=y[shuffleIndex]
 return x,y
def dataGen(x,batchsize=8,shuffle=True):
 assert len(x) == len(y)
 while True:
  if shuffle:
   x,y=shuffleDatas(x,y)
  index=0
  while index+batchsize<len(x):
   yield (x[index:index+batchsize],y[index:index+batchsize])
   index=index+batchsize

使用yield可以減少記憶體的使用,而且顯得很高階。

補充知識:keras從訓練到預測,函式的選擇:fit,fit_generator,predict,predict_generator

如下所示:

keras輸出預測值和真實值方式

留下回調函式和如何通過預處理來建立生成輸入的函式這兩個問題

以上這篇keras輸出預測值和真實值方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。