CS20SI

2022-03-09

本文整理自知之深炼丹专栏,转载请征得原作者同意。

本文所有代码都在原作者的仓库中

是一门基于大学的深度学习研究课程。

可视化

安装时自动安装,使用=tf..(‘./graph’,sess.graph)创建文件写入器,./graph为文件路径,sess.graph表示读入的图结构

简单示例:

import tensorflow as tf
a = 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

打开终端运行程序,输入–=”./”,在网页输入:6006/,输入

常量类型

创建一个常量:

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 创建

p>

创建特殊值常量:

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 的原因是,虽然定义了操作,但实际上是执行的,所以我们需要执行:

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)

独立

是相互独立的。

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))) # >> 20
print(sess2.run(W.assign_sub(2))) # >> 8
print(sess1.run(W.assign_add(100))) # >> 120
print(sess2.run(W.assign_sub(50))) # >> -42
sess1.close()
sess2.close()

占位符()

有两个步骤,第一步是定义图形,第二步是计算。对于图中值暂时未知的量,可以定义为占位符,然后使用赋值

定义占位符

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

最好指定形状,便于调试

例行公事:

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

您也可以为操作提供操作

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

懒惰

azy 意味着您延迟创建变量,直到您必须使用它。我们来看看普通和懒惰的区别。

# normal loading
x = 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 loading
x = 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))

会在图中创建x和y变量,同时创建x+y操作,lazy只会创建这两个变量:

分类:

技术要点:

相关文章:

© 版权声明
THE END
喜欢就支持一下吧
点赞7赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容