tensorflow的Graph和Session

关于tensorflow的Graph和Session,官网介绍在这里,https://www.tensorflow.org/programmers_guide/graphs

Graph和Session是tensorflow中的最基本的概念,但由于最初没有把他们俩的特征搞得特别清楚,因此踩了很多坑。这两个概念必须搞得特别清楚,尤其是在多线程编程的时候。

graph即是利用tensorflow构建的网络图。在没有指定graph时,当前线程的所有网络结构都会存在一个默认graph当中。

当然如果不想采用这个默认graph,或者程序中有多个graph时,我们可以指定graph。例如如下代码。

在多线程编程中,线程A中的默认graph,在线程B中是不存在的。因此如果想在线程A结束后,在线程B中操作线程A的graph,需要将其传递出来。

Session是用来操作graph的。需要注意的是,graph只是保存了图的结构,变量名和变量大小等信息,而变量的值是在Session中保存的。因此当我们把图构建出来,有一步必要的操作就是变量初始化。这些初始化的值,也就是变量的值是在session中保存。而和graph一样,当线程结束后,在线程中创建的session会被释放掉。因此在多线程操作中,要将session传递出来,再进行操作。

由于之前没有搞清楚他们之间的关系,踩了几个坑,记录一下。

第一个,我在线程A中创建了一个网络,在线程B中对其操作。程序跑到一下语句报错。

这是必然的,因为线程B中并不存在一个默认的graph。我们要操作A中的graph,必须将其传到B线程当中去。因此做如下修改。

其中self.cnnmodel.graph是我传递出来的线程A中的graph。

 

第二个坑,我在A中创建了一个session,对变量进行了初始化。在B中开启训练,然而报错提示我没有初始化变量。那是因为线程B中的session和线程A中的session是不一样的。变量的值是全部存在session当中。因此要么在B中新创建一个Session重新做初始化,要么将A中的Session传递出来,在B线程当中使用。我采用的方法是后者。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注