开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
1 Star 3 Fork 0

斗大的熊猫/brain

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
项目仓库所选许可证以仓库主分支所使用许可证为准
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
brain
/
neuralnetwork.cpp
brain
/
neuralnetwork.cpp
neuralnetwork.cpp 4.32 KB
一键复制 编辑 原始数据 按行查看 历史
tianshuai 提交于 2015年07月29日 17:49 +08:00 . net
//
// neuralnetwork.cpp
// neuralnetwork
//
// Created by tianshuai on 7/13/15.
//
#include "neuralnetwork.h"
float Node::alpha = 0.40;
float Node::eta = 0.10;
Node::Node(int OutCount, int idx)
{
for(int i = 0; i < OutCount; ++i)
{
Link con;
con.DerivWeight = 0;
con.weight = rand0to1();
OutWeights.push_back(con);
}
index = idx;
}
void Node::FeedFwd(const std::vector<Node>& prevLevel)
{
double v = 0.0;
for(int n = 0; n < prevLevel.size(); ++n)
{
v += prevLevel[n].getOutValue() * prevLevel[n].OutWeights[index].weight;
}
setOut(TransFunc(v));
}
void Node::calcOutGradients(double GoalValue)
{
double delta = GoalValue - OutValue;
gradient = delta * TransFuncDer(OutValue);
}
double Node::sumDerivWeights(const std::vector<Node>& nextLevel) const
{
/* Sum errors of the nodes */
double DerivWeights = 0;
for(int i = 0; i < nextLevel.size() - 1; ++i)
{
DerivWeights += OutWeights[i].weight * nextLevel[i].gradient;
}
return DerivWeights;
}
void Node::calcHiddenGradients(const std::vector<Node>& nextLevel)
{
double DerivWeights = sumDerivWeights(nextLevel);
gradient = DerivWeights * TransFuncDer(OutValue);
}
void Node::updateInWeights(std::vector<Node>& prevLevel)
{
for(int i = 0; i < prevLevel.size(); ++i)
{
Node& Node = prevLevel[i];
double oldDerivWeight = Node.OutWeights[index].DerivWeight;
double newDerivWeight = eta * Node.OutValue * gradient + alpha * oldDerivWeight;
Node.OutWeights[index].DerivWeight = newDerivWeight;
Node.OutWeights[index].weight += newDerivWeight;
}
}
NeuralNetwork::NeuralNetwork(const Topology& Topol)
{
int levelCount = Topol.size();
for(int levelNum = 0; levelNum < levelCount; ++levelNum)
{
levels.push_back(Level());
int OutCount = levelNum == levelCount - 1 ? 0 : Topol[levelNum+1];
/* question mark means 0 if else */
Level& currentLevel = levels.back();
for(int n = 0; n <= Topol[levelNum]; ++n)i
{
currentLevel.push_back(Node(OutCount, n));
}
currentLevel.back().setOut(1.0);
}
srand(time(NULL));
}
void NeuralNetwork::FeedForward(const Value& InVals)
{
for(int i = 0; i < InVals.size(); ++i)
{
levels[0][i].setOut(InVals[i]);
}
for(int levelNum = 1; levelNum < levels.size(); ++levelNum)
{
Level& level = levels[levelNum];
const Level& lastLevel = levels[levelNum - 1];
for(int n = 0; n < level.size() - 1; ++n)
{
level[n].FeedFwd(lastLevel);
}
}
}
void NeuralNetwork::BackPropagation(const Value& Goal)
{
/* Calc RMS error */
Level& OutLevel = levels.back();
error = 0.0;/* initialize */
for(int i = 0; i < Goal.size(); ++i)
{
double delta = Goal[i] - OutLevel[i].getOutValue();
error += delta * delta;
}
error = std::sqrt(error / Goal.size());
/* current error */
DisplayError = (DisplayError * DisplaySmoothingFactor + error) / (DisplaySmoothingFactor + 1.0);
/* output gradient */
for(int i = 0; i < OutLevel.size() - 1; ++i)
{
OutLevel[i].calcOutGradients(Goal[i]);
}
/* hidden gradients */
for(int i = levels.size() - 2; i > 0; --i)
{
Level& level = levels[i];
Level& nextLevel = levels[i+1];
for(int j = 0; j < level.size(); ++j)
{
level[j].calcHiddenGradients(nextLevel);
}
}
/* Update weights */
for(int i = levels.size() - 1; i > 0; i--)
{
Level& level = levels[i];
Level& prevLevel = levels[i-1];
for(int j = 0; j < level.size() - 1; ++j)
{
level[j].updateInWeights(prevLevel);
}
}
}
void NeuralNetwork::getOutput(Value& results) const
{
results.clear();
const Level& OutLevel = levels.back();
for(int i = 0; i < OutLevel.size() - 1; ++i)
{
results.push_back(OutLevel[i].getOutValue());
}
}
void NeuralNetwork::train(Value&& In, Value&& Goal)
{
FeedForward(In);
BackPropagation(Goal);
}
Value NeuralNetwork::run(Value&& In)
{
FeedForward(In);
Value r;
getOutput(r);
return r;
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/androidsourcecode/brain.git
git@gitee.com:androidsourcecode/brain.git
androidsourcecode
brain
brain
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /