【深度学习实战(30)】训练框架之使用tensorboard记录loss

一、 安装Tensorboard库

pip install tensorflow 
pip install tensorboardx

二、LossHistory类实现过程

1. init构造函数
传入参数log保存路径,模型,模型输入尺寸

def __init__(self, log_dir, model, input_shape):

实例化SummaryWriter对象

self.writer     = SummaryWriter(self.log_dir)
  1. tensorboard.SummaryWriter.add_graph记录model
 try:
        dummy_input     = torch.randn(2, 3, input_shape[0], input_shape[1])
            self.writer.add_graph(model, dummy_input)
        except:
            pass

训练结束后查看保存的模型
在这里插入图片描述
在这里插入图片描述

  1. 记录loss
self.losses.append(loss)
self.val_loss.append(val_loss)
  1. txt文档记录loss
with open(os.path.join(self.log_dir, "epoch_loss.txt"), 'a') as f:
    f.write(str(loss))
    f.write("\n")
with open(os.path.join(self.log_dir, "epoch_val_loss.txt"), 'a') as f:
    f.write(str(val_loss))
    f.write("\n")

训练完后,查看epoch_loss.txtepoch_val_loss.txt
在这里插入图片描述
在这里插入图片描述

  1. tensorboard.SummaryWriter.add_scalar记录loss
self.writer.add_scalar('loss', loss, epoch)
self.writer.add_scalar('val_loss', val_loss, epoch)

训练结束后查看保存的loss
在这里插入图片描述
在这里插入图片描述

  1. pyplot绘制loss曲线图
def loss_plot(self):
    iters = range(len(self.losses))

    plt.figure()
    plt.plot(iters, self.losses, 'red', linewidth = 2, label='train loss')
    plt.plot(iters, self.val_loss, 'coral', linewidth = 2, label='val loss')
    try:
        if len(self.losses) < 25:
            num = 5
        else:
            num = 15
        
        plt.plot(iters, scipy.signal.savgol_filter(self.losses, num, 3), 'green', linestyle = '--', linewidth = 2, label='smooth train loss')
        plt.plot(iters, scipy.signal.savgol_filter(self.val_loss, num, 3), '#8B4513', linestyle = '--', linewidth = 2, label='smooth val loss')
    except:
        pass

    plt.grid(True)
    plt.xlabel('Epoch')
    plt.ylabel('Loss')
    plt.legend(loc="upper right")

    plt.savefig(os.path.join(self.log_dir, "epoch_loss.png"))

    plt.cla()
    plt.close("all")

查看loss曲线图
在这里插入图片描述

三、LossHistory类完整代码

import os
import torch
from torch.utils.tensorboard import SummaryWriter
import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot as plt
import scipy.signal


class LossHistory():
    def __init__(self, log_dir, model, input_shape):
        self.log_dir    = log_dir
        self.losses     = []
        self.val_loss   = []
        
        os.makedirs(self.log_dir)
        self.writer     = SummaryWriter(self.log_dir)
        try:
    # --------- 1. tensorboard.SummaryWriter.add_graph记录model -------------#
            dummy_input     = torch.randn(2, 3, input_shape[0], input_shape[1],use_strict_trace=False)
            self.writer.add_graph(model, dummy_input)
        except:
            pass

    def append_loss(self, epoch, loss, val_loss):
        if not os.path.exists(self.log_dir):
            os.makedirs(self.log_dir)
    # --------- 2. 保存loss -------------#
        self.losses.append(loss)
        self.val_loss.append(val_loss)

    # --------- 3. txt记录loss -------------#
        with open(os.path.join(self.log_dir, "epoch_loss.txt"), 'a') as f:
            f.write(str(loss))
            f.write("\n")
        with open(os.path.join(self.log_dir, "epoch_val_loss.txt"), 'a') as f:
            f.write(str(val_loss))
            f.write("\n")

    # --------- 4. tensorboard.SummaryWriter.add_scalar记录loss -------------#
        self.writer.add_scalar('loss', loss, epoch)
        self.writer.add_scalar('val_loss', val_loss, epoch)
        self.loss_plot()

    # --------- 5. pyplot绘制loss曲线图 -------------#
    def loss_plot(self):
        iters = range(len(self.losses))

        plt.figure()
        plt.plot(iters, self.losses, 'red', linewidth = 2, label='train loss')
        plt.plot(iters, self.val_loss, 'coral', linewidth = 2, label='val loss')
        try:
            if len(self.losses) < 25:
                num = 5
            else:
                num = 15
            
            plt.plot(iters, scipy.signal.savgol_filter(self.losses, num, 3), 'green', linestyle = '--', linewidth = 2, label='smooth train loss')
            plt.plot(iters, scipy.signal.savgol_filter(self.val_loss, num, 3), '#8B4513', linestyle = '--', linewidth = 2, label='smooth val loss')
        except:
            pass

        plt.grid(True)
        plt.xlabel('Epoch')
        plt.ylabel('Loss')
        plt.legend(loc="upper right")

        plt.savefig(os.path.join(self.log_dir, "epoch_loss.png"))

        plt.cla()
        plt.close("all")

四、LossHistory类使用框架

import LossHistory

# 构造loss_history类
loss_history = LossHistory(log_dir, model, (input_W, input_H))

# 训练一轮,将训练,验证损失传进loss_history类
loss_history.append_loss(epoch + 1, train_loss / epoch_step, val_loss / epoch_step_val)

# 根据loss_history类中保存的loss来保存最佳模型
if len(loss_history_.val_loss) <= 1 or (val_loss / epoch_step_val) <= min(loss_history_.val_loss):
    best_ckpt = {'epoch': epoch, 'model': save_state_dict, 'optimizer': optimizer.state_dict(), 'loss':val_loss}
    torch.save(best_ckpt, os.path.join(save_dir, name_best_weights))

# 训练一轮结束后,关闭Tensorboard.SummryWriter
loss_history.writer.close()
  • 14
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您可以使用TensorBoard记录训练过程中的损失值。下面是一个使用TensorFlow框架的示例代码,用于将损失值写入TensorBoard日志文件: ```python import tensorflow as tf # 创建一个文件写入器,用于将数据写入TensorBoard日志文件 log_dir = "logs/" summary_writer = tf.summary.create_file_writer(log_dir) # 定义一个损失函数 loss_fn = tf.keras.losses.MeanSquaredError() # 定义模型和优化器 model = tf.keras.models.Sequential([...]) optimizer = tf.keras.optimizers.Adam() # 训练循环 for epoch in range(num_epochs): # 执行前向传播和反向传播 with tf.GradientTape() as tape: logits = model(train_data) loss_value = loss_fn(train_labels, logits) gradients = tape.gradient(loss_value, model.trainable_variables) optimizer.apply_gradients(zip(gradients, model.trainable_variables)) # 将损失值写入TensorBoard日志文件 with summary_writer.as_default(): tf.summary.scalar('loss', loss_value, step=epoch) # 关闭文件写入器 summary_writer.close() ``` 执行上述代码后,您可以在指定的日志目录中找到生成的TensorBoard日志文件。接下来,您可以使用以下命令启动TensorBoard服务: ``` tensorboard --logdir=logs/ ``` 然后,您可以在浏览器中打开生成的URL,查看训练过程中的损失值曲线。请注意,您需要安装TensorFlow和TensorBoard库才能运行上述代码和命令。 希望这可以帮助您记录损失值并使用TensorBoard进行可视化!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_51579041

你的奖励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值