class LossAndErrorPrintingCallback(keras.callbacks.Callback):
def on_train_batch_end(self, batch, logs=None):
print("For batch {}, loss is {:7.2f}.".format(batch, logs["loss"]))
)
)
这个回调打印了每一批的损失,所以它应该是你要找的。 (如果需要度量,只需将logs["loss"]更改为logs["name of the metric"],例如logs["mean_absolute_error"] 编辑: 要检查日志中的度量名称,您可以打印日志的键并找到您正在搜索的ONA。
#! /usr/bin/env python
import numpy as np
import keras
from keras.metrics import MeanMetricWrapper
x=np.linspace(0, 1, 20000)[:,np.newaxis,np.newaxis]
y=np.sin(x*2*np.pi)
model = keras.Sequential()
model.add(keras.layers.Dense(4, activation="tanh", input_shape=(1,1)))
model.add(keras.layers.Dense(4, activation="tanh"))
model.add(keras.layers.Dense(4))
#####
# Here the Instantaneous metric variant
class InstMetric(MeanMetricWrapper):
def __init__(self, fn, **kwargs):
""" fn is the callable loss function you want to use in your metric """
super().__init__(fn=fn, **kwargs)
def update_state(self, y_true, y_pred, sample_weight=None):
self.reset_states()
return super().update_state(y_true, y_pred, sample_weight=sample_weight)
#####
model.compile(optimizer='adam', loss='mean_squared_error',
metrics=[
keras.metrics.MeanSquaredError(name="MSE"),
InstMetric(keras.metrics.mean_squared_error, name="IMSE")
]
)
model.fit(x=x, y=y, epochs=1, batch_size=5, steps_per_epoch=1000)
2条答案
按热度按时间odopli941#
我前一段时间打了个电话来解决这个问题。
你想这样称呼它。
但是这个回调打印的是平均值,只是在不同的行上,所以我不认为这是你想要的。
这反而:
这个回调打印了每一批的损失,所以它应该是你要找的。
(如果需要度量,只需将
logs["loss"]
更改为logs["name of the metric"]
,例如logs["mean_absolute_error"]
编辑:
要检查日志中的度量名称,您可以打印日志的键并找到您正在搜索的ONA。
在这种方法中,您应该只找到损失和度量的关键字。
来源:https://keras.io/guides/writing_your_own_callbacks/
osh3o9ms2#
MeanSquaredError度量的类层次结构的示例如下
有内置的方式吗?
主要问题是所有指标都是Reduce指标的子类,Reduce指标执行聚合,并且没有预见到要更改Reduce基类的行为。
如何实现这一点最容易
给定上面的模式,您可以通过创建MeanMetricWrapper的新指标子类来实现您想要的结果,该子类通过首先调用
self.reset_state
,然后调用MeanMetricWrapper.update_state
来覆盖MeanMetricWrapper的update_state方法。这样,底层Reduce基类中的聚合将只聚合一个值。工作示例如下:将此脚本存储为inst_demo.py,并通过
tr
运行它,以展开终端中的进度条因此,每次更新进度条时,您都会获得一个即时值。
如果您不想选择要使用的指标,也可以从任何可用的keras指标中导出InstMetric。