Python 从协议缓冲区/TFR记录解码字节时的动态数据类型

Python 从协议缓冲区/TFR记录解码字节时的动态数据类型,python,tensorflow,protocol-buffers,Python,Tensorflow,Protocol Buffers,我正在尝试读取tensorflow的python接口中的TFRecords文件。文件中的每个示例都包含一个n维张量及其原始数据类型。n维张量在保存之前被序列化为字节。在读取TFRecords文件时,我想根据每个张量的数据类型对其进行解码。然而,当我尝试这样做时,我遇到了错误,因为tf.io.decode\u raw的out\u type不需要张量。我在下面举了一个例子。如何根据示例中存储的数据类型动态分配out\u类型 将numpy导入为np 导入tensorflow作为tf 定义字节功能(值)

我正在尝试读取tensorflow的python接口中的TFRecords文件。文件中的每个示例都包含一个n维张量及其原始数据类型。n维张量在保存之前被序列化为字节。在读取TFRecords文件时,我想根据每个张量的数据类型对其进行解码。然而,当我尝试这样做时,我遇到了错误,因为
tf.io.decode\u raw
out\u type
不需要张量。我在下面举了一个例子。如何根据示例中存储的数据类型动态分配
out\u类型

将numpy导入为np
导入tensorflow作为tf
定义字节功能(值):
“”“从字符串/字节返回字节列表。”“”
如果isinstance(值,类型(tf.常量(0)):
value=value.numpy()#BytesList不会从张量中解压字符串。
返回tf.train.Feature(bytes\u list=tf.train.BytesList(value=[value]))
def序列化(x):
特征={
“值”:_字节_功能(x.tobytes()),
“dtype”:_字节_功能(x.dtype.name.encode('utf-8'))}
示例=tf.train.example(特征=tf.train.features(特征=feature))
返回示例.SerializeToString()
def解析(序列化):
特征={
“值”:tf.io.FixedLenFeature(shape=[],dtype=tf.string),
“dtype”:tf.io.FixedLenFeature(shape=[],dtype=tf.string)}
返回tf.io.parse_single_示例(序列化,features=features)
x=np.random.random_样本((10,10,10)).aType(np.float32)
序列化=序列化(x)
parsed=parse(序列化)
#这一行导致错误。
tf.io.decode_raw(已解析[“value”],out_type=已解析[“dtype”])
#这很有效。
tf.io.decode_raw(已解析[“值”],out_type=“float32”)

从原始输出类型张量获取其值numpy=b“float32”。然后将字节解码为字符串,该字符串将给出“float32”(或其他动态数据类型)。

欢迎使用堆栈溢出!如果您在代码旁边添加一些解释,您的答案将大大改进;也许解释一下你对OP的代码做了哪些具体的改进,以及为什么他们的改进不正确。这将使您的答案对那些可能有类似问题的人更有帮助,从而使您的答案更有可能获得更高的投票率。我不能使用
.numpy()
,因为这不能序列化到图形中。
tf.io.decode_raw(parsed["value"], out_type=parsed["dtype"].numpy().decode())