当前位置:   article > 正文

神经网络训练日志的正确打开方式:使用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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
'
运行

二、使用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	
------------------------------------------------------------
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

使用示例

通过正则表达式提取出准确率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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

绘图结果

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

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

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/1012052
推荐阅读
相关标签
  

闽ICP备14008679号