我想在训练时间内检查我的损失值,以便我可以在每次迭代处观察损失。到目前为止
如果没有办法绘制此内容,那么如果我可以简单地在分类器的末尾获取最终损失值。
。注意:我知道某些解决方案是封闭形式的事实。我正在使用几个没有分析解决方案的分类器,例如逻辑回归和SVM。
有人有任何建议吗?
,所以我找不到关于直接获取每次迭代损失值的很好的文档,但我希望这将来会对某人有所帮助:
old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()
clf = SGDClassifier(**kwargs, verbose=1)
clf.fit(X_tr, y_tr)
sys.stdout = old_stdout
loss_history = mystdout.getvalue()
loss_list = []
for line in loss_history.split('n'):
if(len(line.split("loss: ")) == 1):
continue
loss_list.append(float(line.split("loss: ")[-1]))
plt.figure()
plt.plot(np.arange(len(loss_list)), loss_list)
plt.savefig("warmstart_plots/pure_SGD:"+str(kwargs)+".png")
plt.xlabel("Time in epochs")
plt.ylabel("Loss")
plt.close()
此代码将采用普通的SGDClassifier(几乎所有线性分类器(,并拦截verbose=1
标志,然后将分开以从冗长的打印中损失。显然这是较慢的,但会给我们带来损失并打印。
使用model.loss_curve_
。
您可以使用verbose
选项在每次迭代上打印值,但是如果您想要实际的值,这不是继续进行的最佳方法,因为您需要做一些骇人听闻的事情来解析它们。
是的,该文档不会提及有关此属性的任何内容,但是如果您检查源代码,您可能会注意到MLPClassifier
基类(BaseMultilayerPerceptron
(中的一个实际上定义了一个属性loss_curve_
iterarion。
当您在列表中获取所有值时,绘图应使用任何库。
请注意,此属性仅在使用随机求解器(即sgd
或adam
(时存在。
我刚刚改编并更新了@oneraynyday的答案。使用上下文管理器更优雅。
定义上下文管理器:
import sys
import io
import matplotlib.pyplot as plt
class DisplayLossCurve(object):
def __init__(self, print_loss=False):
self.print_loss = print_loss
"""Make sure the model verbose is set to 1"""
def __enter__(self):
self.old_stdout = sys.stdout
sys.stdout = self.mystdout = io.StringIO()
def __exit__(self, *args, **kwargs):
sys.stdout = self.old_stdout
loss_history = self.mystdout.getvalue()
loss_list = []
for line in loss_history.split('n'):
if(len(line.split("loss: ")) == 1):
continue
loss_list.append(float(line.split("loss: ")[-1]))
plt.figure()
plt.plot(np.arange(len(loss_list)), loss_list)
plt.xlabel("Epoch")
plt.ylabel("Loss")
if self.print_loss:
print("=============== Loss Array ===============")
print(np.array(loss_list))
return True
用法:
from sklearn.linear_model import SGDRegressor
model = SGDRegressor(verbose=1)
with DisplayLossCurve():
model.fit(X, Y)
# OR
with DisplayLossCurve(print_loss=True):
model.fit(X, Y)