lenet的c++代码

以下是一个简单的 LeNet 的 C 代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define WIDTH 28
#define HEIGHT 28
#define NUM_CLASSES 10
#define NUM_TRAIN 60000
#define NUM_TEST 10000

typedef struct conv_layer {
    int stride;
    int num_filters;
    int filter_size;
    int input_size;
    int output_size;
    double ***filters;
    double **biases;
    double **output;
} conv_layer;

typedef struct pool_layer {
    int stride;
    int pool_size;
    int input_size;
    int output_size;
    double **output;
} pool_layer;

typedef struct dense_layer {
    int num_neurons;
    double *weights;
    double *biases;
    double *output;
} dense_layer;

int reverse_int(int i) {
    unsigned char ch1, ch2, ch3, ch4;
    ch1 = i &amp; 255;
    ch2 = (i >> 8) &amp; 255;
    ch3 = (i >> 16) &amp; 255;
    ch4 = (i >> 24) &amp; 255;
    return ((int) ch1 << 24) + ((int) ch2 << 16) + ((int) ch3 << 8) + ch4;
}

void read_images(double **images, char *filename, int num_images) {
    FILE *file = fopen(filename, "rb");
    int magic_number = 0;
    int num_images_read = 0;

    fread(&amp;magic_number, sizeof(magic_number), 1, file);
    magic_number = reverse_int(magic_number);
    if (magic_number != 2051) {
        printf("Error: Invalid image file format\n");
        exit(1);
    }

    fread(&amp;num_images_read, sizeof(num_images_read), 1, file);
    num_images_read = reverse_int(num_images_read);
    if (num_images_read != num_images) {
        printf("Error: Invalid number of images\n");
        exit(1);
    }

    int num_rows = 0, num_cols = 0;
    fread(&amp;num_rows, sizeof(num_rows), 1, file);
    fread(&amp;num_cols, sizeof(num_cols), 1, file);
    num_rows = reverse_int(num_rows);
    num_cols = reverse_int(num_cols);

    int i, j, k;
    for (i = 0; i < num_images; i++) {
        for (j = 0; j < num_rows; j++) {
            for (k = 0; k < num_cols; k++) {
                unsigned char pixel = 0;
                fread(&amp;pixel, sizeof(pixel), 1, file);
                images[i][(j * num_cols) + k] = (double) pixel;
            }
        }
    }

    fclose(file);
}

void read_labels(double *labels, char *filename, int num_labels) {
    FILE *file = fopen(filename, "rb");
    int magic_number = 0;
    int num_labels_read = 0;

    fread(&amp;magic_number, sizeof(magic_number), 1, file);
    magic_number = reverse_int(magic_number);
    if (magic_number != 2049) {
        printf("Error: Invalid label file format\n");
        exit(1);
    }

    fread(&amp;num_labels_read, sizeof(num_labels_read), 1, file);
    num_labels_read = reverse_int(num_labels_read);
    if (num_labels_read != num_labels) {
        printf("Error: Invalid number of labels\n");
        exit(1);
    }

    int i;
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神经网络的核心
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值