只有光头才能变强。html
文本已收录至个人GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3ypython
回顾前面:git
这篇文章主要讲讲TensorBoard的基本使用以及name_scope和variable_scope
的区别github
首先来说讲TensorBoard是什么吧,我当时是在官方文档里学习的,官网也放出了介绍TensorBoard的视频。我在b站搜了一把,发现也有,你们能够先去看看视频了解一下(其实已经说得很好了):shell
为了更方便 TensorFlow 程序的理解、调试与优化,因而就有了TensorBoard 这样的的可视化工具网络
由于咱们编写出来的TensorFlow程序,建好一个神经网络,其实咱们也不知道神经网络里头具体细节到底作了什么,要人工调试十分困难(就比如你没法想象出递归的全部步骤同样)。有了TensorBoard,能够将TensorFlow程序的执行步骤都显示出来,很是直观。而且,咱们能够对训练的参数(好比loss值)进行统计,用图的方式来查看变化的趋势。dom
在视频中其实也有提到,咱们想要TensorBoard的图可以更好地展现(更加有条理),那通常咱们须要对其用name_scope
取名。ide
那除了name_scope
,还有一个叫作variable_scope
。那他们有什么区别呢?顾名思义,name_scope
是一个名称做用域,variable_scope
是变量做用域。工具
在前面文章中,建立变量有两种方式,一种是用tf.get_variable()
来建立,一种是用tf.Variable()
来建立。这两种建立方式也是有区别的。oop
tf.name_scope
下时,tf.get_variable()
建立的变量名不受name_scope
的影响,并且在未指定共享变量时,若是重名就会报错。tf.Variable()
会自动检测有没有变量重名,若是有则会自行处理(自动建立一个)好比下面的代码:
with tf.name_scope('name_sp1') as scp1: with tf.variable_scope('var_scp2') as scp2: with tf.name_scope('name_scp3') as scp3: a = tf.Variable('a') b = tf.get_variable('b')
等同于:
with tf.name_scope('name_sp1') as scp1: with tf.name_scope('name_sp2') as scp2: with tf.name_scope('name_scp3') as scp3: a = tf.Variable('a') with tf.variable_scope('var_scp2') as scp2: b = tf.get_variable('b')
这里体现的是若是用get_variable
的方式来建立对象,是不受name_scope
所影响的。
要注意的是,下面的代码会报错。由于在scp做用域下压根就没有a这个变量,同时又设置成reuse=True
。这里由于的是找不到共享变量而出错!
with tf.variable_scope('scp', reuse=True) as scp: a = tf.get_varialbe('a') #报错
一样地,下面的代码也会报错,由于明明已经有共享变量了,但设置成reuse=false
。因此就会报错。
with tf.variable_scope('scp', reuse=False) as scp: a = tf.get_varialbe('a') a = tf.get_varialbe('a') #报错
最后,咱们再来看这个例子,应该就能够看懂了。
with tf.variable_scope('variable_scope_y') as scope: var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32) scope.reuse_variables() # 设置共享变量 var1_reuse = tf.get_variable(name='var1') var2 = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32) var2_reuse = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print(var1.name, sess.run(var1)) print(var1_reuse.name, sess.run(var1_reuse)) print(var2.name, sess.run(var2)) print(var2_reuse.name, sess.run(var2_reuse)) # 输出结果: # variable_scope_y/var1:0 [-1.59682846] # variable_scope_y/var1:0 [-1.59682846] 能够看到变量var1_reuse重复使用了var1 # variable_scope_y/var2:0 [ 2.] # variable_scope_y/var2_1:0 [ 2.]
参考资料:
下面咱们来看一个TensorBoard简单的入门例子,感觉一下:
def learn_tensor_board_2(): # prepare the original data with tf.name_scope('data'): x_data = np.random.rand(100).astype(np.float32) y_data = 0.3 * x_data + 0.1 ##creat parameters with tf.name_scope('parameters'): with tf.name_scope('weights'): weight = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) tf.summary.histogram('weight', weight) with tf.name_scope('biases'): bias = tf.Variable(tf.zeros([1])) tf.summary.histogram('bias', bias) ##get y_prediction with tf.name_scope('y_prediction'): y_prediction = weight * x_data + bias ##compute the loss with tf.name_scope('loss'): loss = tf.reduce_mean(tf.square(y_data - y_prediction)) tf.summary.scalar('loss', loss) ##creat optimizer optimizer = tf.train.GradientDescentOptimizer(0.5) # creat train ,minimize the loss with tf.name_scope('train'): train = optimizer.minimize(loss) # creat init with tf.name_scope('init'): init = tf.global_variables_initializer() ##creat a Session sess = tf.Session() # merged merged = tf.summary.merge_all() ##initialize writer = tf.summary.FileWriter("/Users/zhongfucheng/tensorboard/loss-2", sess.graph) sess.run(init) ## Loop for step in range(201): sess.run(train) rs = sess.run(merged) writer.add_summary(rs, step) if __name__ == '__main__': learn_tensor_board_2() # 启动完了以后,要在命令行上运行tensor_board的命令,指定其目录,最后咱们就能够经过6006的默认端口访问咱们的图。
(例子来源网络,我改动了一下,出处我忘了,侵删~)
接下来,咱们启动一下TensorBoard,看看图是怎么样的,启动命令以下:
tensorboard --logdir=/Users/zhongfucheng/tensorboard/loss-2
启动成功的图:
经过6006端口咱们去访问一下,首先咱们能够检测到loss值的变动:
咱们也能够查看TensorFlow程序大概的执行步骤:
参数w和b的直方图:
总之,TensorBoard能够方便地查看咱们参数的变化,以便更好理解咱们写的代码。
参考资料:
乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!
以为个人文章写得不错,不妨点一下赞!