【Python高级编程】Pickle实现AI算法训练的权重数据的保存

任务描述

在这里插入图片描述

代码实现

import pickle
import time
import os
import numpy as np


# 模拟耗时的权重计算过程
def calculate_weights():
    print("开始计算权重...")
    time.sleep(5)  # 模拟耗时操作,暂停5秒以模拟计算过程
    weights = np.random.rand(10, 10)  # 随机生成一个10x10的权重矩阵
    print("权重计算完成.")
    return weights


# 保存权重和epoch到文件
def save_weights(weights, epoch, filename='weights.pkl'):
    data = {'weights': weights, 'epoch': epoch}  # 将权重和epoch打包成字典
    with open(filename, 'wb') as f:  # 以二进制写模式打开文件
        pickle.dump(data, f)  # 使用pickle将数据序列化并保存到文件
    print(f"权重和epoch已保存到{filename}.")


# 从文件加载权重和epoch
def load_weights(filename='weights.pkl'):
    with open(filename, 'rb') as f:  # 以二进制读模式打开文件
        data = pickle.load(f)  # 使用pickle从文件中反序列化数据
    print(f"权重和epoch已从{filename}加载.")
    return data['weights'], data['epoch']  # 返回权重和epoch数据


# 主程序
def main():
    weights_file = 'weights.pkl'  # 权重文件名
    total_epochs = 100  # 假设我们总共需要训练100个epochs

    # 如果权重文件存在,则加载权重和epoch
    if os.path.exists(weights_file):
        weights, start_epoch = load_weights(weights_file)  # 从文件加载权重和训练的epoch数
    else:
        # 否则,从第一个epoch开始,并计算权重
        weights = calculate_weights()  # 计算权重
        start_epoch = 0  # 从第0个epoch开始

    # 继续训练剩余的epochs
    for epoch in range(start_epoch, total_epochs):
        print(f"开始训练epoch {epoch}...")
        # 这里进行实际的训练代码...
        time.sleep(1)  # 模拟训练过程,暂停1秒以模拟每个epoch的训练时间
        print(f"完成训练epoch {epoch}.")

        # 每个epoch结束后保存权重和epoch信息
        save_weights(weights, epoch, weights_file)  # 保存当前的权重和epoch信息

if __name__ == '__main__':
    main()

代码解释

  1. 导入必要的模块

    import pickle
    import time
    import os
    import numpy as np
    
  2. 定义权重计算函数

    def calculate_weights():
        print("开始计算权重...")
        time.sleep(5)  # 模拟耗时操作,暂停5秒
        weights = np.random.rand(10, 10)  # 生成一个10x10的随机权重矩阵
        print("权重计算完成.")
        return weights
    
  3. 定义保存权重和epoch到文件的函数

    def save_weights(weights, epoch, filename='weights.pkl'):
        data = {'weights': weights, 'epoch': epoch}  # 将权重和epoch打包成字典
        with open(filename, 'wb') as f:  # 以二进制写模式打开文件
            pickle.dump(data, f)  # 使用pickle将字典序列化并写入文件
        print(f"权重和epoch已保存到{filename}.")
    
  4. 定义从文件加载权重和epoch的函数

    def load_weights(filename='weights.pkl'):
        with open(filename, 'rb') as f:  # 以二进制读模式打开文件
            data = pickle.load(f)  # 使用pickle从文件中反序列化数据
        print(f"权重和epoch已从{filename}加载.")
        return data['weights'], data['epoch']  # 返回权重和epoch数据
    
  5. 主程序逻辑

    def main():
        weights_file = 'weights.pkl'  # 定义权重文件的名称
        total_epochs = 100  # 假设我们需要训练100个epochs
    
        # 检查权重文件是否存在
        if os.path.exists(weights_file):
            weights, start_epoch = load_weights(weights_file)  # 如果存在,加载权重和epoch
        else:
            weights = calculate_weights()  # 如果不存在,计算权重
            start_epoch = 0  # 从第0个epoch开始
    
        # 继续训练剩余的epochs
        for epoch in range(start_epoch, total_epochs):
            print(f"开始训练epoch {epoch}...")
            time.sleep(1)  # 模拟训练过程,暂停1秒
            print(f"完成训练epoch {epoch}.")
    
            # 每个epoch结束后保存权重和epoch信息
            save_weights(weights, epoch, weights_file)  # 保存当前的权重和epoch信息
    
    # 如果该脚本作为主程序运行,则执行main函数
    if __name__ == '__main__':
        main()
    

该程序用于模拟长时间训练模型的过程,其中包括计算权重、训练模型、保存和加载权重以及当前训练的epoch。通过使用pickle模块,程序能够在中途停止并在重新启动时从上次停止的地方继续运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/717552.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python实践笔记(三): 异常处理和文件操作

1. 写在前面 最近在重构之前的后端代码,借着这个机会又重新补充了关于python的一些知识, 学习到了一些高效编写代码的方法和心得,比如构建大项目来讲,要明确捕捉异常机制的重要性, 学会使用try...except..finally&…

小区噪音监测管理系统设计

一、引言 随着城市化进程的加快,小区居民对于居住环境的要求日益提高。其中,噪音污染已成为影响居民生活质量的重要因素。因此,设计一套小区噪音监测管理系统,对于提升居民的生活品质和小区管理效率具有重要意义。本文将详细阐述…

