TensorBoard-可视化训练过程

image-nvbj.png

#官网教程
https://www.tensorflow.org/tensorboard/get_started?hl=zh-cn

是的,你可以使用 TensorBoard 来记录和可视化你的模型训练过程。TensorBoard 可以帮助你可视化训练和验证损失,并跟踪其他指标。TensorFlow 提供了很好的 TensorBoard 支持,你只需要添加少量代码即可将训练过程记录到 TensorBoard 中。

1. 安装 TensorBoard

如果你还没有安装 TensorBoard,可以通过以下命令安装:

pip install tensorboard

2. 修改代码以支持 TensorBoard 记录

你可以在模型编译和训练的过程中加入 TensorBoard 回调,从而记录训练过程。以下是对你的代码进行的修改:

import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import TensorBoard
import matplotlib.pyplot as plt
from sklearn.preprocessing import OneHotEncoder
import os
import datetime

# 读取Excel数据
file_path = 'D:\Apypjct\\NNFS\MLP\GI值预测模型数据0801.xlsx'
data = pd.read_excel(file_path)

# 选择分类型数据列(例如“产品类别”和“功能因子含量(0/1)”)
categorical_columns = ['产品类别', '功能因子含量(0/1)']

# 对分类型数据进行One-Hot编码
one_hot_encoder = OneHotEncoder(sparse_output=False)
categorical_data = one_hot_encoder.fit_transform(data[categorical_columns])

# 剩余的数值数据
numerical_data = data.drop(columns=categorical_columns + ['GI值']).values

# 用One-Hot编码后的数据替换掉原始的分类数据
X = np.hstack((categorical_data, numerical_data))

# 输出层数据(第一列“GI值”)
y = data['GI值'].values

# 定义你想要尝试的参数值
hidden_layer_1_neurons = [10, 15, 20, 25, 30]  # 第一个隐藏层神经元数量 [10, 15, 20, 25, 30]
hidden_layer_2_neurons = [1, 5, 10, 15]  # 第二个隐藏层神经元数量 [5, 10, 15]
epochs = [200, 250, 300, 350, 400]  # 训练轮数
batch_sizes = [16, 32, 64]  # 批次大小

# 保存所有结果的目录路径
save_dir = 'D:\Apypjct\\NNFS\MLP\models\model-0.8'  # 指定模型保存的目录
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

# 初始化结果列表
results = []

# 获取当前时间作为 TensorBoard 日志目录的一部分
log_dir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))

# 遍历所有参数组合
for h1 in hidden_layer_1_neurons:
    for h2 in hidden_layer_2_neurons:
        for epoch in epochs:
            for batch_size in batch_sizes:
                # 创建 TensorBoard 回调
                tensorboard_callback = TensorBoard(log_dir=os.path.join(log_dir, f"h1-{h1}_h2-{h2}_epochs-{epoch}_batch_size-{batch_size}"))

                # 构建模型
                model = Sequential()
                model.add(Dense(h1, input_dim=X.shape[1], activation='relu'))
                model.add(Dense(h2, activation='relu'))
                model.add(Dense(1, activation='linear'))

                # 编译模型
                model.compile(optimizer=Adam(learning_rate=0.01), loss='mean_squared_error')

                # 训练模型,加入 TensorBoard 回调
                history = model.fit(X, y, epochs=epoch, batch_size=batch_size, validation_split=0.7, verbose=0, callbacks=[tensorboard_callback])

                # 记录结果
                results.append({
                    'h1': h1,
                    'h2': h2,
                    'epochs': epoch,
                    'batch_size': batch_size,
                    'loss': history.history['loss'],
                    'val_loss': history.history['val_loss']
                })

                # 保存模型
                model_filename = f"model_h1-{h1}_h2-{h2}_epochs-{epoch}_batch_size-{batch_size}.keras"
                model.save(os.path.join(save_dir, model_filename))

                # 绘制并保存折线图
                plt.figure(figsize=(10, 6))
                plt.plot(history.history['loss'], label='Training Loss')
                plt.plot(history.history['val_loss'], label='Validation Loss')
                plt.title(f'Training and Validation Loss (h1={h1}, h2={h2}, epochs={epoch}, batch_size={batch_size})')
                plt.xlabel('Epochs')
                plt.ylabel('Loss')
                plt.legend()
                plt.savefig(
                    os.path.join(save_dir, f'loss_curve_h1-{h1}_h2-{h2}_epochs-{epoch}_batch_size-{batch_size}.png'))
                plt.close()

