关于Graph(图)和会话(Session)的基础知识如下图所示:
https://zhuanlan.zhihu.com/p/87299728
需要明确的一点是:
但凡import tensorflow后,都会自动创建一副默认图,
如果需要新创建一张图,则需要:
import tensorflow as tf
print(tf.get_default_graph())
$ result:
<tensorflow.python.framework.ops.Graph object at 0x7fe0ae6b2208>
有新的操作,都是默认添加到图中:
import tensorflow as tf
c = tf.constant(value=1)
print(c.graph)
print(tf.get_default_graph())
$ result:
<tensorflow.python.framework.ops.Graph object at 0x7f39496a90f0>
<tensorflow.python.framework.ops.Graph object at 0x7f39496a90f0>
当然也可以新定义一个图,在新的图当中做操作
import tensorflow as tf
print(tf.get_default_graph())
g = tf.Graph()
print(g)
with g.as_default():
d = tf.constant(value=2)
print(d.graph)
f = tf.constant(value=2)
print(f.graph)
$ result:
<tensorflow.python.framework.ops.Graph object at 0x7f0debc51dd8>
<tensorflow.python.framework.ops.Graph object at 0x7f0debbad160>
<tensorflow.python.framework.ops.Graph object at 0x7f0debbad160>
但凡在with之外做的操作,都属于默认图
需要注意的是:
TensorFlow将所有操作都储存在图上,图决定了函数的输出流向,图将所有操作连接起来,让整体操作是连通的可以获得最终的结果。如果尝试将一张图上Tensor或者操作放入到另一张图上的Tensor或者操作就会失败,所有的东西都必须在同一张图上。
解决办法查看有没有不同Graph的函数放在一个session当中,如果是的话,创建的时候就要注意,要在同一个Graph创建变量和操作!!
还需要注意的是,在图中的操作不要用到numpy和Tensor混着来,比如这样就会报错
InvalidArgumentError: You must feed a value for placeholder tensor ‘Placeholder_367’ with dtype float and shape [2]
[[{{node Placeholder_367}}]]
这样boxes是Tensor list的结构,但是仍然不OK
中间还遇到了Tensor.numpy(), Tensor has no attribute numpy等等问题(这个bug是Tensorflow自带的bug解决不了)
没有办法将Tensor转成numpy,注意跟占位符相加或者想乘或者占位符本身都没有办法转换成numpy,具体原因不清楚。。。
总之,TF keras不如pytorch好用。。。。
而且不能看到变量的值,调试起来很麻烦。。。。。。。各种方式都用了,都不可以
以下原因强烈不推荐tensorflow和Keras:
1.Graph建立流程,Session运行的方式,调试起来看不到变量太麻烦了。。。。
2.v1和v2差别很大很多地方不兼容
3.动不动就把功能弃用,规则多
4.非常非常非常不灵活!!!!