摘要:保存的路徑構(gòu)建的,可通過(guò)獲得我們將的返回值記為,然后在調(diào)用后,將會(huì)返回一個(gè)當(dāng)前訓(xùn)練步數(shù)現(xiàn)在我們就可以使用查看訓(xùn)練過(guò)程了在中輸入如下命令響應(yīng)在瀏覽器中打開(kāi)沒(méi)錯(cuò)這就是我們和過(guò)程中的情況。
為什么需要TensorBoard
當(dāng)我們訓(xùn)練一個(gè)deep learning模型時(shí),怎么樣判斷當(dāng)前是過(guò)擬合,還是欠擬合等狀態(tài)呢?實(shí)踐中,我們常常會(huì)將數(shù)據(jù)集分為三部分:train、validation、test。訓(xùn)練過(guò)程中,我們讓模型盡力擬合train數(shù)據(jù)集,在validation數(shù)據(jù)集上測(cè)試擬合程度。當(dāng)訓(xùn)練過(guò)程結(jié)束后,我們?cè)趖est集上測(cè)試模型最終效果。有經(jīng)驗(yàn)的煉丹師往往會(huì)通過(guò)模型在train和validation上的表現(xiàn),來(lái)判斷當(dāng)前是否是過(guò)擬合,是否是欠擬合。這個(gè)時(shí)候,TensorBoard就派上了大用場(chǎng)!
TensorBoard的效果有沒(méi)有覺(jué)的一目了然呢?我強(qiáng)烈推薦大家使用TensorBoard,使用后煉丹功力顯著提升!
如何使用TensorBoard下面,我來(lái)講一下如何使用TensorBoard。要使用,也要優(yōu)雅!
如果你喜歡自己梳理知識(shí),自己嘗試,那么不妨閱讀官方文檔:戳這里查看官方文檔
不然的話(huà),就隨著老夫玩轉(zhuǎn)TensorBoard吧 ^0^
熟悉一個(gè)新知識(shí)的時(shí)候,應(yīng)該將不必要的東西最精簡(jiǎn)化,將注意力集中到我們最關(guān)注的地方,所以,我寫(xiě)了一個(gè)最簡(jiǎn)單的模型,在這個(gè)模型的基礎(chǔ)上對(duì)TensorBoard進(jìn)行探索。
首先看一下這個(gè)極簡(jiǎn)的線(xiàn)性模型:
import tensorflow as tf import random class Model(object): def __init__(self): self.input_x = tf.placeholder(dtype=tf.float32, shape=[None, ], name="x") self.input_y = tf.placeholder(dtype=tf.float32, shape=[None, ], name="y") W = tf.Variable(tf.random_uniform([1], -1.0, 1.0), dtype=tf.float32) b = tf.Variable(tf.random_uniform([1], -1.0, 1.0), dtype=tf.float32) y_predict = self.input_x * W + b self.loss = tf.reduce_sum(tf.abs(y_predict - self.input_y))
相信這個(gè)模型大家很快就能看懂,所以就不多說(shuō)了。接下來(lái)看構(gòu)造數(shù)據(jù)的代碼:
x_all = [] y_all = [] random.seed(10) for i in range(3000): x = random.random() y = 0.3 * x + 0.1 + random.random() x_all.append(x) y_all.append(y) x_all = np.array(x_all) y_all = np.array(y_all) shuffle_indices = np.random.permutation(np.arange(len(x_all))) x_shuffled = x_all[shuffle_indices] y_shuffled = y_all[shuffle_indices] bound = int(len(x_all) / 10 * 7) x_train = x_shuffled[:bound] y_train = y_shuffled[:bound] x_val = x_shuffled[bound:] y_val = y_shuffled[bound:]
這段代碼里做了三件事:
構(gòu)造3000個(gè)符合y = 0.3 * x + b關(guān)系,且增加了隨機(jī)噪聲的數(shù)據(jù)
對(duì)數(shù)據(jù)進(jìn)行shuffle
按照7比3的比例,將3000個(gè)數(shù)據(jù)集劃分為訓(xùn)練集和驗(yàn)證集兩部分
下面是對(duì)數(shù)據(jù)按batch取出:
def batch_iter(data, batch_size, num_epochs, shuffle=True): """ Generates a batch iterator for a dataset. """ data = np.array(data) data_size = len(data) num_batches_per_epoch = int((len(data)-1)/batch_size) + 1 for epoch in range(num_epochs): # Shuffle the data at each epoch if shuffle: shuffle_indices = np.random.permutation(np.arange(data_size)) shuffled_data = data[shuffle_indices] else: shuffled_data = data for batch_num in range(num_batches_per_epoch): start_index = batch_num * batch_size end_index = min((batch_num + 1) * batch_size, data_size) yield shuffled_data[start_index:end_index]
然后就到了比較本篇博客的核心部分:
首先我來(lái)描述一下關(guān)鍵的函數(shù)(大部分同學(xué)內(nèi)心一定是拒絕的 2333,所以建議先看下面的代碼,然后再反過(guò)頭來(lái)看函數(shù)的介紹):
tf.summary.scalar(name, tensor, collections=None, family=None),調(diào)用這個(gè)函數(shù)來(lái)觀察Tensorflow的Graph中某個(gè)節(jié)點(diǎn)
tensor:我們想要在TensorBoard中觀察的節(jié)點(diǎn)
name:為該節(jié)點(diǎn)設(shè)置名字,在TensorBoard中我們觀察的曲線(xiàn)將會(huì)以name命名
tf.summary.merge(inputs, collections=None, name=None)
inputs:由scalar函數(shù)返回值組成的list
tf.summary.FileWriter,在給定的目錄中創(chuàng)建一個(gè)事件文件(event file),將summraies保存到該文件夾中。
__init__(logdir, graph=None, max_queue=10, flush_secs=120, graph_def=None, filename_suffix=None)
logdir:保存event file的路徑
graph: Tensorflow構(gòu)建的graph,可通過(guò)session.graph獲得
add_summary(summary, global_step=None)
summary:我們將tf.summary.merge的返回值記為summary_op,然后在調(diào)用sess.run(summary_op)后,將會(huì)返回一個(gè)summary
global_step:當(dāng)前訓(xùn)練步數(shù)
with tf.Graph().as_default(): sess = tf.Session() with sess.as_default(): m = model.Model() global_step = tf.Variable(0, name="global_step", trainable=False) optimizer = tf.train.AdamOptimizer(1e-2) grads_and_vars = optimizer.compute_gradients(m.loss) train_op = optimizer.apply_gradients(grads_and_vars=grads_and_vars, global_step=global_step) loss_summary = tf.summary.scalar("loss", m.loss) train_summary_op = tf.summary.merge([loss_summary]) train_summary_writer = tf.summary.FileWriter("./summary/train", sess.graph) dev_summary_op = tf.summary.merge([loss_summary]) dev_summary_writer = tf.summary.FileWriter("./summary/dev", sess.graph) def train_step(x_batch, y_batch): feed_dict = {m.input_x: x_batch, m.input_y: y_batch} _, step, summaries, loss = sess.run( [train_op, global_step, train_summary_op, m.loss], feed_dict) train_summary_writer.add_summary(summaries, step) def dev_step(x_batch, y_batch): feed_dict = {m.input_x: x_batch, m.input_y: y_batch} step, summaries, loss = sess.run( [global_step, dev_summary_op, m.loss], feed_dict) dev_summary_writer.add_summary(summaries, step) sess.run(tf.global_variables_initializer()) batches = batch_iter(list(zip(x_train, y_train)), 100, 100) for batch in batches: x_batch, y_batch = zip(*batch) train_step(x_batch, y_batch) current_step = tf.train.global_step(sess, global_step) if current_step % 3 == 0: print(" Evaluation:") dev_step(x_val, y_val)
現(xiàn)在我們就可以使用TensorBoard查看訓(xùn)練過(guò)程了~~
在terminal中輸入如下命令:
tensorboard --logdir=summary
響應(yīng)TensorBoard 0.4.0rc3 at http://liudaoxing-Lenovo-Rescuer-15ISK:6006 (Press CTRL+C to quit)
在瀏覽器中打開(kāi) "http://liudaoxing-Lenovo-Resc...:6006"
沒(méi)錯(cuò)!這就是我們train和validation過(guò)程中l(wèi)oss的情況。
點(diǎn)擊GRAPHS,就可以看到網(wǎng)絡(luò)的結(jié)構(gòu)
麻雀雖小,五臟俱全。希望大家有收獲~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41317.html
當(dāng)我們構(gòu)建一個(gè)深度學(xué)習(xí)模型時(shí),了解模型的結(jié)構(gòu)和參數(shù)是非常重要的。TensorFlow提供了一種可視化網(wǎng)絡(luò)的編程技術(shù),它可以幫助我們更好地理解模型的結(jié)構(gòu)和參數(shù),從而更好地調(diào)整模型以獲得更好的性能。 TensorFlow提供了一個(gè)名為T(mén)ensorBoard的工具,它可以可視化我們的模型。TensorBoard可以顯示訓(xùn)練和驗(yàn)證的損失曲線(xiàn)、模型的結(jié)構(gòu)、參數(shù)分布等信息。在本文中,我們將介紹如何使用Ten...
摘要:那他們有什么區(qū)別呢顧名思義,是一個(gè)名稱(chēng)作用域,是變量作用域。這兩種創(chuàng)建方式也是有區(qū)別的。在下時(shí),創(chuàng)建的變量名不受的影響,而且在未指定共享變量時(shí),如果重名就會(huì)報(bào)錯(cuò)。要注意的是,下面的代碼會(huì)報(bào)錯(cuò)。 前言 只有光頭才能變強(qiáng)。文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y 回顧前面: 從零開(kāi)始學(xué)TensorFlow【...
摘要:在本教程中,我會(huì)介紹如何只使用低級(jí)別的工具從零開(kāi)始構(gòu)建卷積神經(jīng)網(wǎng)絡(luò),以及使用可視化我們的計(jì)算圖和網(wǎng)絡(luò)的表現(xiàn)。選擇模型接下來(lái),我必須決定使用哪個(gè)卷積神經(jīng)網(wǎng)絡(luò)的模型。實(shí)質(zhì)上,大多數(shù)卷積神經(jīng)網(wǎng)絡(luò)都包含卷積和池化。 如果使用TensorFlow的所有較高級(jí)別的工具,例如tf.contrib.learn和Keras,你可以輕松地使用非常少量的代碼來(lái)構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)。但是經(jīng)常使用這些較高級(jí)別的應(yīng)用,你就...
閱讀 2458·2021-11-18 10:02
閱讀 718·2021-10-08 10:04
閱讀 2315·2021-09-03 10:51
閱讀 3580·2019-08-30 15:44
閱讀 2837·2019-08-29 14:09
閱讀 2493·2019-08-29 12:21
閱讀 2101·2019-08-26 13:45
閱讀 1828·2019-08-26 13:25