# 如果需要,可以将结果保存为excel文件
df = pd.DataFrame(results)
excel_file_path = os.path.join(save_dir, 'D:\Apypjct\\NNFS\MLP\models\model-0.8\\training_results-0.8.xlsx')
df.to_excel(excel_file_path, index=False)

print("Training completed and models saved.")

解释:

  1. TensorBoard 回调:在每次模型训练时,使用 TensorBoard 回调函数 tensorboard_callback,它会将每个模型的训练日志保存到 log_dir 指定的路径中。
  2. log_dir:日志保存路径动态生成,并包含当前时间戳(%Y%m%d-%H%M%S 格式),以及模型参数(如隐藏层大小、epochs 等)组成的子目录,确保每次不同实验的日志不会被覆盖。

3. 运行 TensorBoard 来查看日志

在模型训练完成后,运行 TensorBoard 来查看日志。打开命令行,并运行以下命令:

tensorboard --logdir=logs

这个命令将启动 TensorBoard 并在浏览器中打开一个界面,显示训练的损失曲线、验证曲线等信息。

总结:

  • 你可以在每次模型训练时,使用 TensorBoard 回调来记录训练日志。
  • 在命令行中运行 tensorboard --logdir=logs 来启动 TensorBoard。
  • 通过 TensorBoard,你可以方便地查看模型训练中的损失、准确率等指标的变化。

主要是TB回调部分

能否使用绝对路径

是的,writer = SummaryWriter('C:/Users/username/project/645/logs/777') 可以使用绝对路径。在 SummaryWriter 中,既可以使用相对路径,也可以使用绝对路径来指定日志的存储位置。

使用绝对路径

你可以在 SummaryWriter 中直接提供一个绝对路径来保存日志。例如:

from torch.utils.tensorboard import SummaryWriter

# 绝对路径
log_dir = 'C:/Users/username/project/645/logs/777'

# 使用绝对路径初始化 SummaryWriter
writer = SummaryWriter(log_dir)

使用绝对路径的优点

  • 明确路径:使用绝对路径可以确保日志文件写入到特定的目录,不依赖于当前工作目录,避免相对路径可能带来的混淆。
  • 减少错误:绝对路径减少了与当前工作目录有关的错误。特别是在复杂的项目中,使用绝对路径能更直观地看到日志存储的具体位置。

注意事项

  • 确保路径存在:使用 SummaryWriter 时,确保你指定的路径是有效的,系统具有在该目录下写入文件的权限。如果路径不存在,SummaryWriter 会自动创建目录。
  • Windows 路径的格式:如果在 Windows 上使用绝对路径,确保正确使用路径分隔符。可以使用 \\/,但要避免使用单个反斜杠 \,因为它是转义字符。

示例

import os
from torch.utils.tensorboard import SummaryWriter

# 绝对路径
log_dir = 'C:/Users/username/project/645/logs/777'

# 确保路径存在
os.makedirs(log_dir, exist_ok=True)

# 创建 SummaryWriter 并保存日志到指定路径
writer = SummaryWriter(log_dir)

结论

  • 绝对路径可以正常使用,并且在某些场景下更清晰和可靠。
  • 确保路径存在或者可以被创建,避免文件系统权限问题。

如果你在使用绝对路径时遇到问题,请告诉我详细的错误,我可以帮你进一步排查。

pytorch中使用TB

TensorBoard 和 PyTorch 的关系

TensorBoard 是一个由 TensorFlow 团队开发的可视化工具,最初用于可视化和调试 TensorFlow 模型的训练过程。不过,随着深度学习框架的发展,PyTorch 也提供了与 TensorBoard 的集成,这样 PyTorch 用户也可以利用 TensorBoard 来可视化训练过程和调试模型。通过 torch.utils.tensorboard.SummaryWriter 类,PyTorch 用户可以将模型的训练日志(如损失、准确率、直方图等)写入到 TensorBoard 中,并在其界面上进行可视化。

PyTorch 中使用 TensorBoard 的场景

