Tensorflow基础之变量&计算图

一、以下程序想展示张量图中的某些操作以及变量
tf.reset_default_graph()
w1=tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1),name="w1")
w2=tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1),name="w2")
x=tf.constant([[0.7, 0.9]])
a=tf.matmul(x, w1)
y=tf.matmul(a, w2)
init_op=tf.initialize_all_variables()
with tf.Session() as sess:
    sess.run(init_op)
    print(sess.run(y))
    writer = tf.summary.FileWriter("logs", tf.get_default_graph())
    writer.close()
    """
    输出所有的变量
    """
    for i in tf.trainable_variables():
        print(i)
    """
    对所属的计算图进行输出,可以发现使用变量、常数、操作、以及默认图进行的输出结果是一样的
    """
    print(tf.get_default_graph())
    print(a.graph)##可以直接使用某一个操作
    print(w1.graph)
    print(x.graph)
    """
    对张量进行输出
    """
    print(tf.get_default_graph().get_tensor_by_name("w1:0")) ##合理
    # print(tf.get_default_graph().get_tensor_by_name("a"))## 不合理,不正确的一行
    

输出:

[[3.957578]]
<tf.Variable 'w1:0' shape=(2, 3) dtype=float32_ref>
<tf.Variable 'w2:0' shape=(3, 1) dtype=float32_ref>
<tensorflow.python.framework.ops.Graph object at 0x00000206DFBE6C88>
<tensorflow.python.framework.ops.Graph object at 0x00000206DFBE6C88>
<tensorflow.python.framework.ops.Graph object at 0x00000206DFBE6C88>
<tensorflow.python.framework.ops.Graph object at 0x00000206DFBE6C88>
Tensor("w1:0", shape=(2, 3), dtype=float32_ref)

使用tensorboard得到的输出图片长这样:
在这里插入图片描述有些是变量,有些是操作。

二、将原本的程序封装成一个个小函数,却出现了问题
tf.reset_default_graph()
def f1(x):
    w1=tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1),name="w1")
    return tf.matmul(x, w1)
def f2(a):
    w2=tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1),name="w2")
    return tf.matmul(a, w2)

a=f1(x)
y=f2(a)

init_op=tf.initialize_all_variables()
with tf.Session() as sess:
    sess.run(init_op)
    print(sess.run(y))
    x=tf.placeholder(tf.float32,shape=[None,2],name="x")
    y=tf.placeholder(tf.float32,shape=[None,1],name="y")
    tmp=tf.constant([[0.7,0.9]])
    sess.run(y,feed_dict={x:tmp})
    writer = tf.summary.FileWriter("logs", tf.get_default_graph())
    writer.close()
    """
    输出所有的变量
    """
    for i in tf.trainable_variables():
        print(i)
    """
    对所属的计算图进行输出,可以发现使用变量、常数、操作、以及默认图进行的输出结果是一样的
    """
    print(tf.get_default_graph())
    print(a.graph)##可以直接使用某一个操作
    print(w1.graph)
    print(x.graph)
    """
    对张量进行输出
    """
    print(tf.get_default_graph().get_tensor_by_name("w1:0")) ##合理
    # print(tf.get_default_graph().get_tensor_by_name("a"))## 不合理,不正确的一行
    

报错之处:

ValueError: Tensor("w1:0", shape=(2, 3), dtype=float32_ref) must be from the same graph as Tensor("Const:0", shape=(1, 2), dtype=float32).
错误提示说两个张量来自不同的图,我们可以发现再sess之前的几行代码之间几乎没有什么关系,x压根儿没有进行初始化,是一个未知的变量。所以我们尝试将运行的函数挪进sess里面。

修改二:

tf.reset_default_graph()

def f1(xx):
    w1=tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1),name="w1")
    return tf.matmul(xx, w1)
def f2(aa):
    w2=tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1),name="w2")
    return tf.matmul(aa, w2)



init=tf.global_variables_initializer()
with tf.Session() as sess:
    x=tf.placeholder(tf.float32,shape=[None,2],name="x")
    y=tf.placeholder(tf.float32,shape=[None,1],name="y")
    a=f1(x)
    y=f2(a)
    sess.run(init)
    tmp=np.array([[0.7,0.9]])
    sess.run(y,feed_dict={x:tmp})
    writer = tf.summary.FileWriter("logs", tf.get_default_graph())
    writer.close()

【报的错误】:

FailedPreconditionError: Attempting to use uninitialized value w1
	 [[node w1/read (defined at <ipython-input-166-3cb2d363e6bf>:5) ]]

此时tensorboard的图片是长这样,也就是说并没有进行初始化。所以我们要思考为什么没有成功初始化。
在这里插入图片描述

修改三、

将完整的计算都挪到session的外面,说明在整个会话开始之前,整个框架已经完整存在,各个变量各就各位,这个时候的初始化才是有意义的。经过多番尝试,我发现在sess之前,计算图需要构建完成,才能对变量进行正确的初始化。详细的知识感觉自己也不是很懂。。。。反正就记住了,在使用Sess启动计算图之前,一定要构建完整的计算图,不能在会话里面再补充计算图。


tf.reset_default_graph()

def f1(xx):
    w1=tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1),name="w1")
    return tf.matmul(xx, w1)
def f2(aa):
    w2=tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1),name="w2")
    return tf.matmul(aa, w2)


x=tf.placeholder(tf.float32,shape=[None,2],name="x")
y=tf.placeholder(tf.float32,shape=[None,1],name="y")
a=f1(x)
y=f2(a)
init=tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    tmp=np.array([[0.7,0.9]])
    print(sess.run(y,feed_dict={x:tmp}))
    writer = tf.summary.FileWriter("logs", tf.get_default_graph())
    writer.close()

这个时候还是不正确,不能正确输出,忽然发现y其实是结果,但是在上面的程序中我们将它当成了需要被赋值的placeholder,真是大错特错。
【错误提示】:

【tensorboard计算图】:
在这里插入图片描述

终于可以成功运行版:
tf.reset_default_graph()

def f1(xx):
    w1=tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1),name="w1")
    return tf.matmul(xx, w1)
def f2(aa):
    w2=tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1),name="w2")
    return tf.matmul(aa, w2)


x=tf.placeholder(tf.float32,shape=[None,2],name="x")
#y=tf.placeholder(tf.float32,shape=[None,1],name="y")
a=f1(x)
y=f2(a)
init=tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    tmp=np.array([[0.7,0.9]])
    print(sess.run(y,feed_dict={x:tmp}))
    writer = tf.summary.FileWriter("logs", tf.get_default_graph())
    writer.close()

输出:

[[3.957578]]

tensorboard图片:
在这里插入图片描述如果添加上标识tf.identity(y,"y") ,图片会变成:
在这里插入图片描述

小白一个,欢迎批评指正。

猜你喜欢

转载自blog.csdn.net/the_little_fairy___/article/details/88765661