读取float32

时间:2016-02-06 00:18:17

标签: python tensorflow

我想根据时间信号的功能,使用Tensorflow训练网络。数据在E 3个时期中被分割,每个时期具有F个特征。因此,数据具有

形式
Epoch | Feature 1 | Feature 2 | ... | Feature F |
-------------------------------------------------
1     | ..        | ..        |     | ..        |
      | ..        | ..        |     | ..        |
E     | ..        | ..        |     | ..        |

将数据加载到Tensorflow,我尝试按照cifar示例并使用tf.FixedLengthRecordReader。因此,我已经获取了数据,并将其保存到float32类型的二进制文件中,第一个时期的第一个标签,第一个时期的F个功能,第二个时期的def read_data_file(file_queue): class DataRecord(object): pass result = DataRecord() #1 float32 as label => 4 bytes label_bytes = 4 #NUM_FEATURES as float32 => 4 * NUM_FEATURES features_bytes = 4 * NUM_FEATURES #Create the read operator with the summed amount of bytes reader = tf.FixedLengthRecordReader(record_bytes=label_bytes+features_bytes) #Perform the operation result.key, value = reader.read(file_queue) #Decode the result from bytes to float32 value_bytes = tf.decode_raw(value, tf.float32, little_endian=True) #Cast label to int for later result.label = tf.cast(tf.slice(value_bytes, [0], [label_bytes]), tf.int32) #Cast features to float32 result.features = tf.cast(tf.slice(value_bytes, [label_bytes], [features_bytes]), tf.float32) print ('>>>>>>>>>>>>>>>>>>>>>>>>>>>') print ('%s' % result.label) print ('%s' % result.features) print ('>>>>>>>>>>>>>>>>>>>>>>>>>>>') 个功能,等等。

然而,将此读入Tensorflow对我来说是一个挑战。这是我的代码:

Tensor("Cast:0", shape=TensorShape([Dimension(4)]), dtype=int32)
Tensor("Slice_1:0", shape=TensorShape([Dimension(40)]), dtype=float32)

打印输出为:

describeWithDOM()

令我感到惊讶的是,因为我已经将值转换为float32,所以我希望维度分别为1和10,它们是实际数字,但它们是4和40,它们对应于字节长度。

怎么回事?

1 个答案:

答案 0 :(得分:2)

我认为问题源于tf.decode_raw(value, tf.float32, little_endian=True)返回类型为tf.float32的向量而不是字节向量的事实。用于提取要素的切片大小应指定为浮点值的计数(即NUM_FEATURES),而不是字节数(features_bytes)。

然而,您的标签是整数的轻微皱纹,而矢量的其余部分包含浮点值。 TensorFlow没有很多用于在二进制表示之间进行转换的工具(tf.decode_raw()除外),所以你必须将字符串解码两次到不同的类型:

# Decode the result from bytes to int32
value_as_ints = tf.decode_raw(value, tf.int32, little_endian=True)
result.label = value_as_ints[0]

# Decode the result from bytes to float32
value_as_floats = tf.decode_raw(value, tf.float32, little_endian=True)
result.features = value_as_floats[1:1+NUM_FEATURES]

请注意,这仅适用于sizeof(tf.int32) == sizeof(tf.float32),因为一般情况下这不是真的。在更一般的情况下,一些更多的字符串操作工具可用于切割原始value的适当子字符串。希望这应该足以让你前进。