Tensorboard數據(tfevents文件)格式解析及ofstream使用問題


1.前言

  TensorFlow中的圖和變量可以通過TensorBoard進行顯示,主要使用tf.summary.FileWriter、tf.scalar_summary、tf.image_summary等API將信息保存。保存的文件名格式為:events.out.tfevents.timestamp.hostname,例如:events.out.tfevents.1530003338.BJSR-U10。

  然后執行命令:tensorboard --logdir=eventfile_dir(指定event file的路徑)即可啟動6006端口作為tensorboard的服務端口,通過瀏覽器便可以打開event file,顯示其中保存的內容

 

2.event file文件格式

  tensorflow源碼中,保存event file的代碼主要由兩部分完成:其中大部分是由python實現,在python/summary目錄下,包含了所有summary相關的操作;另外,最重要的event_writer類是由C++實現,

文件目錄為core/util/event_writer.h。其中保存eventFile的函數為EventsWriter::WriteEvent(const Event& event),在這個函數中又調用了RecordWriter::WriteRecord(StringPiece data),在這個函數中可以看到單個event記錄的格式,分為4各部分:

1  uint64   length                             //event序列化后的字符串長度 
2  uint32   masked crc of length     //對length的CRC校驗
3  byte      data[length]                   //event序列化后的字符串
4  uint32   masked crc of data       //對這個字符串的CRC校驗

注意:Event這個類是由event.proto編譯而來的(tf源碼中包含大量的proto文件,proto文件的主要作用是實現數據的序列化,可以方便地跨平台,跨語言的實現數據的存儲和解析),保存event file還涉及的proto文件包括:summary.proto、tensor.proto、tensor_shape.proto、types.proto(這里需要有proto的基礎知識才能看懂源碼,可以去簡單學習下:https://developers.google.com/protocol-buffers/docs/overview

知道了tensorboard需要的數據存儲格式,我們其實可以自己實現event file的保存。只要按照上面的格式進行存儲,保存之后就可以用tensorboard進行顯示,可以參考:https://github.com/RustingSword/tensorboard_logger/blob/master/README.md以及https://github.com/dmlc/tensorboard/blob/master/python/tensorboard/record_writer.py。分別為C++的實現和python的實現

 

3. std::ofstream  operator<< 和  std::ofstream::write的區別

  在保存文件的時候可以使用ofstream  operator<< 或者write,一開始樓主使用的就是 operator<< (注:tf源碼使用的string.append),雖然成功生成了event file但是使用tensorboard打開時總是報錯Unable to get first event timestamp for run。后來經過反復的嘗試,改用了std::ofstream::write就可以正常顯示了。

  這里記下二者的區別:operator<<會將存儲的數據文本化,而write則會將內存的數據原封不動的存入文件,也就是說如果你的文件是二進制文件,那么你只能使用write,而tensorboard的文件正是二進制文件,所以改用write就解決了上面的問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM