资源简介

LeNet-5神经网络 C源代码,这个写的比较好,可以用gcc编译去跑,结合理论可以对深度学习有更深刻的了解 介绍 根据YANN LECUN的论文《Gradient-based Learning Applied To Document Recognition》设计的LeNet-5神经网络,C语言写成,不依赖任何第三方库。 MNIST手写字符集初代训练识别率97%,多代训练识别率98%。 DEMO main.c文件为MNIST数据集的识别DEMO,直接编译即可运行,训练集60000张,测试集10000张。 项目环境 该项目为VISUAL STUDIO 2015项目,用VISUAL STUDIO 2015 UPDATE1及以上直接打开即可编译。采用ANSI C编写,因此源码无须修改即可在其它平台上编译。 如果因缺少openmp无法编译,请将lenet.c中的#include和#pragma omp parallel for删除掉即可。 API #####批量训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 inputs: 要训练的多个图片对应unsigned char二维数组的数组,指向的二维数组的batchSize倍大小内存空间指针。在MNIST测试DEMO中二维数组为28x28,每个二维数组数值分别为对应位置图像像素灰度值 resMat:结果向量矩阵 labels:要训练的多个图片分别对应的标签数组。大小为batchSize batchSize:批量训练输入图像(二维数组)的数量 void TrainBatch(LeNet5 *lenet, image *inputs, const char(*resMat)[OUTPUT],uint8 *labels, int batchSize); #####单个训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 要训练的图片对应二维数组 resMat:结果向量矩阵 label: 要训练的图片对应的标签 void Train(LeNet5 *lenet, image input, const char(*resMat)[OUTPUT],uint8 label); #####预测 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 输入的图像的数据 labels: 结果向量矩阵指针 count: 结果向量个数 return 返回值为预测的结果 int Predict(LeNet5 *lenet, image input, const char(*labels)[LAYER6], int count); #####初始化 lenet: LeNet5的权值的指针,LeNet5神经网络的核心

资源截图

代码片段和文件信息

#include “lenet.h“
#include 
#include 
#include 
#include 

#define GETLENGTH(array) (sizeof(array)/sizeof(*(array)))

#define GETCOUNT(array)  (sizeof(array)/sizeof(double))

#define FOREACH(icount) for (int i = 0; i < count; ++i)

#define CONVOLUTE_VALID(inputoutputweight) \
{ \
FOREACH(o0GETLENGTH(output)) \
FOREACH(o1GETLENGTH(*(output))) \
FOREACH(w0GETLENGTH(weight)) \
FOREACH(w1GETLENGTH(*(weight))) \
(output)[o0][o1] += (input)[o0 + w0][o1 + w1] * (weight)[w0][w1]; \
}

#define CONVOLUTE_FULL(inputoutputweight) \
{ \
FOREACH(i0GETLENGTH(input)) \
FOREACH(i1GETLENGTH(*(input))) \
FOREACH(w0GETLENGTH(weight)) \
FOREACH(w1GETLENGTH(*(weight))) \
(output)[i0 + w0][i1 + w1] += (input)[i0][i1] * (weight)[w0][w1]; \
}

#define CONVOLUTION_FORWARD(inputoutputweightbiasaction) \
{ \
for (int x = 0; x < GETLENGTH(weight); ++x) \
for (int y = 0; y < GETLENGTH(*weight); ++y) \
CONVOLUTE_VALID(input[x] output[y] weight[x][y]); \
FOREACH(j GETLENGTH(output)) \
FOREACH(i GETCOUNT(output[j])) \
((double *)output[j])[i] = action(((double *)output[j])[i] + bias[j]); \
}

#define CONVOLUTION_BACKWARD(inputinerrorouterrorweightwdbdactiongrad)\
{ \
for (int x = 0; x < GETLENGTH(weight); ++x) \
for (int y = 0; y < GETLENGTH(*weight); ++y) \
CONVOLUTE_FULL(outerror[y] inerror[x] weight[x][y]); \
FOREACH(i GETCOUNT(inerror)) \
((double *)inerror)[i] *= actiongrad(((double *)input)[i]); \
FOREACH(j GETLENGTH(outerror)) \
FOREACH(i GETCOUNT(outerror[j])) \
bd[j] += ((double *)outerror[j])[i]; \
for (int x = 0; x < GETLENGTH(weight); ++x) \
for (int y = 0; y < GETLENGTH(*weight); ++y) \
CONVOLUTE_VALID(input[x] wd[x][y] outerror[y]); \
}


