一、简介
Pickle 算是Python的一种数据序列化方法,它能够将对象转换为字节流,进而可以保存到文件中或通过网络传输给其他Python程序。这种方式非常适合快速简便地保存复杂的数据结构,例如列表、字典、自定义对象等。
二、pickle文件的读写
示例代码如下:
import pickle #导入pickle操作的库
#创建一个示例数据
data={
'name':'Tom',
'age':30,
'is_student': False,
'grades':[11,12,13]
}
#使用pickle保存数据到硬盘
with open('data.pkl','wb') as file:
pickle.dump(data,file)
#使用pickle加载数据
with open('data.pkl','rb') as file:
loaded_data=pickle.load(file)
print(loaded_data) #打印出读取结果
执行一遍后,data的json数据就会被保存到磁盘,下次读取可直接读取内容
案例分析
案例背景:
当训练人工智能算法时,往往需要很长的时间,当训练中断时,如果
能提前做好权重保存功能,能很快的恢复上次进度,以继续进行训练,请实时保存权重计算完成后的数据
代码如下:
import pickle #序列化数据到硬盘
import time #模拟训练的时间调用
import os #判断文件存不存在使用
import numpy as np #用来计数
#模拟耗时计算的全过程
def calculate_weights():
print("开始计算权重。。。")
time.sleep(5) #模拟耗时操作
weight = np.random.rand(10,10) #随机生成权重
print("权重计算完成")
return weight
#保存权重和epoch文件到硬盘
def save_weights(weights,epoch,filename='weights.pkl'):
data = {'epoch':epoch,'weights':weights}
with open(filename,'wb') as f:
pickle.dump(data,f)
print(f"权重和epoch已经保存到{filename}")
#从硬盘加载权重和epoch
def load_weights(filename='weights.pkl'):
with open(filename,'rb') as f:
data = pickle.load(f)
print(f"权重和epoch已经从{filename}加载")
return data["weights"],data["epoch"]
#主程序
def main():
weight_file = "weights.pkl"
total_epochs = 100 #假设总共需要训练100个epochs
#如果权重文件存在,则加载权重和epoch
if os.path.exists(weight_file):
weights,start_epoch = load_weights(weight_file)
else:
#从第一个epoch开始,并计算权重
weights = calculate_weights()
start_epoch = 0
#继续训练剩余的epochs
for epoch in range(start_epoch,total_epochs):
print(f"开始训练epoch{epoch}...")
#这里进行实际的训练代码
time.sleep(1) #模拟训练过程
#每个epoch结束后保存权重和epoch信息
save_weights(weights,epoch,weight_file)
if __name__ == '__main__':
main()
代码执行如下:
第一次执行时计算初始权重,后续权重依次写入文件
中断后重新执行程序,程序会读取已保存的权重数据,继续后延保存