Python实现ANN时的变量可见性/作用域问题:训练进度保存疑问
关于神经网络训练进度保存的疑问解答
嘿,这个问题问得特别精准!我仔细看了你提到的那段神经网络代码,核心原因其实藏在Python对可变对象的引用传递机制里,咱们一步步理清楚:
先搞懂
network的本质:在这段代码里,network是一个列表,里面的每一层神经元都是包含weights(权重)和biases(偏置)的结构,而weights、biases本身又都是列表——这些全都是Python里的可变对象。当你把network传入backpropagate函数时,函数拿到的不是整个network的副本,而是这个对象在内存中的引用。函数内部的修改直接作用于原对象:虽然
backpropagate没有返回network,也没把它声明为全局变量,但函数里的操作都是直接修改network内部的可变元素。比如代码里会计算权重的更新值,然后直接执行类似network[i]['weights'][j] -= ...的操作——这种修改是直接在原对象的内存空间里进行的,外部的network变量自然能同步看到这些变化。举个极简的例子帮你理解:
def update_list(my_lst): # 修改列表的第一个元素 my_lst[0] = 999 original_lst = [1, 2, 3] update_list(original_lst) print(original_lst) # 输出 [999, 2, 3]你看,函数没返回列表,也没全局声明,但外部的列表还是被修改了——和你遇到的神经网络训练的情况完全一致,都是因为可变对象的引用传递特性。
总结一下:训练循环里每次调用
backpropagate(network, x, y),都是直接在原network的基础上更新权重和偏置,不需要返回,因为修改的是同一个对象的内部状态,所以训练进度自然就保存下来了。
内容的提问来源于stack exchange,提问作者lordy
相关产品推荐
相关产品推荐

