如何實現Tensorboard對CNN神經網絡的可視化
Ⅰ.參數可視化:
Ⅱ.結構可視化:
怎麼使用Tensorboard實現這麼professional又pretty(♥∀♥)的網絡可視化操作呢?我們通過下面4個步驟進行對CNN網絡t的可視化實現。
1.命名空間
使用tf.name_scope(“空間名稱”)進行空間的命名,scope即爲範圍的意思。同時可對x,y等自變量進行名稱的設置,通過name="變量名稱"實現。
#命名空間
with tf.name_scope("input"):
# 定義兩個placeholder
x = tf.placeholder(tf.float32, [None, 784], name="x_input") # 28*28,所有像素點,None代表圖片數
y = tf.placeholder(tf.float32, [None, 10], name="y_input") # 10,0~9所有的標籤,
以上述代碼爲例,對CNN神經網絡的卷積,池化操作層以及全連接層進行空間的命名劃分,如下所示:
2.參數概要
使用tf.summary.scalar(“參數名稱”,評估參數)對變量的方差,平均值,標準差,直方圖等可視化操作。這裏我採用自定義函數的方法對這些方法進行統一調用。
#參數概要
def variable_summaries(var):
with tf.name_scope("summaries"):
mean = tf.reduce_mean(var)
tf.summary.scalar("mean", mean)#平均值
with tf.name_scope("stddev"):
stddev = tf.sqrt(tf.reduce_mean(tf.square(var-mean)))
tf.summary.scalar("stddev", stddev)#標準差
tf.summary.scalar("max", tf.reduce_max(var))#最大值
tf.summary.scalar("min", tf.reduce_min(var))#最小值
tf.summary.histogram("histogram", var)#直方圖
又或者單個調用tf.summary.scalar(“參數名稱”,評估變量)。
# 使用交叉熵代價函數
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=h_fc2),name="cross_entropy")
tf.summary.scalar("loss", cross_entropy)
# 求準確率
accuracy = tf.reduce_mean(tf.cast(correct_predict, tf.float32), name="accuracy")
tf.summary.scalar("loss", accuracy)
3.合併所有的summary
使用tf.summary.merge_all()合併所有的summary,在使用默認圖之前。
#合併所有的summary
merged = tf.summary.merge_all()
with tf.Session() as sess:
......
4.保存及更新圖
使用tf.summary.FileWriter(“路徑”, session.graph)保存圖。
使用writer.add_summary(summary, train_step)進行更新圖。
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
#保存圖
writer = tf.summary.FileWriter("log/", sess.graph)
for i in range(21):
for batch in range(n_batch):
batch_x, batch_y = mnist.train.next_batch(batch_size)
summary, _ = sess.run([merged, train_step], feed_dict={x: batch_x, y: batch_y, keep_prob: 0.7})
writer.add_summary(summary, i)
acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0})
print("Iter" + str(i) + ",Test_accuracy=" + str(acc))
這裏需要的注意的地方是:1.summary, _ = sess.run([merged, train_step], feed_dict={x: batch_x, y: batch_y, keep_prob: 0.7})。2.每個分批次的訓練結果存在summary裏面,而當一次完整訓練結束後,writer.add_summary(summary, i)將summary保存更新。
ob: 0.7})。2.每個分批次的訓練結果存在summary裏面,而當一次完整訓練結束後,writer.add_summary(summary, i)將summary保存更新。
5,需要注意的幾個坑
1.使用cmd命令行,需要先定位至events.out.tfevents的文件路徑下。(文件路徑不可以有中文字符)
2.使用Tensorboard --logdir=文件路徑 --port=自定義端口。(使用localhost:6006可能會出現端口占用的問題。)
3.打開谷歌瀏覽器,localhost:端口號即可訪問。
4.如果更新Tensorboard的可視化,需要使用新的自定義端口,如:8009,8010等等。(如果使用相同的舊端口,會導致圖無法更新顯示的問題。)