赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
神经网络训练日志记录了每个轮次训练的训练集准确率,验证准确率,训练集损失,验证集损失。
但它包含了大量的文本信息,不够直观。有需要绘制出以上数据随着轮次的变化的曲线,来了解神经网络模型训练情况,更好的设置训练轮次,调节超参数等。
在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)
有如下的训练日志文本信息,在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库能够使我们绘制出曲线图。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。