我想将评估结果记录到具有tensorflow 2.0(keras)的文件中。我使用回调方法。它适用于model.fit,但似乎不适用于model.evaluate。 这是我的代码:
getDistinct:{[x] select count x from raw}
getDistinct "HEADER"
我将错误的评估结果记录到文件吗?
答案 0 :(得分:0)
这是预期的行为。 CSVLogger
仅实现用于训练的回调方法。
为了进行评估,由keras培训模块调用了on_test_begin()
,on_test_batch_begin()
,on_test_batch_end()
和on_test_end()
回调方法,这些方法不是CSVLogger实施的,因此在使用时不会创建csv文件使用model.evaluate()。
可以像这样实现自定义CSV回调:
class MyCSVLogger(Callback):
def __init__(self, filename):
self.filename = filename
print(filename)
def on_test_begin(self, logs=None):
# open csv file
print('test begin')
def on_test_batch_begin(self, batch, logs=None):
pass
def on_test_batch_end(self, batch, logs=None):
# write the contents of the dictionary logs to csv file
# sample content of logs {'batch': 0, 'size': 2, 'loss': -0.0, 'accuracy': 1.0}
print(logs)
def on_test_end(self, logs=None):
# close csv file
print('test end')
csv_logger = MyCSVLogger('abc.csv')
model.evaluate(X_eval,y_eval, callbacks=[csv_logger])
答案 1 :(得分:0)
在这里,将我的2美分加到Manoj Mohan的出色回答中。它有些hacky,但我发现添加以下代码行使其可用于TF2.1:
from tensorflow.keras.callbacks import CSVLogger
CSVLogger.on_test_begin = CSVLogger.on_train_begin
CSVLogger.on_test_batch_end = CSVLogger.on_epoch_end
CSVLogger.on_test_end = CSVLogger.on_train_end
基本上,它只是将测试用例功能添加到CSVLogger类中,这些用例功能与训练用例功能相同。唯一需要注意的是,它还会在CSV文件中创建一个纪元列。保存的统计信息来自批次