1. 程式人生 > 程式設計 >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實現存浮點數陣列就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。