卷积神经网络实现
randomized2016/10/08软件综合 IP:广东

XXXXXXXXXXXXXXXXXX/mwsht/CNN 更新日志:

11/4

更改训练函数,权值生成函数,以及一些模型中的计算 train(train_label->LabelPtr[i].LabelData,0.0005,0.0005,0.0005);

11/15

2016-11-15 18-11-47屏幕截图.png

更改权值改变函数,解决溢出问题。 w.d[i][l_1][j][k] +=eta*(sum/((last_m-a)*(last_n-b)));

按照11.15的结果来看,正确率可以达到85% 。

2016-11-15 18-13-12屏幕截图.png

11.16,正确率在90%左右徘徊 。

2016-11-16 12-34-10屏幕截图.png

11.17 训练正确率图像:

11.17.jpg 蓝色和红色是不同的模型,黄色是一个更小的\( \eta \)。

代码里的MINST文件夹下载:
attachment icon minst.bin 11.06MB BIN 23次下载 在下载完MINST文件夹并与代码放在同一个文件夹后,编译: g++ -O3 ./test.cpp 然后运行: ./a.out 运行完之后就可以看到本模型的MINST正确率了,如果想要更高正确率,可以尝试改变结构,或者增加训练次数,以此降低误差。

[修改于 8年2个月前 - 2016/11/17 07:09:05]

来自:计算机科学 / 软件综合
12
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
darkorochi
8年3个月前 IP:湖北
826651
fist star~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
randomized作者
8年3个月前 修改于 8年2个月前 IP:广东
826731
代码使用指南-test.cpp

test.cpp是一份用于测试该库性能的代码,使用MINST对其进行测试。

   printf("===========\nMINST_READ\n===========\n");
   printf("--\nReading training images.\n");
   ImgArr train_img = read_Img("./MINST/train-images.idx3-ubyte");
   printf("Read training images finished.\n");
   printf("Training images data:\n");
   printf("%d images.\n",train_img->ImgNum);
   printf("--\nReading testing images.\n");
   printf("Size : %d*%d.\n",train_img->ImgPtr[0].c,train_img->ImgPtr[0].r);
   ImgArr test_img = read_Img("./MINST/t10k-images.idx3-ubyte");
   printf("Read testing images finished.\n");
   printf("Testing images data:\n");
   printf("%d images.\n",test_img->ImgNum);
   printf("Size : %d*%d.\n",test_img->ImgPtr[0].c,test_img->ImgPtr[0].r);

   printf("--\nReading training lables.\n");
   LabelArr train_label = read_Lable("./MINST/train-labels.idx1-ubyte");
   printf("Read training lables finished.\n");
   printf("Training lables data:\n");
   printf("%d lables.\n",train_label->LabelNum);
   printf("--\nReading testing lables.\n");
   LabelArr test_label = read_Lable("./MINST/t10k-labels.idx1-ubyte");
   printf("Read testing lables finished.\n");
   printf("Testing lables data:\n");
   printf("%d lables.\n",test_label->LabelNum);

这一段代码用于读取MINST数据集。

CNN.init();

该函数的作用是初始化卷积神经网络。

   for (int i=0;i<train_img->ImgNum;i++){
   	if ((i%25)==0){
   		printf("%d\n",i);
   	}
   	input_minst(train_img->ImgPtr[i]);
   	do {
   		CNN.train(train_label->LabelPtr[i].LabelData,0.0005,0.0005,0.0005);
   		CNN.calculate();
   	}while (sort(train_label->LabelPtr[i].LabelData)!=sort(CNN.FC_9.y));
   	
   }
</train_img->

这是用于训练的代码,在该代码外加一层循环就可以改变训练次数。

   for (int i=0;i<test_img->ImgNum;i++){
   	input_minst(test_img->ImgPtr[i]);
   	CNN.calculate();
   	if (sort(test_label->LabelPtr[i].LabelData)!=sort(CNN.FC_9.y)){
   		right+=1;
   	}
   }
</test_img->

该段代码用于计算正确率。

void input_minst(MinstImg input); 该函数将MINST数据输入到神经网络中;

int sort(float *data); 该函数用于计算输出数组中最大值的序号。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan
8年3个月前 IP:四川
826736
不错,感谢分享=_=
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
randomized作者
8年3个月前 IP:广东
826737
代码使用指南-CNN.h

class tube;4维数组

class cube; 3维数组

class mat;2维数组

class array;1维数组

class Input_Layer;输入层

class Convolutional_Layer;卷积层

class Max_Pooling_Layer;最大池层

class Fully_Connected_Layer;全连接层

下面是一些层类共有的函数:

void init_1; 初始化阶段一,用于第一次初始化(必须在前一个层初始化阶段一后调用)

void init_2; 初始化阶段二,用于第二次初始化(必须在后一个层初始化阶段一后调用)

void calculate_y();计算输出值(在前一个层计算之后调用)

void calculate_dleta();计算\( \delta\)(原谅拼写错误。)(在后一个层计算之后调用)

void change_weight(float eta);改变权值(\(\eta\)必须指定)

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊
8年3个月前 IP:香港
826807
纯CPU单线程运算?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
randomized作者
8年3个月前 IP:江西
827050
引用 小俊:
纯CPU单线程运算?
首先我要解决掉模型的错误(XXXXXXXXXXXXXXXXXX/mwsht/CNN/projects/1),然后再做MPICH的扩展,但是暂时没有CUDA或OpenCL的打算,但是NEON可能会有。
而且C++的实现理论会比某些语言快一些,。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan
8年3个月前 修改于 8年3个月前 IP:四川
827051
其实用OpenGL 4.3以后版本也能调GPU运算,用GL_COMPUTE_SHADER→_→
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
Cirno
8年3个月前 IP:美国
827060
引用 acmilan:
其实用OpenGL 4.3以后版本也能调GPU运算,用GL_COMPUTE_SHADER→_→
。。。。当初就是贝尔实验室想用OpenGL实现神经网络,发现搞不定,找NVIDIA要技术支持,NVIDIA也觉得蛋疼,才推出cuda
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan
8年3个月前 IP:四川
827066
引用 Cirno:
。。。。当初就是贝尔实验室想用OpenGL实现神经网络,发现搞不定,找NVIDIA要技术支持,NVIDIA也觉得蛋疼,才推出cuda
貌似咱们说的opengl根本不是一个版本,4.3和compute shader是2012才出来的,cuda是2007就出来了→_→
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊
8年3个月前 IP:香港
827090
引用 acmilan:
貌似咱们说的opengl根本不是一个版本,4.3和compute shader是2012才出来的,cuda是2007就出来了→_→
其实不需要用compute shader。卷积层直接用fragment shader读纹理死算也是可以的(算法跟楼主的CPU版本一样,shader内双重循环)。如果用上CUDA的话就有很多快速卷积算法,例如FFT大法和Winograd大法。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan
8年3个月前 修改于 8年3个月前 IP:四川
827091
算了还是用CUDA吧。。。OpenGL 4.3硬件要求还挺高的。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
randomized作者
8年2个月前 修改于 8年2个月前 IP:广东
827700
现在代码已基本完成,在运算完成确认模型无误后我将添加MPICH支持。(也许是OpenACC)
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
randomized
进士 学者 机友 笔友
文章
13
回复
84
学术分
1
2015/02/04注册,4年5个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:江西
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}