在使用keras搭建神经网络时,有时需要查看一下预测值和真是值的具体数值,然后可以进行一些其他的操作。这几天查阅了很多资料。好像没办法直接access到训练时的数据。所以我们可以通过回调函数,传入新的数据,然后查看预测值和真是值。
参考这篇解决:
我的解决方法是这样的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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)
这个数据生成方法是这样的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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,y,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输出预测值和真实值方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/superxuezhazha/p/10820199.html