当前位置: 首页 > 编程笔记 >

tensorflow之tf.record实现存浮点数数组

郝玄天
2023-03-14
本文向大家介绍tensorflow之tf.record实现存浮点数数组,包括了tensorflow之tf.record实现存浮点数数组的使用技巧和注意事项,需要的朋友参考一下

因为最近打算转战Tensorflow,我将自己的脑部肿瘤分割课题从caffe转移到tensorflow上去

然后我将数据存到Tf.record里面去,出现来不收敛,以及精度上不去的等现象。

最终原因是:数据 存入tf.record,我转为二进制也就是使用来tobytes()函数,再将数据存入tf.record,浮点数以二进制存入会有精度丢失问题。

其实:当发现这个精度上不去的现象之后,我第一反应就是是不是精度丢失,然后上网跟别人交流,告诉我不可能是精度丢失,不信让我输出来看,结果我输出来看后,发现数值确实没有变化,所以就放弃来这个精度丢失的方向,转而去找别的方向,结果几经周折,无果之后,再来尝试这个,发现,确实是转为二进制导致来精度丢失(确实浪费来我很多精力,甚至一度想放弃)。

经验教训:跟别人交流,一定要保持理性,可以尝试别人的方法,但是不能丢掉自己的想法,因为没有人比你自己更了解你的项目。

下面来讲讲,如何将浮点数组存进tf.record:简单记录,不懂可以评论:

import tensorflow as tf
import numpy as np
 
def _floats_feature(value):
  #这里的value=后面没有括号
  #千万不要写成return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))
  return tf.train.Feature(float_list=tf.train.FloatList(value=value))
 
# data you would like to save, dtype=float32
#这里我生成了一个浮点数数组,来假定作为我的数据
data = np.random.randn(shape=(5, 5))
#这里一定要铺平,不然存不进去
data = data.flatten()
 
 
# open tfrecord file
writer = tf.python_io.TFRecordWriter(train_data_path)
 
# make train example
example = tf.train.Example(features=tf.train.Features(
  feature={'data': _floats_feature(data)}))
 
# write on the file
writer.write(example.SerializeToString())

这就是存数据了,下一步读取数据,一定要注意将原来铺平的数据reshape为原来的形状。

# open tfrecorder reader
reader = tf.TFRecordReader()
 
# read file
_, serialized_example = reader.read(filename_queue)
 
# read data
features = tf.parse_single_example(serialized_example,
  features={'data': tf.VarLenFeature(tf.float32)})
 
# make it dense tensor
data = tf.sparse_tensor_to_dense(features['data'], default_value=0)
 
# reshape
data = tf.reshape(data, [5,5])
 
return tf.train.batch(data, batch_size, num_threads, capacity)

以上这篇tensorflow之tf.record实现存浮点数数组就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 我有Java应用程序,它集中处理2D浮动数组(float[][]数组),实际上在黑色背景上保存图像。两个维度是相等的(平方)并且是2的幂(通常是256、512、1024),所以靠近边界的区域在大多数情况下都是零。 为了提高性能(有一些FFT)和降低在这些阵列上操作的复杂性(如旋转等),大小等于2的幂。根据我的计算,这个应用程序的内存消耗应该达到2-3Gb,而达到4-5Gb(查看Windows任务管

  • 小数转 2 进制 方法:乘2取整 对十进制小数乘2得到的整数部分和小数部分,整数部分既是相应的二进制数码,再用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分。如此不断重复,直到小数部分为0或达到精度要求为止。第一次所得到为最高位,最后一次得到为最低位。 如0.25的二进制: 0.25*2 = 0.5 取整是0, 0.5*2 =1.0 取整是1, 即0.25的二进制为 0.01(第一

  • 小数转 2 进制 方法:乘2取整 对十进制小数乘2得到的整数部分和小数部分,整数部分既是相应的二进制数码,再用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分。如此不断重复,直到小数部分为0或达到精度要求为止。第一次所得到为最高位,最后一次得到为最低位。 如0.25的二进制: 0.25*2 = 0.5 取整是0, 0.5*2 =1.0 取整是1, 即0.25的二进制为 0.01(第一

  • 3.2. 浮点数 Go语言提供了两种精度的浮点数,float32和float64。它们的算术规范由IEEE754浮点数国际标准定义,该浮点数规范被所有现代的CPU支持。 这些浮点数类型的取值范围可以从很微小到很巨大。浮点数的范围极限值可以在math包找到。常量math.MaxFloat32表示float32能表示的最大数值,大约是 3.4e38;对应的math.MaxFloat64常量大约是1.8

  • 论浮点数的存储原理:float浮点数与double浮点数的二进制存储原理–>阶码 浮点数转二进制 1.整数int类型和浮点数float类型都是占用4个字节,在计算机中有32位来进行表示,那为什么什么float的范围大于int? 答:因为两者的存储原理一样,虽然该同样是采用二进制的方式进行存储,但是整数类型(int)采用的是补码方式进行存储,但是浮点类型(float)采用的是阶码方式存储.由于阶码内

  • 问题内容: 我很困惑为什么在这种情况下python为什么要添加一些额外的十进制数,请帮助解释 问题答案: 浮点数是一个近似值,它们不能精确存储十进制数。因为它们试图仅用64位表示很大范围的数字,所以它们必须在某种程度上近似。 意识到这一点非常重要,因为它会导致一些怪异的副作用。例如,你可能会非常合理认为,十批的总和会。尽管这似乎合乎逻辑,但在浮点数方面也是错误的: 您可能会认为。浮点世界再次不同意

  • 11.1.3 浮点数 在计算机中,浮点数一般由三部分组成:数值的符号位、阶码和有效数字(以后简称为尾数)。这种浮点数是用科学记数法来表示的,即:浮点数=符号位.有效数字×2阶码。 Intel系列的协处理器支持3种形式的浮点数:短型浮点数(32位)、长型浮点数(64位)和临时浮点数(80位),它们分别对应单精度、双精度和扩展精度浮点数。这些浮点数的数据格式都符合IEEE-754标准,它们的具体格式如

  • 4. 浮点数 浮点数在计算机中的表示是基于科学计数法(Scientific Notation)的,我们知道32767这个数用科学计数法可以写成3.2767×104,3.2767称为尾数(Mantissa,或者叫Significand),4称为指数(Exponent)。浮点数在计算机中的表示与此类似,只不过基数(Radix)是2而不是10。下面我们用一个简单的模型来解释浮点数的基本概念。我们的模型由