Skip to content

Commit

Permalink
NO~
Browse files Browse the repository at this point in the history
  • Loading branch information
Cachey4467 committed Dec 15, 2018
1 parent f7e0076 commit 678be56
Show file tree
Hide file tree
Showing 46 changed files with 204 additions and 100 deletions.
Binary file modified .vs/Nerve/v14/.suo
Binary file not shown.
119 changes: 73 additions & 46 deletions Nerve/Nerve.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,10 @@ namespace Nerve
}
d_H[0].resize(_max);
d_H[1].resize(_max);
d_Wjk.resize(_max, vector<double>(_max));
layers.push_back(Layer(m, layers.back()));
for (int i = 0; i < layers.size(); i++)
d_Wjk.push_back(vector<vector<double>>(_max, vector<double>(_max, 0.0)));
d_P.resize(layers.size(), vector<double>(_max, 0.0));
}

//为了方便测试,我增加了保存神经网络到文件的操作
Expand All @@ -94,7 +96,9 @@ namespace Nerve

d_H[0].resize(_max);
d_H[1].resize(_max);
d_Wjk.resize(_max, vector<double>(_max));
for (int i = 0; i < layers.size(); i++)
d_Wjk.push_back(vector<vector<double>>(_max, vector<double>(_max, 0.0)));
d_P.resize(layers.size(), vector<double>(_max, 0.0));

double data;
for (int i = 1; i < layers.size(); i++)
Expand Down Expand Up @@ -182,8 +186,23 @@ namespace Nerve
return out;
}

void Train() //反向传播!(BP)
void Began_training()
{
if (if_training)Send_error("is training");
samples = 0;
for (int i = 1; i < layers.size(); i++)
for (int j = 0; j < layers[i].neurons.size(); j++)
for (int k = 0; k < layers[i - 1].neurons.size(); k++)
d_Wjk[i][j][k] = 0.0;

for (int i = 1; i < layers.size(); i++)
for (int j = 0; j < layers[i].neurons.size(); j++)
d_P[i][j] = 0.0;
if_training = true;
}
void Learn() //反向传播!(BP)
{
if (!if_training)Send_error("is no training");
//对于保存δH、δw的数据结构,这里我选择重复利用容器节省时间,所以要分情况讨论

for (int i = 0; i < layers.back().neurons.size(); i++)//先求出输出层的δH
Expand All @@ -195,28 +214,38 @@ namespace Nerve
//清空d_H
fill(d_H[bjH ^ 1].begin(), d_H[bjH ^ 1].end(), 0.0);
#pragma omp parallel for//一步加速
for (int k = 0; k < layers[L - 1].neurons.size(); k++)//循环L-1每一个神经元
for (int j = 0; j < layers[L].neurons.size(); j++)//循环L每一个神经元
{
for (int j = 0; j < layers[L].neurons.size(); j++)//循环L每一个神经元
for (int k = 0; k < layers[L - 1].neurons.size(); k++)//循环L-1每一个神经元
{
d_Wjk[j][k] = Figue_d_w(L, j, k);
d_Wjk[L][j][k] += Figue_d_w(L, j, k);//累加当前样本的δ权值

d_H[bjH ^ 1][k] += Figue_d_H(L, j, k);
}

d_P[L][j] += d_H[bjH][j];//累加当前样本的δ偏置
}

bjH ^= 1;
}
samples++;//处理样本数+1
}