以下是一些常见的使用 TensorBoard 可视化 PyTorch 模型训练过程的场景:

  1. 标量数据(如损失、准确率等)的可视化
    PyTorch 使用 TensorBoard 记录和可视化训练时的指标,比如训练损失、验证损失、准确率等标量数据。通过这些可视化图表,你可以直观地观察模型的收敛情况和性能变化。

  2. 模型结构的可视化
    通过 PyTorch,可以将模型的结构图导入 TensorBoard,从而可视化神经网络的拓扑结构,包括每一层的维度和连接。

  3. 梯度、参数的直方图
    TensorBoard 可以记录模型参数和梯度的直方图。通过这种方式,你可以分析训练过程中权重和梯度的分布变化,从而发现潜在的训练问题。

  4. 图像数据的可视化
    PyTorch 模型训练过程中,可以通过 TensorBoard 将训练或测试数据中的图像记录下来,方便你查看输入数据,或模型预测的输出。

  5. 文本和音频数据的可视化
    TensorBoard 还支持记录和可视化文本以及音频数据,这对于自然语言处理(NLP)和语音处理任务非常有用。

如何在 PyTorch 中使用 TensorBoard

  1. 导入 SummaryWriter
    在 PyTorch 中,torch.utils.tensorboard 提供了对 TensorBoard 的支持。你可以通过 SummaryWriter 类将训练过程中的数据写入 TensorBoard。

    from torch.utils.tensorboard import SummaryWriter
    
    writer = SummaryWriter('runs/experiment1')
    

    这里 runs/experiment1 是日志文件存放的目录。

  2. 记录标量数据(如损失、准确率)
    你可以在每个训练 epoch 或者 step 后,记录一些标量数据,如损失和准确率。

    for epoch in range(epochs):
        loss = calculate_loss()
        writer.add_scalar('Training Loss', loss, epoch)
    
  3. 记录模型结构
    PyTorch 允许你将模型结构导入 TensorBoard 中:

    # 假设有一个简单的神经网络模型
    model = MyModel()
    dummy_input = torch.randn(1, 3, 224, 224)  # 假设输入是一个 224x224 的 RGB 图像
    writer.add_graph(model, dummy_input)
    
  4. 记录参数和梯度的直方图
    通过 add_histogram 可以记录模型的参数和梯度的变化:

    for name, param in model.named_parameters():
        writer.add_histogram(f'{name}_grad', param.grad, epoch)
        writer.add_histogram(f'{name}_param', param, epoch)
    
  5. 记录图像
    如果你处理的是图像数据,可以通过 add_imageadd_images 方法将图像记录到 TensorBoard 中。

    images = torch.randn(8, 3, 64, 64)  # 8 张 64x64 的 RGB 图像
    writer.add_images('input_images', images, 0)
    
  6. 启动 TensorBoard
    在训练过程中,TensorBoard 会将日志文件写入到指定的目录。你可以通过命令行启动 TensorBoard 来查看这些日志。

    tensorboard --logdir=runs/experiment1
    
  7. 关闭 SummaryWriter
    完成所有数据记录后,记得关闭 SummaryWriter,确保所有数据都已写入到磁盘。

    writer.close()
    

PyTorch 中 TensorBoard 的优点

  • 跨框架的兼容性:虽然 TensorBoard 是由 TensorFlow 团队开发的,但它对 PyTorch 的支持非常完善。通过 SummaryWriter,你可以利用 TensorBoard 的强大可视化功能来监控和分析 PyTorch 的模型训练过程。

  • 更直观的训练调试:通过记录标量、直方图、图像等,TensorBoard 使得模型训练过程中的问题更容易被发现,比如过拟合、权重分布不合理等。

  • 可视化工具丰富:TensorBoard 提供了很多可视化工具,不仅可以展示标量数据(如损失、准确率),还能展示模型结构、参数分布等复杂信息。

总结

  • TensorBoard 是一个强大的可视化工具,用于调试和分析深度学习模型的训练过程。
  • PyTorch 通过 torch.utils.tensorboard.SummaryWriter 提供了与 TensorBoard 的无缝集成,允许用户记录训练过程中的指标并进行可视化。
  • 通过 TensorBoard,PyTorch 用户可以实时查看训练过程中的各种指标、模型结构、参数分布等,从而更好地分析和调试模型。

TensorFlow使用更方便,因为就是自家的


TensorBoard-可视化训练过程
http://192.144.219.54/:8080//archives/1726731342656
作者
CavyW
发布于
2024年09月19日
更新于
2024年09月19日
许可协议