资源简介
c++版神经网络的实现,内部实现了矩阵运算,前向传播,反向传播的基本逻辑,使用的是交叉熵损失函数,二分类问题,数据集是64*64*3的猫的图片,已被展成12288向量存于txt文件中,由于数据量大训练时间可能较长
代码片段和文件信息
#include “layer.h“
#include
#include
#include
layer::layer(int input_num int output_num string activation = “relu“)
: Z()
input()
{
//初始化权重矩阵和偏差矩阵
weight.init_matrix(input_num output_num);
bias.init_matrix(1 output_num);
//使用Xavier算法初始化系数矩阵
//seed=2018 保证结果稳定性
default_random_engine generator(2018);
uniform_real_distribution dis(-sqrt(6.0 / (input_num + output_num)) sqrt(6.0 / (input_num + output_num)));
for (int i = 0; i < input_num;i++)
for (int j = 0; j < output_num; j++)
{
weight.write(i j dis(generator));
}
this->activation = activation;
}
layer::~layer()
{
}
_Matrix layer::forward(const _Matrix & input)
{
this->input = input;
Z = input*weight + bias;
//cout << “Z:“ << endl;
//print1(Z);
_Matrix A;
if (activation == “relu“)
A = relu(Z);
else if (activation == “sigmoid“)
A = sigmoid(Z);
else
A = Z;
//cout << “A:“ << endl;
//print1(A);
return A;
}
/*
grads_A: 下一层的梯度值
返回这一层的梯度值
*/
const _Matrix layer::backward(const _Matrix & grads_A float learning_rate = 1.)
{
_Matrix grads;
/*求梯度*/
_Matrix grads_Z;
if (activation == “relu“)
grads_Z = d_relu(Z);
else if (activation == “sigmoid“)
grads_Z = d_sigmoid(Z);
/*
前一层(离输入近)的grads_A
d_A_L_1 = d_Z_L * W_L
*/
grads = grads_A.multiply(grads_Z) * (weight.T());
/*参数更新*/
/*
更新公式: W = W - lr/m*grads_A*grads_Z*X
b = b - lr/m*grads_A*grads_Z
*/
//cout << “grads_Z“ << endl;
//print1(grads_Z);
//cout << “weight“ << endl;
//print1(weight);
assert(input.rows() > 0 && input.cols() > 0);
int m = input.rows();
weight = weight - ((input.T() * (grads_A.multiply(grads_Z))*learning_rate*(1. / m)));
bias = bias - (((grads_A.multiply(grads_Z))*learning_rate*(1. / m)).sum(0));
return grads;
}
/*activation*/
_Matrix layer::sigmoid(_Matrix & z) const
{
return ((-z).calc_exp() + 1).reciprocal();
}
_Matrix layer::relu(_Matrix& z) const
{
_Matrix C(z.rows() z.cols());
for (int i = 0; i < C.rows();i++)
for (int j = 0; j < C.cols(); j++)
{
C.write(i j max(0.0 z.read(i j)));
}
return C;
}
_Matrix layer::d_sigmoid(_Matrix& z) const
{
_Matrix C = sigmoid(z);
return C.multiply(-C + 1);
}
_Matrix layer::d_relu(_Matrix& z) const
{
_Matrix C(z.rows() z.cols());
for (int i = 0; i < C.rows(); i++)
for (int j = 0; j < C.cols(); j++)
{
if (z.read(ij) > 0)
C.write(i j 1.);
else
C.write(i j 0.);
}
return C;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-06-19 15:12 NN\
目录 0 2018-06-19 15:12 NN\Debug\
文件 185344 2018-06-18 22:33 NN\Debug\honework.exe
文件 1761180 2018-06-18 22:33 NN\Debug\honework.ilk
文件 2198528 2018-06-18 22:33 NN\Debug\honework.pdb
目录 0 2018-06-19 15:12 NN\honework\
目录 0 2018-06-19 15:12 NN\honework\Debug\
文件 207350 2018-06-18 22:33 NN\honework\Debug\la
文件 312373 2018-06-18 22:01 NN\honework\Debug\Network.obj
文件 209718 2018-06-18 19:37 NN\honework\Debug\_Matrix.obj
文件 2712 2018-06-18 22:33 NN\honework\Debug\honework.log
目录 0 2018-06-19 15:12 NN\honework\Debug\honework.tlog\
文件 61824 2018-06-18 22:33 NN\honework\Debug\honework.tlog\CL.read.1.tlog
文件 6758 2018-06-18 22:33 NN\honework\Debug\honework.tlog\CL.write.1.tlog
文件 2438 2018-06-18 22:33 NN\honework\Debug\honework.tlog\cl.command.1.tlog
文件 157 2018-06-18 22:33 NN\honework\Debug\honework.tlog\honework.lastbuildstate
文件 3172 2018-06-18 22:33 NN\honework\Debug\honework.tlog\li
文件 7124 2018-06-18 22:33 NN\honework\Debug\honework.tlog\li
文件 668 2018-06-18 22:33 NN\honework\Debug\honework.tlog\li
文件 383549 2018-06-18 21:58 NN\honework\Debug\main.obj
文件 453632 2018-06-18 22:33 NN\honework\Debug\vc120.idb
文件 765952 2018-06-18 22:33 NN\honework\Debug\vc120.pdb
文件 2600 2018-06-18 22:33 NN\honework\la
文件 779 2018-06-17 22:57 NN\honework\la
文件 3312 2018-06-18 22:01 NN\honework\Network.cpp
文件 430 2018-06-18 18:45 NN\honework\Network.h
文件 8531 2018-06-18 19:37 NN\honework\_Matrix.cpp
文件 1539 2018-06-18 19:24 NN\honework\_Matrix.h
文件 4399 2018-06-16 17:13 NN\honework\honework.vcxproj
文件 1512 2018-06-16 17:13 NN\honework\honework.vcxproj.filters
文件 165 2018-06-16 15:54 NN\honework\honework.vcxproj.user
............此处省略131个文件信息
- 上一篇:C++编程有限元公式
- 下一篇:Essential C++中文版(全)
相关资源
- Essential C++中文版(全)
- C++编程有限元公式
- 《深入学习c++string》2.1版
- 银行家算法C++实现穷举所有安全序列
- C++课程设计-图书信息管理系统含源码
- C++使用Openssl进行RSA加密解密及签名验
- 三维五角星
- C++蚁群算法求解TSP问题
- C语言编的数据库管理系统DBMS
- C++ Template 完全导引简体中文版
- 中国象棋对弈(MFC单机版)
- IP包流量分析程序.rar含程序+源码WIN
- 谭浩强c++第二章例题源码
- C++远控源码demo
- Seamless R and C++ Integration with Rcpp
- 用vc++6.0mfc对话框做的钟表
- C++绘制地图
- 工业组态软件VC++简单实现
- 基于opencv C++实现毛衣衣服的瑕疵检测
- apriori 算法 c++ 实现 文件读入
- 时间片轮转法RRC++实现
- Visual Studio 2012制作MFC计算器-TC王者
- C++用Opencv将图片转化为灰度图并保存
- VC6.0 C++ MD5验证源码文件和字符串验证
- 数据结构与算法分析C++描述Larrynyhof
- C和C++嵌入式系统编程面试题 C和C++
- VC++读视频文件
- C++ 解析H264文件
- VC++使用教程烟台南山学院
- C++程序设计教材思维导图
评论
共有 条评论