void End_training()
{
if (!if_training)Send_error("is no training");
if_training = false;
for (int L = layers.size() - 1; L > 0; L--)//循环层,L层即当前处理层
{
for (int j = 0; j < layers[L].neurons.size(); j++)//循环L每一个神经元
{
for (int k = 0; k < layers[L - 1].neurons.size(); k++)//循环L-1每一个神经元
{
//更新L层的W
layers[L].neurons[j].w[k] -= learning_rate * d_Wjk[j][k];
layers[L].neurons[j].w[k] -= learning_rate * d_Wjk[L][j][k] / (double)samples;
}
//更新L层的P(由公式可推知δPj=δHj,所以就可以很好偷懒)
layers[L].neurons[j].p -= learning_rate * d_H[bjH][j];
layers[L].neurons[j].p -= learning_rate * d_P[L][j] / (double)samples;
}

bjH ^= 1;
}
}
//========================================================Math=========================================================
Expand Down Expand Up @@ -262,64 +291,62 @@ namespace Nerve
return d_H[bjH][j] * layers[L].neurons[j].w[k] *
(1 - layers[L - 1].neurons[k].out)*layers[L - 1].neurons[k].out;
}
void Send_error(char *info)
{
MessageBox(NULL, info, "class Nerve_net", MB_OK);
}
private:
vector<Layer> layers;
vector<double> desired_ouput;
double learning_rate = 0.2;
double learning_rate = 0.5;
int samples;//一次训练的样本数
bool if_training;//是否正在训练中

vector<double> d_H[2]; //Train过程中处理层和将处理层的偏导δH
short bjH = 0;//标记当前d_H使用的是哪一个
vector<vector<double>> d_Wjk; //learn过程处理层的所有权值偏导
vector<vector<vector<double>>> d_Wjk; //learn过程所有权值偏导
vector<vector<double>> d_P; //learn过程所有偏置偏导
};
}
using namespace Nerve;

//int main()
//int main()//a simple example
//{
// //Nerve_net net(4, 3, vector<int>{3,4});
// Nerve_net net("a.nerve");//从文件读入
//
// int o = 30000;
// default_random_engine e(GetTickCount());/*初始化随机引擎*/
// uniform_int_distribution<int> u(0,2);
// Nerve_net net(4, 3, vector<int>{3,4});
// //Nerve_net net("a.nerve");//从文件读入
// int o = 60000;
// while (o--)
// {
// if (u(e) == 0)
// {
// net.Input(vector<double>{1, 1, 0, 0});
// net.Set_Desired_output(vector<double>{1, 0, 0});
// net.Figue();
// net.Train();
// }
// else if (u(e) == 1)
// {
// net.Input(vector<double>{0, 1, 1, 0});
// net.Set_Desired_output(vector<double>{0, 1, 0});
// net.Figue();
// net.Train();
// }
// else
// {
// net.Input(vector<double>{0, 0, 1, 1});
// net.Set_Desired_output(vector<double>{0, 0, 1});
// net.Figue();
// net.Train();
// }
// net.Began_training(); //①
//
// net.Input(vector<double>{1, 1, 0, 0}); //②
// net.Set_Desired_output(vector<double>{1, 0, 0}); //③
// net.Figue(); //④
// net.Learn(); //⑤
//
// net.Input(vector<double>{0, 1, 1, 0});
// net.Set_Desired_output(vector<double>{0, 1, 0});
// net.Figue();
// net.Learn();
//
// net.Input(vector<double>{1, 1, 1, 1});
// net.Set_Desired_output(vector<double>{1, 1, 1});
// net.Input(vector<double>{0, 0, 1, 1});
// net.Set_Desired_output(vector<double>{0, 0, 1});
// net.Figue();
// net.Train();
// net.Learn();
//
// net.End_training(); //⑥
//
// }
// //教会它识别01
// net.Input(vector<double>{1,0.5,0,0.0});
// net.Input(vector<double>{1, 1, 0, 0.0});
// net.Figue();
// vector<double> oo = net.Output();
// for (int i = 0; i < oo.size(); i++)
// std::cout << oo[i] << " ";
//
// std::cout << endl;
// net.Input(vector<double>{0,0.60,1.0,0.00});
//
// net.Input(vector<double>{0.0,0.00,1.0,0.41});
// net.Figue();
// vector<double> ooo = net.Output();
// for (int i = 0; i < ooo.size(); i++)
Expand Down
4 changes: 2 additions & 2 deletions Nerve/Nerve.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,14 @@
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
Expand Down
4 changes: 4 additions & 0 deletions Nerve/Nerve.vcxproj.user
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>
Binary file modified Nerve/a.nerve
Binary file not shown.
15 changes: 8 additions & 7 deletions Nerve/x64/Debug/Nerve.log
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
 Nerve.cpp
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(39): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(109): warning C4244: “初始化”: 从“std::streamsize”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(120): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(125): warning C4267: “=”: 从“size_t”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(146): warning C4305: “return”: 从“int”到“bool”截断
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(193): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(232): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(163): warning C4715: “Nerve::Nerve_net::Set_Desired_output”: 不是所有的控件路径都返回值
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(113): warning C4244: “初始化”: 从“std::streamsize”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(124): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(129): warning C4267: “=”: 从“size_t”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(150): warning C4305: “return”: 从“int”到“bool”截断
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(212): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(237): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(261): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
e:\我的 东东\easyx学习\深度学习\nerve_net\nerve\nerve.cpp(167): warning C4715: “Nerve::Nerve_net::Set_Desired_output”: 不是所有的控件路径都返回值
Nerve.vcxproj -> E:\我的 东东\EasyX学习\深度学习\Nerve_Net\x64\Debug\Nerve.exe
Nerve.vcxproj -> E:\我的 东东\EasyX学习\深度学习\Nerve_Net\x64\Debug\Nerve.pdb (Full PDB)
Binary file modified Nerve/x64/Debug/Nerve.tlog/CL.command.1.tlog
Binary file not shown.
Binary file modified Nerve/x64/Debug/Nerve.tlog/link.read.1.tlog
Binary file not shown.
Binary file modified Nerve/x64/Debug/vc140.idb
Binary file not shown.
Binary file modified Nerve/x64/Debug/vc140.pdb
Binary file not shown.
17 changes: 9 additions & 8 deletions Nerve/x64/Release/Nerve.log
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
 Nerve.cpp
