我在Matlab中创建了一个神经网络,现在我正计划在C ++中使用权重并实现网络。网络工作但现在我正在尝试用C ++实现它我觉得我实际上并不理解它。
举一个非常简单的例子:一个输入 - >隐藏层中的三个节点(tansig) - >一个输出节点(purelin)。
第一层的输入权重是:9.3842, 7.1205, -14.6497
偏见:-7.8820, -3.4257, -14.2522,
输出节点的权重为:0.5760,-0.9019,-0.4809,
偏见:-0.1413
我一直在尝试输入:0和0.498,目标5.0145和5.3314
问题是我无法通过手动执行计算来获得(或接近)这些目标。为了让你知道我在做什么,取0作为输入;
0 * w1 + b = -7.8820,
0 * w2 + b2 = -3.4257,
0 * w3 + b3 = -14.2522,
应用激活功能tansig:
output1 = tansig(-7.8820)= -1
output2 = tansig(-3.4257)= -.997
output3 = tansig(-14.2522)= -1
对于最终节点,
output1 * weight1 = -.5760
output2 * weight2 = .900
output3 * weight3 = .4809
sum + b = .9462
我认为这是有效的,但显然不是。我想也许我不明白tansig激活功能发生了什么。
感谢阅读和任何帮助,
答案 0 :(得分:0)
您的tansig()
激活函数的范围是-1到1,因此它可能是tanh()
。它看起来像sigmoid()*2-1
或arctan()*2/PI
,但曲线的变化略有不同。您可能想看看tanh()的样子:http://www.wolframalpha.com/input/?i=y%3Dtanh%28x%29
你的伪代码看起来不错,但我并没有试着把数字放回去。也许你唯一忘记写的是:
sum = output1*weight1 + output2*weight2 + output3*weight3
final_output = sum + b
不要忘记在这样的神经网络中随机初始化权重,并且需要使用反向传播算法(通过大循环中每个权重的许多梯度下降)或其他类似的学习技术来学习权重。
答案 1 :(得分:0)
所以,愚蠢的我,问题是我忘记了缩放。 NN(在Matlab中)自动缩放[0,1]之间的输入。