文号
826579
阅读
23758
回复
12
收藏
7
卷积神经网络实现
2016/10/08
IP:广东

XXXXXXXXXXXXXXXXXXXXXXXXXXXX 更新日志:

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

[ 修改于10年1个月前 - 2016/11/17 07:09:05 ]
10年2个月前IP:湖北
826651
1楼
fist star~
引用
评论
randomized作者
10年2个月前修改于 10年1个月前IP:广东
826731
2楼
代码使用指南-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); 该函数用于计算输出数组中最大值的序号。

引用
评论
10年2个月前IP:四川
826736
3楼
不错,感谢分享=_=
引用
评论
randomized作者
10年2个月前IP:广东
826737
4楼
代码使用指南-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\)必须指定)

引用
评论
10年2个月前IP:香港
826807
5楼
纯CPU单线程运算?
引用
评论
randomized作者
10年2个月前IP:江西
827050
6楼
引用 小俊:
纯CPU单线程运算?
首先我要解决掉模型的错误(XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX),然后再做MPICH的扩展,但是暂时没有CUDA或OpenCL的打算,但是NEON可能会有。
而且C++的实现理论会比某些语言快一些,。
引用
评论
10年2个月前修改于 10年2个月前IP:四川
827051
7楼
其实用OpenGL 4.3以后版本也能调GPU运算,用GL_COMPUTE_SHADER→_→
引用
评论
10年1个月前IP:美国
827060
8楼
引用 acmilan:
其实用OpenGL 4.3以后版本也能调GPU运算,用GL_COMPUTE_SHADER→_→
。。。。当初就是贝尔实验室想用OpenGL实现神经网络,发现搞不定,找NVIDIA要技术支持,NVIDIA也觉得蛋疼,才推出cuda
引用
评论
10年1个月前IP:四川
827066
9楼
引用 Cirno:
。。。。当初就是贝尔实验室想用OpenGL实现神经网络,发现搞不定,找NVIDIA要技术支持,NVIDIA也觉得蛋疼,才推出cuda
貌似咱们说的opengl根本不是一个版本,4.3和compute shader是2012才出来的,cuda是2007就出来了→_→
引用
评论
10年1个月前IP:香港
827090
10楼
引用 acmilan:
貌似咱们说的opengl根本不是一个版本,4.3和compute shader是2012才出来的,cuda是2007就出来了→_→
其实不需要用compute shader。卷积层直接用fragment shader读纹理死算也是可以的(算法跟楼主的CPU版本一样,shader内双重循环)。如果用上CUDA的话就有很多快速卷积算法,例如FFT大法和Winograd大法。
引用
评论
10年1个月前修改于 10年1个月前IP:四川
827091
11楼
算了还是用CUDA吧。。。OpenGL 4.3硬件要求还挺高的。。。
引用
评论
randomized作者
10年1个月前修改于 10年1个月前IP:广东
827700
12楼
现在代码已基本完成,在运算完成确认模型无误后我将添加MPICH支持。(也许是OpenACC)
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的