报错完整版:
Variable conv1/weights does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=tf.AUTO_REUSE in VarScope?
想看解决方法直接看最后,想学习好玩的小知识就全看完!!!
截图如下:
报错代码为:
conv1 = slim.layers.conv2d(self.inputs, 16, 3, padding="SAME", scope='conv1')
函数完整代码为:
def build_origin_net(self, keep_prob):
with slim.arg_scope([slim.conv2d, slim.fully_connected],
activation_fn=tf.nn.relu,
weights_regularizer=slim.l1_regularizer(0.001)):
# tf.get_variable_scope().reuse_variables()
conv1 = slim.layers.conv2d(self.inputs, 16, 3, padding="SAME", scope='conv1')
# 2 x 2 / 1
pool1 = slim.layers.max_pool2d(conv1, kernel_size=[2, 2], stride=[2, 2], scope='pool1')
# 128 / 3 x 3 / 1 / 1
conv2 = slim.layers.conv2d(pool1, 32, 3, padding="SAME", scope='conv2')
# 2 x 2 / 1
pool2 = slim.layers.max_pool2d(conv2, kernel_size=[2, 2], stride=[2, 2], scope='pool2')
# 256 / 3 x 3 / 1 / 1
conv3 = slim.layers.conv2d(pool2, 32, 3, padding="SAME", scope='conv3')
# 1 x 2 / 1
pool3 = slim.layers.max_pool2d(conv3, kernel_size=[2, 2], stride=[2, 2], padding="SAME", scope='pool3')
flatten = slim.flatten(pool3)
fc1 = slim.layers.fully_connected(flatten, 128, scope='fc1')
fc2 = slim.layers.fully_connected(fc1, 256, scope='fc2')
dp2 = slim.layers.dropout(fc2, keep_prob=keep_prob)
logits = slim.layers.fully_connected(dp2, 10, scope='logits')
pred = slim.layers.softmax(logits=logits, scope='pred')
out = {'conv1': conv1, 'pool1': pool1, 'conv2': conv2, 'pool2': pool2, 'conv3': conv3, 'pool3': pool3,
'flatten': flatten, 'fc1': fc1, 'fc2': fc2,
'logits': logits, 'pred': pred}
return out
报错解释:
变量conv1/weights不存在或者没有使用 tf.get_variable()创建,你的意思是在VarScope中设置reuse=tf.AUTO_REUSE吗?
函数解析: tf.get_variable()
参考:https://blog.csdn.net/weixin_44791964/article/details/96134474
初始化一个变量并对其进行命名、大小指定、类型指定等
因此可以简单判断报错原因是变量没有声明,但python中不是不需要进行变量声明的吗,还是说这个函数在使用时必须得提前声明?不知道答案,只能去百度了,百度结果如下:
https://blog.csdn.net/ch_xiaochou/article/details/103696125
其文章大意是将将reuse设置为True或者False,但我感觉这不是根本原因
我所跑的代码是从github上下载的,一般而言作者运行过的代码只可能出现文件路径问题与版本不兼容问题
从代码本身下手,首先查看函数slim.arg_scope如何使用
参考:https://cloud.tencent.com/developer/article/1450675
这篇文章对函数内部的参数没有很明确的解释与测试,意义不大,再次查询参考文章
参考:https://blog.csdn.net/qq_34914551/article/details/86073166
通过这篇文章的描述,函数slim.arg_scope的作用为对某些常用函数的共同的参数进行统一赋值,免去在接下来的函数中调用函数时重复对参数进行实参赋值。
with函数本身可以理解为一个自带close的函数封装体
分析结果:函数slim.arg_scope对报错应该没有影响。
继续查询如下函数的使用方法
conv1 = slim.layers.conv2d
参考:https://blog.csdn.net/webmater2320/article/details/88637237
通过文章我大致猜测,报错问题出现在最后一个变量scope中,scope的官方解释为:共享变量所指的variable_scope(变量范围)
相关知识点:变量共享机制
参考:https://www.zhihu.com/question/54513728
链接相关文章简单阐述了两种变量命名的方式之间的区别以及两种scope之间的区别
好吧我承认,没找到问题
在导入tensorflow后添加语句‘tf.reset_default_graph()’,似乎解决了该问题
代码如下:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
tf.reset_default_graph()