python 绘制训练曲线--Savitzky-Golay 滤波平滑处理
Posted R-G-B
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 绘制训练曲线--Savitzky-Golay 滤波平滑处理相关的知识,希望对你有一定的参考价值。
文章目录
- 1 训练曲线--震荡的非常厉害
- 2 Savitzky-Golay 滤波器--平滑曲线
- 3 python 绘制训练曲线--插值法 曲线平滑处理
- 4 python 绘制训练曲线--基于Numpy.convolve曲线平均滤波
- 5 用python自己绘制训练曲线
1 训练曲线–震荡的非常厉害
上一篇文章用python自己绘制训练曲线震荡的非常厉害(下图绿色曲线),而tensorboard的曲线比较平滑(下下图黑色曲线),
原因是tensorboard显示的曲线是经过平滑处理过的(其灰黑色的背景就平滑处理前的波形)
2 Savitzky-Golay 滤波器–平滑曲线
对曲线进行平滑处理,通过Savitzky-Golay 滤波器,可以在scipy库里直接调用,不需要再定义函数。
from matplotlib import pyplot as plt
import csv
import numpy as np
# 使用Savitzky-Golay 滤波器后得到平滑图线
from scipy.signal import savgol_filter
filename = "D:/python/pltt/train_loss.csv" #.csv文件路径,这里可以添加绝对路径
with open(filename) as f:
csvreader = csv.reader(f, delimiter = ",", quotechar='"')
for line in range(1): #1代表从文件第2行开始读取
next (csvreader)
print("lines: ",line) #打印行数
x = [] #横纵坐标分别建立了两个list
y = []
for row in csvreader:
x.append(float(row[1])) #读取第2、3列数据,放入list
y.append(float(row[2]))
#Savitzky-Golay 滤波器实现曲线平滑
'''
scipy.signal.savgol_filter(y, window_length, polyorder)
y--代表曲线点坐标(x,y)中的y值,为要滤波的信号
window_length--即窗口长度取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。
polyorder--为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。
mode--滤波器的填充信号的扩展类型
'''
y = savgol_filter(y, 99, 1, mode= 'nearest')
# 可视化图线
plt.plot(x,y,'g', linewidth=1.0) #曲线颜色绿色,线条宽度1
plt.show()
不同滤波参数的平滑效果
y = savgol_filter(y, 99, 1, mode= 'nearest')
y = savgol_filter(y, 33, 10, mode= 'nearest')
y = savgol_filter(y, 55, 2, mode= 'nearest')
3 python 绘制训练曲线–插值法 曲线平滑处理
4 python 绘制训练曲线–基于Numpy.convolve曲线平均滤波
python 绘制训练曲线–基于Numpy.convolve曲线平均滤波
python 绘制训练曲线 平滑处理–Savitzky-Golay 滤波器曲线平滑
5 用python自己绘制训练曲线
python matplotlib 绘制训练曲线 综合示例——平滑处理图题设置图例设置字体大小线条样式颜色设置
文章目录
- 1 导出曲线数据
- 2 python简单的 绘制曲线
- 3 Savitzky-Golay 滤波器--平滑曲线
- 4 对y轴数值缩放处理
- 5 设置图题、图例、字体、网格、保存曲线图
- 6 补充
- 7 源码下载、曲线数据下载
1 导出曲线数据
训练损失曲线数据,用.csv格式导出,数据如下表所示。用python绘制出 step和Value的关系曲线
2 python简单的 绘制曲线
from matplotlib import pyplot as plt
import csv
import numpy as np
filename = "D:/python/pltt/train_loss.csv" #.csv文件路径,可以添加绝对路径
with open(filename) as f:
csvreader = csv.reader(f, delimiter = ",", quotechar='"')
for line in range(1): #1代表从文件第2行开始读取
next (csvreader)
print("lines: ",line) #打印行数
x = [] #横纵坐标分别建立了两个list
y = []
for row in csvreader:
x.append(float(row[1])) #读取第2、3列数据,放入list
y.append(float(row[2]))
# 可视化图线
plt.plot(x,y,'g', linewidth=1.0) #曲线颜色绿色,线条宽度1
plt.show()
可以看到上面的曲线震荡的很厉害,不利于观察整体趋势,需要滤波处理
3 Savitzky-Golay 滤波器–平滑曲线
对曲线进行平滑处理,通过Savitzky-Golay 滤波器,可以在scipy库里直接调用,不需要再定义函数。
from matplotlib import pyplot as plt
import csv
import numpy as np
# 使用Savitzky-Golay 滤波器后得到平滑图线
from scipy.signal import savgol_filter
filename = "D:/python/pltt/train_loss.csv" #.csv文件路径,这里可以添加绝对路径
with open(filename) as f:
csvreader = csv.reader(f, delimiter = ",", quotechar='"')
for line in range(1): #1代表从文件第2行开始读取
next (csvreader)
print("lines: ",line) #打印行数
x = [] #横纵坐标分别建立了两个list
y = []
for row in csvreader:
x.append(float(row[1])) #读取第2、3列数据,放入list
y.append(float(row[2]))
#Savitzky-Golay 滤波器实现曲线平滑
'''
scipy.signal.savgol_filter(y, window_length, polyorder)
y--代表曲线点坐标(x,y)中的y值,为要滤波的信号
window_length--即窗口长度取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。
polyorder--为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。
mode--滤波器的填充信号的扩展类型
'''
y = savgol_filter(y, 99, 1, mode= 'nearest')
# 可视化图线
plt.plot(x,y,'g', linewidth=1.0) #曲线颜色绿色,线条宽度1
plt.show()
y = savgol_filter(y, 99, 1, mode= 'nearest')
4 对y轴数值缩放处理
对x,y值进行缩放,有两种方法
# 方法① list转array,在再缩放
y=np.array(y)/500 #list转array,再缩放
# 方法② 直接在plt.plot(x,y/500)中缩放
plt.plot(x, y,'g')
错误方法
y = savgol_filter(y/500, 99, 1, mode= 'nearest')
TypeError: unsupported operand type(s) for /: 'list' and 'int'
y.append(float(row[2]/500)) #读取数据,放入list
TypeError: unsupported operand type(s) for /: 'str' and 'int'
y = y /500
TypeError: unsupported operand type(s) for /: 'list' and 'int'
完整代码
from matplotlib import pyplot as plt
import csv
import glob
from os.path import basename
import numpy as np
# 使用Savitzky-Golay 滤波器后得到平滑图线
from scipy.signal import savgol_filter
files = sorted(glob.glob("D:/python/pltt/train_loss.csv")) #读取目录下所有以.csv结尾的文件,这里可以添加绝对路径
for file in files:
filename = basename(file).rsplit('.', 1)[0] #用.来分割文件名,取前半部分,例如XX.csv,取XX
print('\\r'+ filename + " ", flush = True)
with open(file) as f:
csvreader = csv.reader(f, delimiter = ",", quotechar='"')
for line in range(1): #1代表从文件第2行开始读取
next (csvreader)
print("lines: ",line) #打印行数
x = []
y = [] #横纵坐标分别建立了两个list
for row in csvreader:
x.append(float(row[1])) #读取第2、3列数据
y.append(float(row[2])) #读取数据,放入list
y=np.array(y)/500 #list转array,在缩放
#Savitzky-Golay 滤波器实现曲线平滑
'''
scipy.signal.savgol_filter(y, window_length, polyorder)
y--为要滤波的信号
window_length--即窗口长度取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。
polyorder--为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。
'''
y= savgol_filter(y, 55, 1, mode= 'nearest')
# 可视化图线
plt.plot(x, y,'g')
plt.show()
5 设置图题、图例、字体、网格、保存曲线图
from matplotlib import pyplot as plt
import csv
import glob
from os.path import basename
import numpy as np
# 使用Savitzky-Golay 滤波器后得到平滑图线
from scipy.signal import savgol_filter
#dpi参数指定绘图对象的分辨率,即每英寸多少个像素 ;figsize:指定figure的宽和高,单位为英寸
fig=plt.figure(dpi = 80, figsize=(15,8))
#设置标题
plt.title("Train_loss",fontsize = 25) #标题
plt.xlabel("Iterations", fontsize = 25) #横坐标
plt.ylabel("Loss", fontsize = 25) #纵坐标
files = sorted(glob.glob("D:/python/pltt/train_loss.csv")) #读取目录下所有以.csv结尾的文件,这里可以添加绝对路径
for file in files:
filename = basename(file).rsplit('.', 1)[0] #用.来分割文件名,取前半部分,例如XX.csv,取XX
print('\\r'+ filename + " ", flush = True)
with open(file) as f:
csvreader = csv.reader(f, delimiter = ",", quotechar='"')
for line in range(1): #1代表从文件第2行开始读取
next (csvreader)
print("lines: ",line) #打印行数
x = []
y = [] #横纵坐标分别建立了两个list
for row in csvreader:
x.append(float(row[1])) #读取第2、3列数据
y.append(float(row[2])) #读取数据,放入list
#设置横纵坐标显示范围
# plt.xlim((0,90000))#横轴范围
# plt.ylim((0,200)) #纵轴范围
plt.tick_params(labelsize=20)#设置坐标刻度值的字体大小
y=np.array(y)/500 #list转array,再缩放,否则报错
#Savitzky-Golay 滤波器实现曲线平滑
'''
scipy.signal.savgol_filter(y, window_length, polyorder)
y--为要滤波的信号
window_length--即窗口长度取值为奇数且不能超过len(x)。它越大,则平滑效果越明显;越小,则更贴近原始曲线。
polyorder--为多项式拟合的阶数。它越小,则平滑效果越明显;越大,则更贴近原始曲线。
'''
y_smooth = savgol_filter(y, 55, 1, mode= 'nearest')
# 可视化图线
plt.plot(x, y_smooth,'g', label = '%s' % filename, linewidth=3.0)
#plt.legend()函数的作用是给图像加图例。
plt.legend(frameon=True,loc="upper right",fontsize=25) #分别为图例有边框、图例放在右上角、图例大小
#plt.grid()#添加网格
plt.savefig('D:/python/pltt/Train_loss' + '.png',dpi = 80) #保存了绘制的图像
print("Done processing " + str(len(files)) + " files.")
plt.grid()#添加网格
plt.show()
6 补充
6.1 python 曲线平滑处理——方法总结-详解
python 曲线平滑处理——方法总结(Savitzky-Golay 滤波器、make_interp_spline插值法和convolve滑动平均滤波)
6.2 Tensorboard可视化训练曲线导出数据用Python绘制
Tensorboard可视化训练曲线导出数据用Python绘制
6.3 PyTorch可视化工具-Tensorboard在线查看训练曲线、网络结构图等
6.4 PyTorch常用小工具-Tensorboard、Summary、Profiler
PyTorch常用小工具-Tensorboard、Summary、Profiler
7 源码下载、曲线数据下载
以上是关于python 绘制训练曲线--Savitzky-Golay 滤波平滑处理的主要内容,如果未能解决你的问题,请参考以下文章
python matplotlib 绘制训练曲线 综合示例——平滑处理图题设置图例设置字体大小线条样式颜色设置