gpt4 book ai didi

arrays - Go slice 不更新循环外的值

转载 作者:IT王子 更新时间:2023-10-29 02:11:17 28 4
gpt4 key购买 nike

我正在尝试在 Go 中编写一个 Adaline 神经元,我在处理数组的 scoop 时遇到了问题,我在 for 循环中更新了它的值,看起来它们正在更新,但是当我尝试从循环外部访问新值,它们总是相同的,它们只是在第一次迭代中更新。这是代码:

//This functions creates a [][]float64 and fill it with random numbers
weights := initWeights(inputLength)

// data is a [][]float 64 and expectedY a []float64
for i := 0; i < 10; i++ {
for j := range data {
//Calculate estimate
var estimate float64 = 0
for x := range data[j]{
estimate += data[j][x] * weights[x]
}

// Update weights (range passes values as a copy)
for x := 0; x < len(weights); x++ {

weights[x] = learningRate * (expectedY[j] - estimate) * data[j][x]
}
//PRINT #1
}
//PRINT #2
//
//Some more stuff
//
}

如果我在循环之前打印 weights,它看起来像这样:

[-0.6046602879796196 0.6645600532184904 -0.4246374970712657 0.06563701921747622 0.09696951891448456 -0.5152126285020654 0.21426387258237492 0.31805817433032985 0.28303415118044517]

所以它是正确创建的。在我开始循环调整神经元权重之后。这就是奇怪的事情发生的地方。

如果我在 #1 中打印,我可以看到数组在每次迭代中都在更新,但是当我在 #2 中打印时,数组的值始终相同,它是在第一次迭代中计算的权重循环。

打印#1

[0.06725611377611064 0 0 0.03490734755724929 0.014819026508554914 0.023919277971577904 0.021858582731470875 0.0051309928461725374 0.06915084698345737]
[0.030417970260300468 0.0274737201080031 0 0.02479712906046004 0.01662460439529523 0.014007493148808682 0.029246218179487176 0.004413401238393224 0.05947980105651245]
[0.008861875440076036 0 0.01792998206766924 0.017854161778140868 0.004333887749441702 0.020137868898735412 0.0125224790185058 0.008249247500686795 0.030328115811348512].

打印#2

[0.007796061340871362 0 0.011035383661848988 0.01289960904315235 0.003797667051516503 0.009918694200771232 0.015234505189042204 0.0008236738380263619 0.023072096303259435]
[0.007796061340871362 0 0.011035383661848988 0.01289960904315235 0.003797667051516503 0.009918694200771232 0.015234505189042204 0.0008236738380263619 0.023072096303259435]
[0.007796061340871362 0 0.011035383661848988 0.01289960904315235 0.003797667051516503 0.009918694200771232 0.015234505189042204 0.0008236738380263619 0.023072096303259435]

这两天我一直在为这个问题苦苦挣扎,我不知道发生了什么,我希望你们能帮助我。

-- 更新--
这是一个更完整和可运行的版本 https://play.golang.org/p/qyZGSJSKcs

在游戏中,看起来代码运行良好...我计算机中的完全相同的代码每次迭代都输出完全相同的 slice 。

唯一的区别是,我不是从固定 slice 创建的,而是从两个包含数百行的 csv 文件创建的,所以我猜问题出在这里,我将继续调查。

这里有原始数据,如果有帮助的话:
训练数据:https://pastebin.com/H3YgFF0a
验证数据:https://pastebin.com/aeK6krxD

最佳答案

不要提供删除了位的部分代码,只需提供一个可运行的示例 - 这样做的过程可能会很好地帮助您找到问题。为此,您的 initWeights 函数并不是真正必需的 - 最好使用已知的起始数据。

这是添加了数据的不完整代码。该算法似乎倾向于一组特定的结果(大概,对于不同的数据,它可能会在 10 次运行中更快地到达那里,我已经将运行次数提高到 100 次)。

https://play.golang.org/p/IqfCjNtd8a

您确定这没有按预期工作吗?您是否有具有预期结果的测试数据来测试它?考虑到您发布的代码,我希望打印 2 始终匹配打印最后打印 1,但它显然不完整。

[编辑]目前尚不清楚这是一个 go 代码问题,而不是让您从算法/数据中感到惊讶的结果。

你需要:

  1. 提供代码(你现在已经完成了这个,但不是显示问题的代码)
  2. 将代码/数据减少到显示错误的最小值
  3. 制作一个测试,以最少的数据证明令人惊讶的结果

如果您无法使用静态数据进行重现,请向我们展示如何将数据加载到变量中,因为这可能就是您的问题所在。你确定你正在加载你期望的数据而不是加载一行的大量副本吗?您确定该算法没有按预期工作(如果是这样的话)?您对结果的描述与您目前向我们展示的不符。

关于arrays - Go slice 不更新循环外的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46364555/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com