python对bin文件操作的步骤

背景

博主想对神经网络模型的参数写入 bin 文件,方便在后续创建IP的过程中读取数据进行验证,记录 python 读取 pytorch 的模块参数并进行bin文件写入和读取操作。本文以3x3卷积为例。

示例代码

本文涉及的模块

struct: 该模块可以执行 Python 值和以 Python bytes 对象表示的 C 结构之间的转换。

pytorch :神经网络框架

简单示例

import structSAVE_DIR = "./conv3x3_pool_relu_outputs"import structval = -1
a = struct.pack('i', val)# 将 -1 进行二进制打包(4字节), 默认情况下,打包给定 C 结构的结果会包含填充字节以使得所涉及的 C 类型保持正确的对齐
print(a)  # b'\xff\xff\xff\xff',确实是-1的二进制补码表示
file = os.path.join(SAVE_DIR, "wt.bin")
with open(file, "ab+") as fw:  # 二进制追加形式fw.write(a)with open(file, "rb") as fr:  # 二进制读形式b = struct.unpack('i', fr.read(4))print(b[0])  # (-1,),返回元组print(b[0] == val)  # true

完整保存参数代码

# coding:utf-8
"""
for generate conv3x3_pool_relu and data for test.
"""
import osimport torch
import torch.nn as nn# hyper param
Hin = 6
Win = 12
CHin = 16
CHout = 16
step = 0.1
G_SIZE = 8SAVE_DIR = "./conv3x3_pool_relu_outputs"seed = 2021
torch.random.manual_seed(seed)def format_num(x):""">0 -> 1, <0 -> -1. switch func."""return (torch.randn_like(x) > 0).to(torch.float32) * 2 - 1def save_conv3x3_weight(weight, save_dir="./outputs", filename="conv3x3", size=8):"""写入文件,"""shape = weight.shapeprint("save {} weights(bin format) ".format(filename), shape, end="  ---------wait----------  ")assert len(shape) == 4 and shape[0] % size == 0 and shape[1] % size == 0, "input error"if not ".dat" in filename:filename = filename + "_weight.bin"if type(weight) in [torch.nn.Parameter, torch.Tensor]:weight = weight.cpu().detach().numpy()filepath = os.path.join(save_dir, filename)with open(filepath, "wb+") as fw:for i in range(0, shape[0], size):for j in range(0, shape[1], size):for co in range(i, i + size):for ci in range(j, j + size):for h in range(3):for w in range(3):fw.write(struct.pack('i', int(weight[co][ci][h][w])))  # 写入前进行二进制转换print("save conv3x3_weight done. save weights to {}".format(filepath))return filepathclass Conv3x3PoolRelu(nn.Module):def __init__(self, in_channels=16, out_channels=32, save=False, out_dir="./outputs", save_size=8):super().__init__()assert in_channels % G_SIZE == 0 and out_channels % G_SIZE == 0, "input error!!"self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1)self.act = nn.ReLU()self.pool = nn.MaxPool2d(2, 2, 0)self.init_weights()self.save_dir = out_dirdef forward(self, x):for name, module in self.named_children():print(name, module)if type(module) in [nn.Conv2d]:save_conv3x3_weight(module.weight, self.save_dir)x = module(x)return xdef init_weights(self):for idx, m in self.named_modules():# print(idx, " ", type(m))# initializeif type(m) in [nn.Conv2d]:weight, bias = m.weight, m.biasm_weight, m_bias = format_num(weight), format_num(bias)# m_weight, m_bias = format_num(weight), torch.zeros_like(bias)m.weight, m.bias = nn.Parameter(m_weight, requires_grad=False), nn.Parameter(m_bias,requires_grad=False)if __name__ == '__main__':model = Conv3x3PoolRelu(8, 8, out_dir=SAVE_DIR)x = format_num(torch.randn(1, 8, 4, 4))y = model(x)print(y.shape, y)# read to validatew = torch.empty(8, 8, 3, 3)con, cin, kh, kw = w.shapewith open("./conv3x3_pool_relu_outputs/conv3x3_weight.bin", "rb") as fr:for co in range(con):for ci in range(cin):for i in range(kh):for j in range(kw): data = struct.unpack("i", fr.read(4))  # 使用unpack进行转换为数据类型,注意read后面跟的是4个字节w[co][ci][i][j] = data[0]print(w)

步骤

详细步骤如下:

  1. 以二进制读写方式打开文件;
  2. 使用struct库对相应的数据类型进行二进制转换(读使用unpack,写使用pack);
  3. 读取或者写入文件中。

重要

Note:写入文件的格式和数据类型之间的关系如下:

格式 C 类型 Python 类型 标准大小
x 填充字节
c char 长度为 1 的字节串 1
b signed char 整数 1
B unsigned char 整数 1
? _Bool bool 1
h short 整数 2
H unsigned short 整数 2
i int 整数 4
I unsigned int 整数 4
l long 整数 4
L unsigned long 整数 4
q long long 整数 8
Q unsigned long long 整数 8
n ssize_t 整数
N size_t 整数
e (6) float 2
f float float 4
d double float 8
s char[] 字节串
p char[] 字节串
P void * 整数

