gpt4 book ai didi

c# - 让神经网络输出介于 -1.0 和 1.0 之间的任何值

转载 作者:太空狗 更新时间:2023-10-29 18:34:33 26 4
gpt4 key购买 nike

我正在尝试制作反向传播神经网络。基于我在这里找到的教程:MSDN article詹姆斯麦卡弗里。他举了很多例子,但他所有的网络都是基于同一个问题来解决的。所以他的网络看起来像 4:7:3 >> 4input - 7hidden - 3output。

他的输出始终是二进制 0 或 1,其中一个输出为 1,将爱尔兰花分类为三类之一。

我想用神经网络解决另一个问题,这需要我使用 2 个神经网络,其中一个需要输出介于 0..255 之间,另一个需要介于 0 到 2 倍 Pi 之间。 (整圈,圆圈)。好吧,基本上我认为我需要一个范围从 0.0 到 1.0 或从 -1 到 1 以及介于两者之间的任何输出,以便我可以将它乘以成为 0..255 或 0..2Pi

我认为他的网络确实表现良好,因为他的 computeOutputs我在下面显示:

  private double[] ComputeOutputs(double[] xValues)
{

if (xValues.Length != numInput)
throw new Exception("Bad xValues array length");

double[] hSums = new double[numHidden]; // hidden nodes sums scratch array
double[] oSums = new double[numOutput]; // output nodes sums

for (int i = 0; i < xValues.Length; ++i) // copy x-values to inputs
this.inputs[i] = xValues[i];

for (int j = 0; j < numHidden; ++j) // compute i-h sum of weights * inputs
for (int i = 0; i < numInput; ++i)
hSums[j] += this.inputs[i] * this.ihWeights[i][j]; // note +=

for (int i = 0; i < numHidden; ++i) // add biases to input-to-hidden sums
hSums[i] += this.hBiases[i];

for (int i = 0; i < numHidden; ++i) // apply activation
this.hOutputs[i] = HyperTanFunction(hSums[i]); // hard-coded

for (int j = 0; j < numOutput; ++j) // compute h-o sum of weights * hOutputs
for (int i = 0; i < numHidden; ++i)
oSums[j] += hOutputs[i] * hoWeights[i][j];

for (int i = 0; i < numOutput; ++i) // add biases to input-to-hidden sums
oSums[i] += oBiases[i];

double[] softOut = Softmax(oSums); // softmax activation does all outputs at once for efficiency
Array.Copy(softOut, outputs, softOut.Length);

double[] retResult = new double[numOutput]; // could define a GetOutputs method instead
Array.Copy(this.outputs, retResult, retResult.Length);
return retResult;

网络使用以下hyperTan函数

      private static double HyperTanFunction(double x)
{
if (x < -20.0) return -1.0; // approximation is correct to 30 decimals
else if (x > 20.0) return 1.0;
else return Math.Tanh(x);
}

在上面的函数中,输出层使用了 Softmax(),我认为这对这里的问题至关重要。因为我认为它使他的输出全是二进制的,它看起来像这样:

     private static double[] Softmax(double[] oSums)
{
// determine max output sum
// does all output nodes at once so scale doesn't have to be re-computed each time
double max = oSums[0];
for (int i = 0; i < oSums.Length; ++i)
if (oSums[i] > max) max = oSums[i];

// determine scaling factor -- sum of exp(each val - max)
double scale = 0.0;
for (int i = 0; i < oSums.Length; ++i)
scale += Math.Exp(oSums[i] - max);

double[] result = new double[oSums.Length];
for (int i = 0; i < oSums.Length; ++i)
result[i] = Math.Exp(oSums[i] - max) / scale;

return result; // now scaled so that xi sum to 1.0
}

如何重写softmax?所以网络将能够给出非二进制答案?

注意网络的完整代码是 here .如果您想尝试一下。

为了测试网络,还使用了以下精度函数,可能会出现二元行为

public double Accuracy(double[][] testData)
{
// percentage correct using winner-takes all
int numCorrect = 0;
int numWrong = 0;
double[] xValues = new double[numInput]; // inputs
double[] tValues = new double[numOutput]; // targets
double[] yValues; // computed Y

for (int i = 0; i < testData.Length; ++i)
{
Array.Copy(testData[i], xValues, numInput); // parse test data into x-values and t-values
Array.Copy(testData[i], numInput, tValues, 0, numOutput);
yValues = this.ComputeOutputs(xValues);
int maxIndex = MaxIndex(yValues); // which cell in yValues has largest value?
int tMaxIndex = MaxIndex(tValues);
if (maxIndex == tMaxIndex)
++numCorrect;
else
++numWrong;
}
return (numCorrect * 1.0) / (double)testData.Length;
}

最佳答案

以防万一有人遇到同样的情况。如果您需要一些神经网络回归的示例代码(a NNR) 他们就是这么叫的。

这里是样本链接 code在 C# 中,这里是 a good article关于它。请注意,这个人在那里写了更多文章,您不会找到所有文章,但那里有很多。尽管我关注这个人有一段时间了,但我错过了这篇特定的文章,因为当我在此处提出有关堆栈溢出的问题时,我不知道它们是如何调用的。

关于c# - 让神经网络输出介于 -1.0 和 1.0 之间的任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44323254/

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