为了账号安全,请及时绑定邮箱和手机立即绑定

如何将火炬张量转换为字节字符串?

如何将火炬张量转换为字节字符串?

千万里不及你 2023-08-08 10:31:27
我正在尝试使用 protobuf 序列化火炬张量,但似乎使用BytesIOwithtorch.save()不起作用。我努力了:import torch import iox = torch.randn(size=(1,20))buff = io.BytesIO()torch.save(x, buff)print(f'buffer: {buff.read()}')无济于事,因为它会导致b''输出!我该怎么办?
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

在读取之前,您需要seek先到达缓冲区的开头:

import torch 

import io

x = torch.randn(size=(1,20))

buff = io.BytesIO()

torch.save(x, buff)

buff.seek(0)  # <--  this is what you were missing

print(f'buffer: {buff.read()}')

给你这个宏伟的输出:


buffer: b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x12\x00archive/data.pklFB\x0e\x00ZZZZZZZZZZZZZZ\x80\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\nFloatStorage\nq\x02X\x0f\x00\x00\x00140417054790352q\x03X\x03\x00\x00\x00cpuq\x04K\x14tq\x05QK\x00K\x01K\x14\x86q\x06K\x14K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\xf3\x08u\x13\xa8\x00\x00\x00\xa8\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x0e\x00archive/data/140417054790352FB\n\x00ZZZZZZZZZZ\xba\xf3x?\xb5\xe2\xc4=)R\x89\xbfM\x08\x19\xbfo%Y\xbf\x05\xc0_\xbf\x03N4\xbe\xdd_ \xc0&\xc4\xb5?\xa7\xfd\xc4?f\xf1$?Ll\xa6?\xee\x8e\x80\xbf\x88Uq?.<\xd8?{\x08\xb2?\xb3\xa3\xba>q\xcd\xbc?\xba\xe3h\xbd\xcan\x11\xc0PK\x07\x08A\xf3\xdc>P\x00\x00\x00P\x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x003\x00archive/versionFB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xf3\x08u\x13\xa8\x00\x00\x00\xa8\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00archive/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00A\xf3\xdc>P\x00\x00\x00P\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00archive/data/140417054790352PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00archive/versionPK\x06\x06,\x00\x00\x00\x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xd7\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xc5\x00\x00\x00\x12\x02\x00\x00\x00\x00'



查看完整回答
反对 回复 2023-08-08
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

ByteIO您可以使用pickle.loads/dumps.

 pytorch 的自定义酸洗处理程序最终确实会使用torch.save,但需要序列化较少的对象,从而产生 469 长度与 811 长度字节的字符串。但不确定哪个更快。

import pickle, torch


x = torch.randn(size=(1,20))


pickled = pickle.dumps(x)


print(f"length of {len(pickled)} vs 811 for the BytesIO approaches")

# => length of 469 vs 811 for the BytesIO approaches


print(pickled)

# => b'\x80\x04\x95\xca\x01\x00\x00\x00\x00\x00\x00\x8c\x0ctorch._utils\x94\x8c\x12_rebuild_tensor_v2\x94\x93\x94(\x8c\rtorch.storage\x94\x8c\x10_load_from_bytes\x94\x93\x94B?\x01\x00\x00\x80\x02\x8a\nl\xfc\x9cF\xf9 j\xa8P\x19.\x80\x02M\xe9\x03.\x80\x02}q\x00(X\x10\x00\x00\x00protocol_versionq\x01M\xe9\x03X\r\x00\x00\x00little_endianq\x02\x88X\n\x00\x00\x00type_sizesq\x03}q\x04(X\x05\x00\x00\x00shortq\x05K\x02X\x03\x00\x00\x00intq\x06K\x04X\x04\x00\x00\x00longq\x07K\x04uu.\x80\x02(X\x07\x00\x00\x00storageq\x00ctorch\nFloatStorage\nq\x01X\x08\x00\x00\x0097668208q\x02X\x03\x00\x00\x00cpuq\x03K\x14Ntq\x04Q.\x80\x02]q\x00X\x08\x00\x00\x0097668208q\x01a.\x14\x00\x00\x00\x00\x00\x00\x00j\x0b\xeb?4\xcc\x1b?\xfa\xa9$\xbe\x86\xc69>\xab\xd0#?\x14}H>\xd16#\xc0\x04\x8e\x0b?\xadg\x1a?\xe2\xb5g??\xf0\x83\xbf\x02E\x89\xbf0\xf8\xe0>\x04\xc8L?\x89\xfc\x06?\xa0\xcf)\xbf\xb9\xa7\x1b@^\xd3\xa0\xbfJ\xda\xbd\xbfE\x95\x99\xbe\x94\x85\x94R\x94K\x00K\x01K\x14\x86\x94K\x14K\x01\x86\x94\x89\x8c\x0bcollections\x94\x8c\x0bOrderedDict\x94\x93\x94)R\x94t\x94R\x94.'


print(pickle.loads(pickled))

# => tensor([[ 0.7662,  0.7422,  0.1888,  ..., -0.2035,  1.0845, -0.9637]])


查看完整回答
反对 回复 2023-08-08
?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

使用BytesIO.getvalue方法。

除了seek-ing 和read-ing 之外,您还可以使用对象getvalue的方法io.BytesIO。它在内部执行seek-read并返回存储的字节:

In [1121]: x = torch.randn(size=(1,20))                                                                                                                        

buff = io.BytesIO()                                                                                                                                            

torch.save(x, buff)                                                                                                                                            

print(f'buffer: {buff.getvalue()}')                                                                                                                            

                                                                                                                                                               

buffer: b'PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x12\x00archive/data.pklFB\x0e\\

x00ZZZZZZZZZZZZZZ\x80\x02ctorch._utils\n_rebuild_tensor_v2\nq\x00((X\x07\x00\x00\x00storageq\x01ctorch\nFloatStorage\nq\x02X\x01\x00\x00\x000q\x03X\x03\x00\x0\

0\x00cpuq\x04K\x14tq\x05QK\x00K\x01K\x14\x86q\x06K\x14K\x01\x86q\x07\x89ccollections\nOrderedDict\nq\x08)Rq\ttq\nRq\x0b.PK\x07\x08\x949f)\x9a\x00\x00\x00\x9a\\

x00\x00\x00PK\x03\x04\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00*\x00archive/data/0FB&\x00ZZZZZZZZZZZZZZZ\

ZZZZZZZZZZZZZZZZZZZZZZZ\xff*\x1f\xbfM\xaa\x16?\x9fB\xbd?\x14\xee\xb4\xbe\xbc\x83^>l.\xba>\x8d\xc0\x1f\xbfZ\x06\x03\xbe\xe0(B\xbe^[\xf8\xbeE\x83\x9f\xbfUo\xc0\\

xbd\xbaX\xb7?\x83MH\xbf\xc0\x0c\xbb\xbf\xa4s\xc9?\x84\x8b\xd9\xbf\xa1\x91\xa1\xbf\xc6,\x0c?kxW?PK\x07\x08/\n\x02&P\x00\x00\x00P\x00\x00\x00PK\x03\x04\x00\x00\\

x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x003\x00archive/versionFB/\x00ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\

ZZZ3\nPK\x07\x08\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00\x949f)\x9a\x00\x00\x00\x9a\x00\x00\x00\x1\

0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00archive/data.pklPK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x00\x00/\n\x02&P\x00\x\

00\x00P\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00archive/data/0PK\x01\x02\x00\x00\x00\x00\x08\x08\x00\x00\x00\x00\x0\

0\x00\xd1\x9egU\x02\x00\x00\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x01\x00\x00archive/versionPK\x06\x06,\x00\x00\x00\\

x00\x00\x00\x00\x1e\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x\

12\x02\x00\x00\x00\x00\x00\x00PK\x06\x07\x00\x00\x00\x00\xc9\x02\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\xb7\x00\x00\

\x00\x12\x02\x00\x00\x00\x00' 


getvalue对于任何对象也同样有效io.StringIO,但它返回的是存储的字符串,而不是字节,如预期的那样。


查看完整回答
反对 回复 2023-08-08
  • 3 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信