⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 neuron.cpp

📁 多层神经网络范例 http://www.codeproject.com/cpp/MLP.asp?df=100&forumid=148477&exp=0&select=1141594#xx114159
💻 CPP
字号:
#include "StdAfx.h"
#include ".\neuron.h"
#include "synapse.h"
#include <math.h>

double Neuron::momentum = 0.9;
double Neuron::learningRate = 0.05;

Neuron::~Neuron(void)
{
	inlinks.RemoveAll();
	outlinks.RemoveAll();
}

void Neuron::computeOutput()
{
	sum=0.0;
	POSITION pos = inlinks.GetHeadPosition();
	Synapse* synapse = inlinks.GetAt(pos);
	for (int i = 0; i < inlinks.GetCount(); i++) 
	{
		synapse = inlinks.GetNext(pos);
		sum += synapse->from->getOutput()*synapse->getWeight();
	}
	output = 1.0/(1.0 + exp(-sum)); // sigmoid function
}
void Neuron::computeBackpropDelta(double d) // for an output neuron
{
	delta = (d - output) * output * (1.0 - output);
}
void Neuron::computeBackpropDelta() // for a hidden neuron
{
	double errorSum = 0.0;
	POSITION pos = outlinks.GetHeadPosition();
	Synapse* synapse = outlinks.GetAt(pos);
	for (int i = 0; i < outlinks.GetCount(); i++) 
	{
		synapse = outlinks.GetNext(pos);
		errorSum += synapse->to->delta * synapse->getWeight();
	}
	delta = output * ( 1.0 - output) * errorSum;
}
void Neuron::computeWeight()
{
	POSITION pos = inlinks.GetHeadPosition();
	Synapse* synapse = (Synapse*)inlinks.GetAt(pos);
	for (int i = 0; i < inlinks.GetCount(); i++) 
	{
		synapse = (Synapse*)inlinks.GetNext(pos);
		synapse->data = learningRate*delta*synapse->from->getOutput()
			+ momentum*synapse->data;
		synapse->weight += synapse->data;
	}
}
CString Neuron::print()
{
	CString str;
	str.Format(_T("\n%s = %f : \n"),label,output);
	POSITION pos = outlinks.GetHeadPosition();
	Synapse* synapse = NULL;
	for (int i = 0; i < outlinks.GetCount(); i++) 
	{
		synapse = outlinks.GetNext(pos);
		str.AppendFormat(_T("%s(%.4f)  "),synapse->to->label,synapse->weight);
	}
	OutputDebugString(str);
	return str;
}

int Neuron::SetWeights(double* pWeights)
{
	POSITION pos = outlinks.GetHeadPosition();
	Synapse* synapse = NULL;
	for (int i = 0; i < outlinks.GetCount(); i++) 
	{
		synapse = outlinks.GetNext(pos);
		synapse->weight = pWeights[i];
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -