博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CS20SI-tensorflow for research笔记: Lecture2
阅读量:5321 次
发布时间:2019-06-14

本文共 4194 字,大约阅读时间需要 13 分钟。

本文整理自知乎专栏,转载请征求原作者同意。

本文的全部代码都在原作者GitHub仓库
CS20SI是Stanford大学开设的基于Tensorflow的深度学习研究课程。

TensorBoard可视化

安装TensorFlow的时候TensorBoard自动安装,使用writer=tf.summary.FileWriter('./graph',sess.graph)创建一个文件写入器,./graph是文件路径,sess.graph表示读入的图结构

简单的例子:

import tensorflow as tfa = tf.constant(2)b = tf.constant(3)x = tf.add(a,b)with tf.Session() as sess:    writer = tf.summary.FileWriter('./graphs',sess.graph)    print(sess.run(x))writer.close()  # close the writer when you're done using it

打开终端运行程序,输入tensorboard --logdir="./graphs",在网页输入http://localhost:6006/,进入tensorboard

l21.jpg

常数类型

创建一个常数:

tf.constant(value, dtype=None, shape=None, name='const', verify_shape=False)

比如建立一维向量和矩阵,然后相乘:

a = tf.constant([2,2], name='a')b = tf.constant([[0,1],[2,3]], name='b')x = tf.multiply(a, b, name='dot_production')with tf.Session() as sess:    print(sess.run(x))>> [[0,2]    [4,6]]

类似numpy的创建

特殊值常量创建:

tf.zeros(shape, dtype=tf.float32, name=None)tf.zeros_like(input_tensor, dtype=None, name=None, optimize=True)tf.ones(shape, dtype=tf.float32,name=None)tf.ones_like(input_tensor, dtype=None, name=None, optimize=True)tf.fill([2,3],8)>> [[8,8,8],[8,8,8]]

序列创建:

tf.linspace(start, stop, num, name=None)tf.linspace(10.0, 13.0, 4)>> [10.0, 11.0, 12.0, 13.0]tf.range(start, limit=None, delta=1, dtyde=None, name='range')tf.range(3, limit=18, delta=3)>> [3,6,9,12,15]

与numpy不同,tf不能迭代,即

for _ in tf.range(4): #TypeError

产生随机数

tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

tf目前与numpy数据类型通用:

tf.ones([2,2],np.float32)>> [[1.0,1.0],[1.0,1.0]]

变量

常量定义保存在计算图中,常量过多使得计算图加载缓慢。

a = tf.Variable(2, name='scalar')b = tf.Variable([2,3], name='vector')c = tf.Variable([[0,1][2,3]],name='matrix')w = tf.Variable(tf.zeros([784,10]),name='weight')

变量的几个操作

x = tf.Variable()x.initializer  # 初始化x.eval()    # 读取里面的值x.assign()    #分配值给该变量

使用变量前必须初始化,初始化可以看作是一种变量的分配值操作

变量的初始化

一次性全部初始化:

init = tf.global_variables_initializer()with tf.Session() as sess:    sess.run(init)

一部分初始化:

init_ab = tf.variables_initializer([a,b],name='init_ab')with tf.Session() as sess:    sess.run(init_ab)

某个变量的初始化:

w = tf.Variables(tf.zeros([10,10]))with tf.Session() as sess:    sess.run(w.initializer)

注意下面这个例程:

w = tf.Variable(10)w.assign(100)with tf.Session() as sess:    sess.run(w.initializer)    print(w.eval())>> 10

得到的答案是10而不是100的原因是:虽然定义了assign操作,但是tensorflow实在session中执行操作,所以我们需要执行assign操作:

w = tf.Variable(10)assign_op = w.assign(100)with tf.Session() as sess:    sess.run(w.initializer)    sess.run(assign_op)   # 赋值作为运算    print(w.eval())>> 100

用变量定义变量

w = tf.Variable(tf.truncated_normal([700, 10]))u = tf.Variable(w * 2)

Session独立

tensorflow的session相互独立。

W = tf.Variable(10)sess1 = tf.Session()sess2 = tf.Session()sess1.run(W.initializer)sess2.run(W.initializer)print(sess1.run(W.assign_add(10))) # >> 20print(sess2.run(W.assign_sub(2))) # >> 8print(sess1.run(W.assign_add(100))) # >> 120print(sess2.run(W.assign_sub(50))) # >> -42sess1.close()sess2.close()

占位符(Placeholders)

tensorflow有两步,第一步定义图,第二步进行计算。对于图中暂时不知道值的量,可以定义为占位符,之后再用feed_dict赋值

定义占位符

tf.placeholder(dtype, shape=None, name=None)

最好指定shape,容易Debug

例程:

a = tf.placeholder(tf.float32, shape=[3])b = tf.constant([5, 5, 5], tf.float32)c = a + bwith tf.Session() as sess:    print(sess.run(c, feed_dict={a: [1, 2, 3]}))

也可以给tensorflow的运算进行feed操作

a = tf.add(2, 3)b = tf.multiply(a, 3)with tf.Session() as sess:    print(sess.run(b, feed_dict={a: 2}))>> 6

lazy loading

azy loading是指你推迟变量的创建直到你必须要使用他的时候。下面我们看看一般的loading和lazy loading的区别。

# normal loadingx = tf.Variable(10, name='x')y = tf.Variable(20, name='y')z = tf.add(x, y)with tf.Session() as sess:    sess.run(tf.global_variables_initializer())    for _ in range(10):        sess.run(z)# lazy loadingx = tf.Variable(10, name='x')y = tf.Variable(20, name='y')with tf.Session() as sess:    sess.run(tf.global_variables_initializer())    for _ in range(10):        sess.run(tf.add(x, y))

normal loading会在图中创建xy变量,同时创建x+y运算,而lazy loading只会创建这两个变量:

  • normal loading 在session中不管做多少次x+y,只需要执行z定义的加法操作就可以了
  • lazy loading在session中每进行一次x+y,就会在图中创建一个加法操作,计算图就会多一个节点。严重影响图的读入速度。

转载于:https://www.cnblogs.com/HolyShine/p/8653562.html

你可能感兴趣的文章
为什么eclipse中启动tomcat后,浏览器中出现404?
查看>>
js压缩
查看>>
JS实现手机访问pc网址自动跳转到wap网站
查看>>
How to create movie with pictures
查看>>
HTML 5 拖放(Drag 和drop)
查看>>
shell_exec() has been disabled for security reasons错误怎么解决?
查看>>
【福音】开发者可接入微信公众平台设备功能了
查看>>
springCloud学习-消息总线(Spring Cloud Bus)
查看>>
centos7 自动备份 mysql
查看>>
用JS判断两个数字的大小
查看>>
【luogu P2298 Mzc和男家丁的游戏】 题解
查看>>
CVE-2012-0158 分析
查看>>
Git提交代码冲突:commit your changes or stash them before you can merge.
查看>>
OpenCV —— 直方图与匹配
查看>>
简单查看tomcat中部署java服务的内存使用情况
查看>>
畅通工程续(dijskra+SPFA)
查看>>
Tomcat启动过程源码分析五
查看>>
CF916E Jamie and Tree
查看>>
oracle 以SYSDBA远程连接数据库
查看>>
[OpenGL ES 04]3D变换实践篇:平移,旋转,缩放
查看>>