詳細介紹:
基礎操作兩方面:
第一方面:“製作”各種標量、記錄節點,圖標、圖片等的記錄彙集,sess.run從計算圖得到一次彙集的記錄。
關於sess.run(merged),可以把這個也當做計算圖中得到了一個結果,只是不同用途。既然是計算圖,就少不了要feed數據,feed的數據不同,得到的結果也就不同,如果使用了錯誤的feed數據,很可能得到的繪製結果也不符合預期,下邊會有例子介紹!
剩下的也就是scalar和histgram對tensor形狀的要求不同,輸入錯了自然報錯(手動滑稽),image的話,也要先reshape到合適的形狀。
第二方面:利用本graph初始化writer,把sess.run得到的記錄通過writer寫入文件,關閉writer。
唯一注意的就是那個global_step的意義,這個step也就是繪製圖標的橫軸座標了,如果用普通的i,如果斷點續訓從頭開始計算,那麼圖標也就繪製爛了,所以最好是用有記錄的global_step,能夠保證斷點續訓的圖片繪製完整。
tf.summary.scalar/image/histogram()
merged = tf.summary.merge_all()
summary = sess.run(merged)
writer = tf.summary.FileWriter(logdir, graph=sess.graph)
writer.add_summary(summary, global_step=i)
writer.close()
兩種合併方法,第一種全合併,比較簡單;第二種指定,精簡,比如同時觀察訓練集和測試集的準確率,參數之類的不需要也顯示兩份。
summary_ce = tf.summary.scalar('cross_entropy', cross_entropy)
summary_accuracy = tf.summary.scalar('accuracy', accuracy)
merged = tf.summary.merge_all()
test_merged = tf.summary.merge(inputs=[summary_ce,summary_accuracy])
特殊用法:
同時顯示訓練集和測試集曲線
用兩個writer,指定兩個路徑,分別記錄訓練集和測試集的準確率,運行tensorboard同時讀取兩個event文件。
#tensorboard --logdir = event1:"dir1",eventrun2:"dir2"
應用場景
應用:對比測試集與訓練集的準確率
如果是帶dropout的訓練,不要在train同時得到accuracy,會出現準確率倒掛,訓練準確率低於測試準確率(藍線).
改完了也不能明顯看到“訓練準確率高於測試準確率”的情況
也有一方面原因是conv解MNIST太簡單了,拉不開差距,test用的batch太小了,不容易反應整體,拉不開差距,因爲機器性能的限制,一次不能運行整個測試集,summary是拿tensor,是tensor就得feed數據,feed數據就有size限制,又不可以在python裏自己做循環和平均,這是個問題。
問題:兩個event的顯示顏色不如人意
因爲運行參數等於dict形式,training排在testing後邊,所以顏色調轉。自己改改名字就好了
應用:利用命名空間分類查看
變量太多的時候,看起來會很混亂,使用命名空間就很有用了。
例如第二個FC對應的BN層,先get到tensor,然後把tensor添加到histogram,命名,加bf_fc2前綴
gamma = tf.get_default_graph().get_tensor_by_name(name='bn_fc2/gamma:0')
beta = tf.get_default_graph().get_tensor_by_name(name='bn_fc2/beta:0')
moving_mean = tf.get_default_graph().get_tensor_by_name(name='bn_fc2/moving_mean:0')
moving_variance = tf.get_default_graph().get_tensor_by_name(name='bn_fc2/moving_variance:0')
tf.summary.histogram('bn_fc2/gamma', gamma)
tf.summary.histogram('bn_fc2/beta', beta)
tf.summary.histogram('bn_fc2/moving_mean', moving_mean)
tf.summary.histogram('bn_fc2/moving_variance', moving_variance)
應用:增加GRAPH可讀性
大多數時候,計算圖中,除了主流程,還會有各種依賴關係和邊角操作,增加圖像複雜度,降低可讀性,可以把無關操作從圖中去除。
應用:驗證ReLU“最優”bias初始值
初學可能不知道bias改初始化成什麼,看過些代碼可能認爲biases初始化爲0.1合適,但是不看圖是不知道爲什麼的。
通過tensorboard打印biases的分佈,可以看到想要的答案。
如下:兩層conv(32,64),ReLU激活,兩層fc(包括輸出層,1024,10),識別MNIST。
W初始化0,b初始化0.1,W的分佈很穩的在0附近。
batch=256,20000步,b有所下降,但是也沒接近0
其他不動,biases初始化變成0.2
其實按比例看的話,0.2和0.1趨勢差異並不明顯,因爲我也沒空無限訓練下去,20k截止。
初始化biases爲0.0:
也沒什麼上升趨勢,證明0.1不一定代表最優,但是這個模型也只是個例。總之,訓練之後的biases比較趨近0~0.2這個範圍。
雖然初始0也沒上升到0.1的趨勢,但是也不能用0,0有另一個缺點,ReLU負軸輸出0,正軸斜率是1,w和b都是0的話,正反都輸出0,不利於訓練。
biases初始化0.0和0.1的各層輸出分佈:不能從圖形上直接說0.0很不好,但是對比0.1,仔細看縱座標,確實0.1的初始化初期輸出的分佈更廣泛一些,而訓練之後的輸出分佈,也是趨向於更寬泛。
準確率變化區別不明顯
前邊用的ReLU(0.1針對ReLU),作爲對比,用sigmoid試一下(縮減步數):
初始化0.0(有變負數趨勢)
初始化0.1(第一層有明顯的變負趨勢,後邊不明顯)
結論:
所以,0.1是一個自然選擇,並且人工trade-off的值。
第一層影響比較大,趨勢明顯,後邊的逐漸不明顯,如果有BN,可能進一步衰減。
考慮到模型寬容度過高,很早準確率就封頂,實驗效果也不好,還有不同的模型,複雜模型和簡單模型也不一樣,情況太多,沒法測完,有機會再完善。
但是很明顯,0.1也不是真理,每一個模型,每一層,都多少有些不一樣。
todo:更進一步,爲什麼恰巧是0.1?可以觀察用不同的數據集不同的標籤,比如20個標籤或者5個標籤,是否都是0.1附近最優?