具体各个函数参数可以查看官方文档
evaluate/evaluate_generator
evaluate接收的参数更为简单,大多数情况只需指定x和y。
evaluate_generator需要指定datagenerator。自定义datagenerator,带来的好处就是可以异步加载数据到内存,支持多线程等。
下面以evaluate_generator为例,介绍使用方法:
# Loss Function
model_func = {
'loss': tensor_angle_loss,
'metrics': [
coeff_determination,
accuracy_5,
accuracy_10,
]
}
model = Sequential()
# ...
# Optimizer
optimizer = optimizers.Adam(lr=0.0001)
# Compile
model.compile(optimizer=optimizer, loss=model_func['loss'], metrics=model_func['metrics'])
model.fit(...)
scores = model.evaluate_generator(generator=validation_generator,
workers=10,
use_multiprocessing=True,
verbose=0)
print('%s: %.2f' % (model.metrics_names[0], scores[0])) # Loss
print('%s: %.2f%%' % (model.metrics_names[1], scores[1] * 100)) # metrics1
print('%s: %.2f%%' % (model.metrics_names[2], scores[2] * 100)) # metrics2
print('%s: %.2f%%' % (model.metrics_names[3], scores[3] * 100)) # metrics3
说明:evaluate/evaluate_generator返回值长度等于你指定的评价函数数目+1个损失函数,比如上面代码在compile
时指定了1个损失函数(通常损失就只能一个吧)和3个评价函数(回归实验:拟合评价函数R2,误差5准确度,误差10准确度)。
输出:
loss: 27.43
coeff_determination: 85.39%
accuracy_5: 68.46%
accuracy_10: 77.13%
use_multiprocessing=True
代表使用多线程预加载batch,这时workers=10
代表允许最多10个线程。
注意到不管是evaluate方法需要指定batch_size
,还是evaluate_generator需要在generator指定batch_size
。如果你设置batch_size
不是1,得到评价结果可能就和下面介绍的predict/predict_generator得到结果再去评价是不一样的。
举个例子:
如果使用的是SSE(和方差、误差平方和)损失函数,而batch_size = 10
。那么1个batch
的SSE是10个验证样本的误差平方和,最总evaluate/evaluate_generator返回的loss则是所以batch的平均SSE。
这里记录一下使用R2评价的坑,假如验证是排序好的,一个batch内的
y_true
可能非常近似,这就导致TSS很小,而预测的值只要稍微偏离真实值RSS/TSS就会得到非常大的值,导致R2很小。就算把验证集打乱,使用evaluate/evaluate_generator函数得到也只是各个batch的R2平均,是不是和原本R2背离了呢?
R 2 = 1 − F V U = 1 − R S S T S S = 1 − ∑ i ( y i − f i ) 2 ∑ i ( y i − y ^ ) 2 R^{2}=1-\mathrm{FVU}=1-\frac{\mathrm{RSS}}{\mathrm{TSS}}=1-\frac{\sum_{i}\left(y_{i}-f_{i}\right)^{2}}{\sum_{i}\left(y_{i}-\hat{y}\right)^{2}} R2=1−FVU=1−TSSRSS=1−∑i(yi−y^)2∑i(yi−fi)2
上式中 y y y 是实际值, f f f 是预测值, y ^ \hat{y} y^ 是实际值的平均值。FVU被称为fraction of variance unexplained, RSS叫做Residual sum of squares, TSS叫做Total sum of squares。根据 R 2 R^{2} R2 的定 义,可以看到 R 2 R^{2} R2 是有可能小于O的,所以R2不是r的平方。一般地, R 2 R^{2} R2 越接近1,表示回归分析中自变量对因变量的解释越好。
predict/predict_generator
和evaluate/evaluate_generator参数差不多,只是不需要标签,返回值变为对应输入的预测输出list。不在赘述。
参考
Model 类(函数式 API)
相关系数r和决定系数R2的那些事
8 Tips for Interpreting R-Squared
What is the difference between Keras model.evaluate() and model.predict()?