#define SUBSAMP_MAX_FORWARD(inputoutput) \
{ \
const int len0 = GETLENGTH(*(input)) / GETLENGTH(*(output)); \
const int len1 = GETLENGTH(**(input)) / GETLENGTH(**(output)); \
FOREACH(i GETLENGTH(output)) \
FOREACH(o0 GETLENGTH(*(output))) \
FOREACH(o1 GETLENGTH(**(output))) \
{ \
int x0 = 0 x1 = 0 ismax; \
FOREACH(l0 len0) \
FOREACH(l1 len1) \
{ \
ismax = input[i][o0*len0 + l0][o1*len1 + l1] > input[i][o0*len0 + x0][o1*len1 + x1];\
x0 += ismax * (l0 - x0); \
x1 += ismax * (l1 - x1); \
} \
output[i][o0][o1] = input[i][o0*len0 + x0][o1*len1 + x1]; \
} \
}

#define SUBSAMP_MAX_BACKWARD(inputinerrorouterror)

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-01-01 04:35  LeNet-5-master\
     文件        2518  2017-01-01 04:35  LeNet-5-master\.gitattributes
     文件        3461  2017-01-01 04:35  LeNet-5-master\.gitignore
     文件        1078  2017-01-01 04:35  LeNet-5-master\LICENSE
     文件        1275  2017-01-01 04:35  LeNet-5-master\LeNet-5.sln
     目录           0  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\
     文件        8202  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\project.pbxproj
     目录           0  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\project.xcworkspace\
     文件         152  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\project.xcworkspace\contents.xcworkspacedata
     目录           0  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\project.xcworkspace\xcuserdata\
     目录           0  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\project.xcworkspace\xcuserdata\fanwenjie.xcuserdatad\
     文件       35009  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\project.xcworkspace\xcuserdata\fanwenjie.xcuserdatad\UserInterfaceState.xcuserstate
     目录           0  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\xcuserdata\
     目录           0  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\xcuserdata\fanwenjie.xcuserdatad\
     目录           0  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\xcuserdata\fanwenjie.xcuserdatad\xcschemes\
     文件        3287  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\xcuserdata\fanwenjie.xcuserdatad\xcschemes\LeNet-5.xcscheme
     文件         479  2017-01-01 04:35  LeNet-5-master\LeNet-5.xcodeproj\xcuserdata\fanwenjie.xcuserdatad\xcschemes\xcschememanagement.plist
     目录           0  2017-01-01 04:35  LeNet-5-master\LeNet-5\
     文件        7411  2017-01-01 04:35  LeNet-5-master\LeNet-5\LeNet-5.vcxproj
     文件        1543  2017-01-01 04:35  LeNet-5-master\LeNet-5\LeNet-5.vcxproj.filters
     文件       10348  2017-01-01 04:35  LeNet-5-master\LeNet-5\lenet.c
     文件        2115  2017-01-01 04:35  LeNet-5-master\LeNet-5\lenet.h
     文件        3285  2017-01-01 04:35  LeNet-5-master\LeNet-5\main.c
     文件     7840016  2017-01-01 04:35  LeNet-5-master\LeNet-5\t10k-images-idx3-ubyte
     文件       10008  2017-01-01 04:35  LeNet-5-master\LeNet-5\t10k-labels-idx1-ubyte
     文件    47040016  2017-01-01 04:35  LeNet-5-master\LeNet-5\train-images-idx3-ubyte
     文件       60008  2017-01-01 04:35  LeNet-5-master\LeNet-5\train-labels-idx1-ubyte
     文件        2023  2017-01-01 04:35  LeNet-5-master\README.md

评论

共有 条评论