ValueError: Variable xx weights already exists, disallowed. Did you mean to set reuse=True or reuse.

tf程序抛出以下错误:

ValueError: Variable InceptionV3/Conv2d_1a_3x3/weights already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope?

先上结论:

当我们的graph中已经存在变量A,然后尝试通过get_Variable()来再次定义变量A时候就会出现这个错误.

问题分析:

我们通过例子来说明一下.

def count(x1,x2):
  with tf.variable_scope("add"):
    add_r=tf.get_variable("ADD",(),dtype=tf.float32,initializer=tf.constant_initializer(0.2))
    mul_r=tf.get_variable("MUL",(),dtype=tf.float32,initializer=tf.constant_initializer(1.2))
  add_r=x1+x2
  mul_r=x1*x2
  return add_r,mul_r 
  
def main():
  x1=tf.constant(1.1,dtype=tf.float32)
  x2=tf.constant(1.2,dtype=tf.float32)
  a,b=count(x1,x2)
  init=tf.global_variables_initializer()

  with tf.Session() as sess:
    sess.run(init)
    a,b=sess.run([a,b])
    print(a,b)

if __name__=='__main__':
  main()

以上程序在变量空间"add"中定义了两个变量, 名字分别为"ADD"和"MUL".对象add和mul_r分别是以上两个变量的和计算和乘积计算.
运行以上程序得到结果如下:

2.3000002 1.32

程序没问题!

然后,修改上面程序

def main():
  x1=tf.constant(1.1,dtype=tf.float32)
  x2=tf.constant(1.2,dtype=tf.float32)
  a,b=count(x1,x2)
  a1,b1=count(x1,x2)) #新添加的代码
  init=tf.global_variables_initializer()\
  with tf.Session() as sess:
    sess.run(init)
    a,b=sess.run([a,b])
    c,d=sess([a1,b1]]))
    print(a,b)

运行 修改的代码,结果如下:

ValueError: Variable add/ADD already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope?

sess.run() 并不会把整个图都执行,只会执行图中相关的部分操作。

在修改了的代码里面,两个count()的操作组成了graph, session 执行在graph中第一个count()时候,没问题。但是!执行graph中第二个count(),便会抛出错误。因为执行的这部分graph中的变量已经被前部分的graph占用了!

来,再看,修改main()程序:

def main():
  x1=tf.constant(1.1,dtype=tf.float32)
  x2=tf.constant(1.2,dtype=tf.float32)
  a,b=count(x1,x2)
  init=tf.global_variables_initializer()\
  with tf.Session() as sess:
    sess.run(init)
    for i in range(10)): #添加了for 循环
        a,b=sess.run([a,b])
    print(a,b)

这个程序能正常运行,为什么?能上面的有什么不一样呢? 不一样的地方在于这程序从头到尾都是执行同一个graph。没有问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值