Nerve.cpp(39): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
Nerve.cpp(109): warning C4244: “初始化”: 从“std::streamsize”转换到“int”,可能丢失数据
Nerve.cpp(120): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
Nerve.cpp(125): warning C4267: “=”: 从“size_t”转换到“int”,可能丢失数据
Nerve.cpp(146): warning C4305: “return”: 从“int”到“bool”截断
Nerve.cpp(193): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
Nerve.cpp(232): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
Nerve.cpp(113): warning C4244: “初始化”: 从“std::streamsize”转换到“int”,可能丢失数据
Nerve.cpp(124): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
Nerve.cpp(129): warning C4267: “=”: 从“size_t”转换到“int”,可能丢失数据
Nerve.cpp(150): warning C4305: “return”: 从“int”到“bool”截断
Nerve.cpp(212): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
Nerve.cpp(237): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
Nerve.cpp(261): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
正在生成代码
4 of 535 functions ( 0.7%) were compiled, the rest were copied from previous compilation.
6 of 613 functions ( 1.0%) were compiled, the rest were copied from previous compilation.
0 functions were new in current compilation
12 functions had inline decision re-evaluated but remain unchanged
1 functions had inline decision re-evaluated but remain unchanged
已完成代码的生成
Nerve.vcxproj -> E:\我的 东东\EasyX学习\深度学习\Nerve_Net\x64\Release\Nerve.exe
Nerve.vcxproj -> E:\我的 东东\EasyX学习\深度学习\Nerve_Net\x64\Release\Nerve.pdb (Full PDB)
Binary file modified Nerve/x64/Release/Nerve.tlog/CL.command.1.tlog
Binary file not shown.
Binary file modified Nerve/x64/Release/vc140.pdb
Binary file not shown.
Loading

0 comments on commit 678be56

Please sign in to comment.