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

    #如果权重文件存在,则加载权重和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()

代码执行如下:
第一次执行时计算初始权重,后续权重依次写入文件
Python中pickle文件操作及案例-学习篇_第1张图片
中断后重新执行程序,程序会读取已保存的权重数据,继续后延保存
Python中pickle文件操作及案例-学习篇_第2张图片

你可能感兴趣的:(Python,python,学习,开发语言)