如何拥有自己的微信小程序

如何拥有自己的微信小程序 ~~话先放在这里~~ 写在前面申请一个属于自己的小程序先去[微信开放平台](https://open.weixin.qq.com/home)申请一个你的小程序扫码申请新小程序小程序该记好的个人信息 安装微信开发者工具下载工具关联你的小程序请求域名配置发布小程序 BUY一个自己…

SQL:按用户名复制权限

生产系统中有一个模块是管理用户及菜单权限,它们是由3个数据表组成,关系及字段如下: 原来为每个用户添加菜单的访问权限时都是一个一个添加,但今天遇到有个新来的员工,需要具有与另一个员工相同的权限。新建一个用户后…

PS插件创成式填充功能全面测评:轻松实现AI修图新高度

大家好,我是你们的AIGC测评博主。今天,我将为大家带来一款ps插件创成式填充功能——深度体验 在图像处理领域,AI技术的应用已经越来越广泛。而创成式填充功能,无疑是其中的佼佼者。它利用AI技术,能够根据用户输入的关…

c语言——c51单片机——数码管

数码管: #include "reg51.h"void delay(unsigned int n) {while (n)--n; }void main(void) { //unsigned char num[] {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c,0x39, 0x5e, 0x79, 0x71, 0x00};unsigned int i 0…

坚持刷题|合并有序链表

文章目录 题目思考代码实现迭代递归 扩展实现k个有序链表合并方法一方法二 PriorityQueue基本操作Java示例注意事项 Hello,大家好,我是阿月。坚持刷题,老年痴呆追不上我,消失了一段时间,我又回来刷题啦,今天…

雪花算法和UUID

目录 雪花算法概念优点和不足优点:缺点:解决方案代码示例 UUID优点与不足优点不足 两种算法的比较应用场景区别 雪花算法 概念 雪花算法是一个分布式id生成算法,它生成的id一般情况下具有唯一性。由64位01数字组成,第一位是符号位,始终为0。…

【leetcode刷题】面试经典150题 , 27. 移除元素

leetcode刷题 面试经典150 27. 移除元素 难度:简单 文章目录 一、题目内容二、自己实现代码2.1 方法一:直接硬找2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 2.2 方法二:排序整体删除再补充2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 三、…

大模型泡沫退去,谁能活到下半场?

前言 从今年3月开始,国内企业纷纷下场大模型,铆足劲秀肌肉,如今转向垂直行业淘金,试图争霸行业大模型。我们的心态也逐渐从看乐子,到严肃讨论。 在人工智能的世界,我们经历了众多的概念游戏,在…

shell编程——脚本入门

在编写脚本的时候指定解析器 在编写shell脚本时第一行以#!/bin/bash开头指定解析器。 在shell脚本中使用echo语句来在屏幕中打印内容。 调用shell脚本的第一种方式 在shell脚本中以bash或者是sh脚本路径的方式来启动脚本。这种执行脚本的方式是在Linux操作系统的b…

【C++高阶】掌握C++多态:探索代码的动态之美

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:C继承 🌹🌹期待您的关注 🌹🌹 ❀继承 📒1. 多态的定义及实现&…

【总线】AXI总线:FPGA设计中的通信骨干

目录 AXI4:高性能地址映射通信的基石 AXI4-Lite:轻量级但功能强大的通信接口 AXI4-Stream:高速流数据传输的利器 结语:AXI总线在FPGA设计中的重要性 大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计…

Go 并发控制:RWMutex 实战指南

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

怎么管理网站的数据

每一个网站都会有很多的数据,这些数据的来源,有一些是直接把数据存放在运行文件里面,有一些则是存放在数据库里面,如MySQL、SQL Server等等,这些数据库都是需要安装指定的数据库环境才能运行起来,数据库的存…

减肥药实质利好服装业:身材好了,更时尚了 1-5月份,新建商品房销售面积同比下降20.3%

减肥药实质利好服装业:身材好了,更时尚了 减肥成功的顾客纷纷瞄准性感look,不但促进了销售,还给服装品牌节省了成本,因为小尺寸的衣服使用的面料更少。大码女装,可能是下一个被 GLP-1减肥神药杀死的行业。…

【计算机毕业设计】234基于微信小程序的中国各地美食推荐平台

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

小知识点快速总结:梯度爆炸和梯度消失的原理和解决方法

本系列文章只做简要总结,不详细说明原理和公式。 目录 1. 参考文章2. 反向梯度求导推导3. 具体分析3.1 梯度消失的原理3.2 梯度爆炸的原理 4. 解决方法 1. 参考文章 [1] shine-lee, "网络权重初始化方法总结(上):梯度消失、…

Elixir学习笔记——速构(函数式编程基础)

在 Elixir 中,循环遍历 Enumerable 是很常见的,通常会过滤掉一些结果并将值映射到另一个列表中。 速构是此类构造的语法糖:它们将这些常见任务分组为 for 特殊形式。 例如,我们可以将一串整数映射到它们的平方值: 速构…

VSCode的maven插件配置问题

最近尝试使用VSCode开发java后台项目,发现安装了java开发套件的插件 配置了开发环境之后,maven下载的依赖包始终位于~/.m2/repository目录之后,放在了默认的C盘,这就是我最不喜欢的位置。 为了保证C的小,所以需要修改…