TensorFlow报错:'Session'对象无'_session'属性,求解决方案
解决TensorFlow中
AttributeError: 'Session' object has no attribute '_session'问题 嘿,这个问题我之前踩过相似的坑,确实是你使用tf.Graph()的方式出了问题!咱们一步步拆解来理清楚:
错误根源
你现在的代码里,所有变量(W1、Bias2这类)、占位符(X、Y)和计算节点都是在默认全局图里创建的,但你却用一个全新的loaded_graph来初始化Session——这就导致Session关联的图和变量所在的图完全不匹配,自然会抛出奇怪的属性错误。而且tf.train.Saver也是在默认图的上下文里创建的,它根本找不到你新图里的变量。
修正方案
你需要把整个网络的构建逻辑都包裹在新创建的图的默认上下文里,确保所有图元素都属于这个独立的图。修正后的代码大概是这样:
for i in range(num_networks): print("Neural network: {0}".format(i)) # 创建新图,并把后续所有操作都放到这个图的上下文里 loaded_graph = tf.Graph() with loaded_graph.as_default(): # 所有占位符、变量、计算节点都在这里定义 X = tf.placeholder(tf.float32) Y = tf.placeholder(tf.float32) W1 = tf.Variable(tf.random_uniform([n_input, n_hidden], -1.0, 1.0), name = 'W1') W2 = tf.Variable(tf.random_uniform([n_hidden, n_output], -1.0, 1.0), name = 'W2') b1 = tf.Variable(tf.zeros([n_hidden]), name="Bias1") b2 = tf.Variable(tf.zeros([n_output]), name="Bias2") L2 = tf.sigmoid(tf.matmul(X, W1) + b1) hy = tf.sigmoid(tf.matmul(L2, W2) + b2, name="op_to_restore") cost = tf.reduce_mean(-Y*tf.log(hy) - (1-Y)*tf.log(1-hy)) optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) init = tf.global_variables_initializer() # Saver也要在这个图的上下文里创建,这样它才能关联当前图的变量 saver = tf.train.Saver() # 现在用这个正确关联了所有元素的图来启动Session with tf.Session(graph=loaded_graph) as sess: sess.run(init) # 后续的训练、保存操作都在这里执行 ...
关键注意点
- 每次循环创建新网络时,都要把
tf.Graph()的定义放在循环里,然后用with loaded_graph.as_default()把所有网络构建代码包起来。 tf.train.Saver必须在对应的图上下文里初始化,否则它会绑定到默认图,找不到你新图里的变量。- 启动Session时,明确指定
graph=loaded_graph(或者像你之前那样把图传入Session构造器,两种方式都可以),确保Session和图的关联正确。
这样既解决了最初的变量名重复问题,也不会再出现Session的属性错误啦!
内容的提问来源于stack exchange,提问作者gonzalloe
相关产品推荐
相关产品推荐

