原来 的环境 是 python 3.7 torch1.13.1 环境 下面跑通的代码
到 python 3.10 和torch 2.3.1报错
原因:
- 在函数内部更改全局变量就会出现此错误。
- 函数内部没有初始化
- 函数内部的循环内部没有初始化 (3.10)
报错UnboundLocalError: local variablereferenced before assignment
如果在函数内部的 一开始的地方初始化变量还是会报错的
解决 gradient_penalty = 0 要在循环的内部,初始化
改成
def train(iterations, batch_size):
num_steps = 0
# 每多少次 生成一个批评家(鉴别器)
critic_iterations = 10
# 每多少次 输出下 损失数值
print_every = 30
with tqdm(total=iterations * batch_size, desc='Training', ncols=70) as pbar:
dlosses = [] # 存储判别器损失
glosses = [] # 存储生成器损失
for iteration in range(iterations):
for _ in range(batch_size):
# 增加步数计数
num_steps += 1
# 初始化 gradient_penalty
# python 3.10
gradient_penalty = 0
# 2. 训练生成器
# 生成新的假数据
# 每 critic_iterations 次迭代更新一次生成器
if num_steps % critic_iterations == 1:
noise = torch.randn(batch_size, input_dim, device=device)
fake_data = generator(noise)
if gradient_penalty != 0 :
# 生成器的损失
g_loss = gradient_penalty.data.item()
glosses.append(g_loss.item())
# 重置判别器优化器的梯度
optimizer_G.zero_grad()
g_loss.backward()
optimizer_G.step()
其他
===================================================
摘录自 https://blog.csdn.net/weixin_48419914/article/details/122008139 ================================================
例一(不会报错):
a= 3
def temp():
print(a)
temp() #输出的结果为3
在上面一段代码中,函数temp的操作是打印a的值,但函数内部并没有对a进行定义,此时系统会在外部寻找a的值,而我们在函数外部给a赋值为3,这种在函数外部赋值的变量被称为全局变量(global variable),这种情况下运行函数temp不会出错,
例二(会报错):
a= 3
def temp():
print(a)
a+=1
temp() #会报错, UnboundLocalError: local variable 'a' referenced before assignment
原因是我们定义的函数temp内部第一次打印a是调用的全局变量,而打印后却令a=a+1,在函数内部试图更改全局变量a导致错误。
例三(改正例二):
如果我们确实希望通过函数temp打印全局变量a,并且将a的值加1,那么就要在函数内部声明全局变量。
a= 3
def temp():
global a #声明我们在函数内部使用的是在函数外部定义的全局变量a
print(a)
a+=1
temp()
调用temp函数,不会再报错了。此时就会发现a的值确实变成4