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各部分:
注意: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就解決了上面的問題。