使用cupy时变量值无故改变

Posted

技术标签:

【中文标题】使用cupy时变量值无故改变【英文标题】:Variable value change for no reason when using cupy 【发布时间】:2020-06-24 15:15:58 【问题描述】:

我正在使用 cupy 实现机器学习的梯度公式。但是,我遇到了一个奇怪的错误,其中变量 temp_value 无缘无故地发生了变化。 这是我的代码:

import cupy as cp
def gradient_1d(f, x):
    grad = cp.zeros_like(x)
    h = 0.00001
    for index in range(x.size):
        temp_value = x[index]
        print(temp_value,'1')
        x[index] = float(temp_value) + h
        print(temp_value,'2')
        plus_result = f(x)
        print(temp_value,'3')
        x[index] = temp_value - h
        print(temp_value,'4')
        minus_result = f(x)
        print(temp_value,'5')
        grad[index] = ((plus_result - minus_result)/2*h)
        print(temp_value,'6')
        x[index] = temp_value
    return grad


def f2(x):
    if x.ndim == 1:
        return cp.sum(x**2)
    else:
        return cp.sum(x**2, axis=1)


def main():
    x = cp.array([1, 2])
    grad = gradient_2d(f2, x)
    print(grad)


main() 

输出是:

1 1
1 2
1 3
0 4
0 5
0 6
2 1
2 2
2 3
1 4
1 5
1 6
[0 0]

您可以观察到 temp_value 的值在每次到达第 4 个检查点时都会减少 1,但我没有做任何更新此变量的操作。

为什么??? 提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

这可能是因为temp 被分配给x[index]x[index] 被更改。使用 temp_value = x[index].copy() 而不是 temp_value = x[index] 作为 for 循环中的第一条语句。为此,您还需要在文件顶部添加import copy

【讨论】:

或者做你已经在不同的行中所做的事情:float(x[index]) 也会创建一个副本。 非常感谢!

以上是关于使用cupy时变量值无故改变的主要内容,如果未能解决你的问题,请参考以下文章

PHP Carbon 类改变了我原来的变量值

继承的方法不会改变变量值

jsp页面判定某个变量值的时候改变颜色

Python和PySide:从另一个文件调用函数时变量值重置

关于有时候变量值类型莫名改变的情况

怎么在debug时显示全部的变量值