神经网络训练日志的正确打开方式:使用re和matplotlib从训练日志中提取数据并绘图

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

神经网络训练日志记录了每个轮次训练的训练集准确率,验证准确率,训练集损失,验证集损失。
但它包含了大量的文本信息,不够直观。有需要绘制出以上数据随着轮次的变化的曲线,来了解神经网络模型训练情况,更好的设置训练轮次,调节超参数等。

一、re(Regular Expression,正则表达式)库的使用

在Python中,re是正则表达式(Regular Expression)的模块,它提供了一组丰富的功能,用于在字符串中执行模式匹配和查找、替换等操作。正则表达式是一种强大而灵活的文本处理工具,广泛应用于数据清洗、文本分析和信息提取等场景。

使用示例

代码如下(示例):

import re

# 检查字符串是否以"Python"开头
result = re.match(r'Python', 'Python is fun')
if result:
    print("匹配成功!")
else:
    print("匹配失败。")

# 在字符串中搜索"Python"
result = re.search(r'Python', 'I love Python')
if result:
    print("找到匹配项:", result.group())
else:
    print("没有找到匹配项。")

# 查找字符串中所有数字
result = re.findall(r'\d+', 'The prices are 20, 30, and 40.')
print("找到的数字:", result)

# 将字符串中的数字替换为"number"
result = re.sub(r'\d+', 'number', 'The prices are 20, 30, and 40.')
print("替换后的字符串:", result)
# 使用逗号加空格来分割字符串
result = re.split(r',\s*', 'apple, banana, cherry, date')
print("分割后的列表:", result)

二、使用re正则表达式提取信息并用matplotlib绘图

数据

有如下的训练日志文本信息,在filename.txt文件中。

Training !!!  Epoch 1 / 100,  batch acc 0.74 Batch Loss 0.580852: 100%|██████████| 619/619 [04:30<00:00,  2.29it/s]
100%|██████████| 7/7 [00:01<00:00,  5.53it/s]
Epoch: [0]	val_loss 0.5713	val_acc 0.7408	
Model saved
------------------------------------------------------------
Epoch:  1  Finished,  Time:  272.5539 s,  Loss:  438.310464.
-------------------------------------------------------------------------------------------------------
Training !!!  Epoch 2 / 100,  batch acc 0.76 Batch Loss 0.514732: 100%|██████████| 619/619 [04:00<00:00,  2.58it/s]
100%|██████████| 7/7 [00:00<00:00,  9.37it/s]
Epoch: [1]	val_loss 0.4631	val_acc 0.7826	
Model saved
------------------------------------------------------------
Epoch:  2  Finished,  Time:  241.6411 s,  Loss:  317.888615.
-------------------------------------------------------------------------------------------------------
Training !!!  Epoch 3 / 100,  batch acc 0.78 Batch Loss 0.458130: 100%|██████████| 619/619 [04:00<00:00,  2.58it/s]
100%|██████████| 7/7 [00:00<00:00,  9.36it/s]
Epoch: [2]	val_loss 0.4570	val_acc 0.7840	
Model saved
------------------------------------------------------------
Epoch:  3  Finished,  Time:  241.4949 s,  Loss:  296.596370.
-------------------------------------------------------------------------------------------------------
Training !!!  Epoch 4 / 100,  batch acc 0.78 Batch Loss 0.452229: 100%|██████████| 619/619 [03:59<00:00,  2.58it/s]
100%|██████████| 7/7 [00:00<00:00,  9.32it/s]
Epoch: [3]	val_loss 0.4858	val_acc 0.7696	
------------------------------------------------------------

使用示例

通过正则表达式提取出准确率acc,验证集准确率val_acc,训练集损失Loss,验证集损失val_loss。
并通过matplotlib绘图。

import os
import re
import math
import matplotlib.pyplot as plt
with open('filename.txt','r',encoding='UTF-8') as f:  # 打开新的文本
    text_new = f.read()  # 读取文本数据
val_accs = re.findall(r'val_acc (\d+\.\d+)', text_new)
accs = re.findall(r'batch acc (\d+\.\d+)', text_new)
losses = re.findall(r'Loss (\d+\.\d+)', text_new)
val_losses= re.findall(r'val_loss (\d+\.\d+)', text_new)
print(len(val_losses))
print(type(val_losses))
val_acc_list =[]
acc_list =[]
val_loss_list =[]
loss_list =[]
# 打印提取出来的值
for val_acc in val_accs:
    val_acc =round(float(val_acc),2)
    print(f"val_acc: {val_acc}")
    val_acc_list.append(val_acc)