写入 bin 文件主要是将二进制数据写入,如果一开始就是二进制数据,那么就不需要进行 structpack 操作。另外,对于python的数据类型,写入文件的字节顺序、大小与对齐方式可以设置,详细见官方文档[2]。

参考

1、python bin 文件处理 - 云 + 社区 - 腾讯云 (tencent.com)

2、struct — 将字节串解读为打包的二进制数据 — Python 3.8.12 文档

使用python对bin文件进行操作相关推荐

  1. python和R文件IO操作对比及dataframe创建方式对比:read_csv、to_csv、write.csv、 data.frame、pd.DataFrame

    python和R文件IO操作对比及dataframe创建方式对比 很多工程师可能刚开始的时候只熟悉python或者R其中的一个进行数据科学相关的任务. 那么如果我们对比这学习可以快速了解语言设计背后的 ...

  2. python 读取bin文件

    python读取bin文件并下发串口 # coding:utf-8import time, serialfrom struct import *import binascii file = open( ...

  3. Python中有关文件的操作

    Python中有关文件的操作 1.文件路径的书写 import os #这里返回的值是字符串 path = os.path.join(root_dir,file_dir) 2.列出文件夹中的文件 im ...

  4. python中的文件读写操作

    python中的文件读写操作 思维导图 Python读写CSV文件 csv文件是什么? CSV(Comma Separated Values)全称逗号分隔值文件是一种简单.通用的文件格式,被广泛的应用 ...

  5. python之file文件写入操作

    视频地址: python之file文件写入操作 更多精彩内容,敬请扫码关注(HelloWorld小码农):

  6. Python:目录和文件的操作模块os.path和OS常用方法

    1.目录和文件的操作模块os.path,在使用之前要先导入:import os.path.它主要有以下几个重要的功能函数: #!/user/bin/python #coding= utf-8impor ...

  7. 艺赛旗(RPA) Python 常见 excel 文件的操作模块

    艺赛旗 RPA8.0全新首发免费下载 点击下载 http://www.i-search.com.cn/index.html?from=line1 为更加深入的理解Python及理解艺赛旗机器人的操作原 ...

  8. python 对象序列化 pickling_[Python]对dat文件的操作:序列化对象

    一:dat文件 在我之前的博客中,我介绍了对txt文件操作的一些相关知识,以及如何对其进行读写操作,也介绍了文本文件和二进制文件的一些区别.虽然对txt文件操作已经能够满足储存数据的需求,但txt文件 ...

  9. 【Python基础】Python十大文件骚操作!!

    来源:Python数据科学 作者:东哥起飞 日常对于批量处理文件的需求非常多,用Python写脚本可以非常方便地实现,但在这过程中难免会和文件打交道,第一次做会有很多文件的操作无从下手,只能找度娘. ...

  10. 整理与总结Python关于对文件的操作

    一.前言 python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块 二.操作命令 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指 ...

最新文章

  1. 人脸识别经典算法:特征脸方法(Eigenface)
  2. nginx+uwsgi+flask配置记录
  3. 国际货运快递操作流程
  4. python多线程有用吗_Python多线程理解
  5. 空间计量模型_截面数据空间计量模型空间误差模型及Stata操作和应用
  6. Jmeter 的json Extractor
  7. 软件测试之项目立项与需求评审
  8. 数字通信技术知识点二
  9. 令 Debian 支援中文
  10. TeamViewer远程连接控制软件
  11. HDU 2079 (母函数)
  12. [渝粤教育] 南阳理工学院 英语漫话中国文化 参考 资料
  13. Matlab中的c2d函数用法
  14. windows操作系统杂谈
  15. 学生Web开发人员练习:电影评论II
  16. arnold如何设置鱼眼相机_【总结】如何看待默认渲染器、arnold阿诺德渲染器、Octane渲染器、Redshift等渲染器?...
  17. a链接实现alt提示
  18. 在linux下安装chrome 浏览器
  19. 韦东山嵌入式第一期学习笔记DAY_1——3_1_linux命令入门演示
  20. java 实现导出excel模板

热门文章

  1. bo耳机h5使用说明_五分钟了解Bamp;O耳机音箱能不能买
  2. Linux命令brctl介绍
  3. js的中文在网页中显示为乱码
  4. 如何vista中使用netmeeting
  5. 动态苹果屏保壁纸软件Brooklyn Mac免费版
  6. 内存控制器与SDRAM【赞】
  7. 实现H5页面微信分享功能
  8. 数据结构实验一 顺序表的插入、删除
  9. Faster RCNN学习笔记
  10. 修改棋牌服务器,关于棋牌服务器的一些程序搭建和数据应用步骤