- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
自学神经网络的基础知识后,我决定尝试学习 XOR 函数的超小型网络。它由两个输入神经元、两个隐藏神经元和一个输出神经元组成。问题是它不学习.. 所以我一定是在我的 backward() 中做错了什么?代码非常精简,应该可以使用任何支持 c++11 的编译器进行编译。
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <cmath>
#include <algorithm>
#include <numeric>
using namespace std;
float tanh_activate(float x) { return (exp(2*x)-1)/(exp(2*x)+1); }
float tanh_gradient(float x) { return 1-x*x; }
vector<float> input = { 0.0f, 0.0f };
vector<float> hiddenW = { 0.5f, 0.5f };
vector<float> hidden = { 0.0f, 0.0f };
vector<float> output = { 0.0f };
void forward()
{
float inputSum = accumulate( input.begin(), input.end(), 0.0f );
hidden[0] = tanh_activate( inputSum ) * hiddenW[0];
hidden[1] = tanh_activate( inputSum ) * hiddenW[1];
output[0] = tanh_activate( accumulate( hidden.begin(), hidden.end(), 0.0f ) );
}
void backward( float answer )
{
auto outputError = answer - output[0];
auto error = outputError * tanh_gradient( output[0] );
auto layerError = accumulate( hiddenW.begin(),
hiddenW.end(),
0.0f,
[error]( float sum, float w ) {
return sum + (w * error);
} );
// Calculating error for each activation in hidden layer but this is unused
// currently since their is only one hidden layer.
vector<float> layerE( hidden.size() );
transform( hidden.begin(),
hidden.end(),
layerE.begin(),
[layerError]( float a ) {
return tanh_gradient( a ) * layerError;
} );
// update weights
for( auto wi = hiddenW.begin(), ai = hidden.begin(); wi != hiddenW.end(); ++wi, ++ai )
*wi += *ai * error;
}
int main( int argc, char* argv[] )
{
for( int i = 0; i < 10000000; ++i )
{
// pick two bits at random...
int i1 = ((random() % 2)==0)?1.0f:0.0f;
int i2 = ((random() % 2)==0)?1.0f:0.0f;
// load our input layer...
input[0] = (float)i1;
input[1] = (float)i2;
// compute network output...
forward();
// we're teaching our network XOR
float expected = ((i1^i2)==0) ? 0.0f : 1.0f;
if( i % 10000 == 0 )
{
printf("output = %f\n",output[0]);
printf("expected = %f\n",expected);
}
// backprop...
backward( expected );
}
return 0;
}
最佳答案
我在您的神经元模型中缺少偏差(阈值、基本信号)。
https://en.wikipedia.org/wiki/Artificial_neuron#Basic_structure
您也可能不想在反向传播中进行如此剧烈的修正。
https://en.wikipedia.org/wiki/Backpropagation#Phase_2:_Weight_update
Subtract a ratio (percentage) of the gradient from the weight.
比率可能低于 100%。
关于c++ - 超小异或神经网络无法学习...我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37973950/
在C#中,我可以通过base关键字访问基类,在java中,我可以通过super关键字访问它。在delphi中如何做到这一点?假设我有以下代码: type TForm3 = class(TF
在这件事上我已经把头撞到墙上好几次了。所以我希望在正确的方向上得到一点帮助。 我有一张 table ,上面有订单,一张 table 上有火车,一张 table 上有航类,一张 table 上有巴士。每
在 Python 中,假设我有以下代码: class SuperClass(object): def __init__(self, x): self.x = x
我希望这个 subview 扩展到它的父 View 之外,但是父 View 的边框正在切入 subview 。有没有办法防止这种情况? class TheView : UIView { let
我有一个标准的高斯函数,看起来像这样: def gauss_fnc(x, amp, cen, sigma): return amp * np.exp(-(x - cen) ** 2 / (2
例如,我有下一个类,带有有界类型参数: public class ItemContainer { void addItems(List items); } 在另一个带有参数的类中使用: pub
如何将此设置转换为命令? 结果如下: // Manual Compression (see the image above) Compressed Size: 12,647,451 bytes //
请建议在应用继承时如何使用@Wither/@With。 我有一个抽象类Parent和具体的Child。 Child 应该是不可变的。将 @Wither 放在两者上会给我两个错误: 构造函数 Child
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在尝试向服务器(虚拟托管)发出 HTTP2 请求,该服务器根据主机 header 值 (SNI) 提供 SSL 证书。 # conn = hyper.HTTP20Connection('h
我有一个应用程序,必须将大约 1300 万行、大约 10 个平均长度的字符串插入到嵌入式 HSQLDB 中。我一直在调整一些东西(批量大小、单线程/多线程、缓存/非缓存表、MVCC 事务、log_si
我想定义一个函数f(x, t::Type)根据 isa(x, t) 是否执行不同的行为.假设我想调用b1(x)如果是,b2(x)除此以外。 我知道我可以像这样在运行时进行动态检查: function
我正在使用 Hyper-V WMI Provider在 Hyper-V 中导入虚拟机,特别是使用 ImportVirtualSystemEx Msvm_VirtualSystemManagementS
这几个星期以来一直困扰着我,我没有结束对它的研究,因为我目前重载并且它让我落后于第一年的 CS (opengl) 大学类(class),这首先让我研究了这个:如何只用一个 for 循环绘制立方体的所有
我正在我的计算机(操作系统:Windows 8)上开发一个 WP8 应用程序。我需要安装一个 VM 才能拥有 linux。同时我需要使用我的 Windows Phone 模拟器。 我下载了 VMWar
我是一名优秀的程序员,十分优秀!