TensorFlow中tf.train.Feature初始化类型不匹配报错求助
解决TFRecord Feature初始化的类型匹配问题
嘿,我来帮你搞定这个TFRecord序列化的问题~你遇到的错误都是因为Feature的参数类型不匹配导致的,咱们一步步理清楚:
错误原因分析
第一个TypeError:你给
tf.train.Feature的bytes_list参数传了tf.train.Int64List,这就像给装水的杯子放了石头——类型完全不对!每个Feature的参数要严格对应:- 字节/字符串类型 → 用
bytes_list参数,对应tf.train.BytesList - 整数类型 → 用
int64_list参数,对应tf.train.Int64List - 浮点数类型 → 用
float_list参数,对应tf.train.FloatList
- 字节/字符串类型 → 用
第二个TypeError:
tf.train.BytesList要求传入的是字节对象,你直接传了整数numpy数组,肯定会报错。如果要把非字节类型转成字节存储,得先序列化数据。
正确的代码示例
下面是修正后的完整代码,覆盖三种常见Feature类型:
import tensorflow as tf import numpy as np # 1. 字符串/字节类型Feature # Python3中字符串是Unicode,必须转成bytes才能存入BytesList str_values = np.array(["a", "b"], dtype=str) feature_str = tf.train.Feature( bytes_list=tf.train.BytesList(value=[s.encode("utf-8") for s in str_values]) ) # 2. 整数类型Feature # 注意用int64_list参数对应Int64List,numpy数组保持int64 dtype更稳妥 int_values = np.array([32, 24], dtype=np.int64) feature_int = tf.train.Feature( int64_list=tf.train.Int64List(value=int_values) ) # 3. 浮点数类型Feature # float_list对应FloatList,numpy数组用float32或float64都可以 flo_values = np.array([32.1, 24.1], dtype=np.float32) feature_flo = tf.train.Feature( float_list=tf.train.FloatList(value=flo_values) )
额外小技巧:存储整个numpy数组
如果你想把一整个数组(比如图片张量、矩阵)作为单个Feature存储,需要先把数组序列化成字节,再用BytesList:
# 序列化整个numpy数组 arr = np.array([[1, 2], [3, 4]], dtype=np.float32) feature_arr = tf.train.Feature( bytes_list=tf.train.BytesList(value=[arr.tobytes()]) ) # 读取时反序列化的方式 # restored_arr = np.frombuffer(features['arr'].bytes_list.value[0], dtype=np.float32).reshape(2, 2)
这样修改后,你的Feature初始化就不会报错啦~
内容的提问来源于stack exchange,提问作者Chen Wei
相关产品推荐
相关产品推荐