for acc in accs:
    acc = round(float(acc), 2)
    print(f"accs: {acc}")
    acc_list.append(acc)
for val_loss in val_losses:
    val_loss= round(float(val_loss), 2)
    print(f"val_loss: {val_loss}")
    val_loss_list.append(val_loss)
for loss in losses:
    loss = round(float(loss), 2)
    print(f"loss: {loss}")
    loss_list.append(loss)
print(len(acc_list))

x=list(range(len(val_acc_list)))
plt.figure(num=1,figsize=(6,6))#创建画图,序号为1,图片大小为2.7*1.8
plt.rcParams['axes.unicode_minus'] = False#使用上标小标小一字号
plt.rcParams['font.sans-serif']=['Times New Roman']
#设置全局字体,可选择需要的字体替换掉‘Times New Roman’
#使用黑体'SimHei'作为全局字体,可以显示中文
#plt.rcParams['font.sans-serif']=['SimHei']
font1={'family': 'Times New Roman', 'weight': 'light', 'size': 12}#设置字体模板,
#wight为字体的粗细,可选 ‘normal\bold\light’等
#size为字体大小

#设置图框与图片边缘的距离
plt.tight_layout(rect=(0.0,0.0,1,1))#rect=[left,bottom,right,top]
#设置x轴
plt.tick_params(
    axis='x',#设置x轴
    direction='in',# 小坐标方向,in、out
    which='both',      # 主标尺和小标尺一起显示,major、minor、both
    bottom=True,      #底部标尺打开
    top=False,         #上部标尺关闭
    labelbottom=True, #x轴标签打开
    labelsize=6) #x轴标签大小
plt.tick_params(
    axis='y',
    direction='in',
    which='both',
    left=True,
    right=False,
    labelbottom=True)
plt.minorticks_on()#开启小坐标
plt.ticklabel_format(axis='both',style='sci')#sci文章的风格

plt.title("acc-epoch",fontdict = font1)#标题
plt.ylabel('Accurancy',fontdict=font1)#$\mathregular{min^{-1}}$label的格式,^{-1}为上标
plt.xlabel('Epochs',fontdict=font1)
plt.plot(x,acc_list,'b-',lw=1.5,label="train")#'k--'为直线的格式,k表示颜色黑色,--表示虚线
plt.plot(x,val_acc_list,'r--',lw=1.5,label="val")#'k--'为直线的格式,k表示颜色黑色,--表示虚线
plt.legend(loc="best",scatterpoints=1,prop=font1,shadow=True,frameon=False)#添加图例,loc控制图例位置,“best”为最佳位置,“bottom”,"top",“topringt"等,shadow为图例边框阴影,frameon控制是否有边框
plt.savefig("acc.png",format="png",dpi=600,bbox_inches='tight')
plt.show()

plt.figure(num=2,figsize=(6,6))#创建画图,序号为1,图片大小为2.7*1.8
plt.title("loss-epoch",fontdict = font1)#标题
plt.ylabel('Loss',fontdict=font1)#$\mathregular{min^{-1}}$label的格式,^{-1}为上标
plt.xlabel('Epochs',fontdict=font1)
plt.plot(x,loss_list,'b-',lw=1.5,label="train")#'k--'为直线的格式,b表示颜色蓝色,--表示虚线
plt.plot(x,val_loss_list,'r--',lw=1.5,label="val")#'k--'为直线的格式,k表示颜色黑色,--表示虚线
plt.legend(loc="best",scatterpoints=1,prop=font1,shadow=True,frameon=False)#添加图例,loc控制图例位置,“best”为最佳位置,“bottom”,"top",“topringt"等,shadow为图例边框阴影,frameon控制是否有边框
plt.savefig("loss.png",format="png",dpi=600,bbox_inches='tight')
plt.show()

绘图结果

画图的图片如下:
在这里插入图片描述

在这里插入图片描述
这样能比较明显看出模型训练可能过拟合了。

总结

以上就是今天要讲的内容,本文简单介绍了re库的使用,re库提供的正则表达式能够使我们快速便捷地提取出特定的内容。matplotlib库能够使我们绘制出曲线图。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值