Python中pickle文件操作及案例-学习篇
一、简介
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#如果权重文件存在,则加载权重和epochif os.path.exists(weight_file):weights,start_epoch = load_weights(weight_file)else:#从第一个epoch开始,并计算权重weights = calculate_weights()start_epoch = 0#继续训练剩余的epochsfor 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()
代码执行如下:
第一次执行时计算初始权重,后续权重依次写入文件
中断后重新执行程序,程序会读取已保存的权重数据,继续后延保存