XXXXXXXXXXXXXXXXXX/mwsht/CNN 更新日志:
11/4
更改训练函数,权值生成函数,以及一些模型中的计算
train(train_label->LabelPtr[i].LabelData,0.0005,0.0005,0.0005);
11/15
更改权值改变函数,解决溢出问题。
w.d[i][l_1][j][k] +=eta*(sum/((last_m-a)*(last_n-b)));
蓝色和红色是不同的模型,黄色是一个更小的\( \eta \)。
代码里的MINST文件夹下载:
在下载完MINST文件夹并与代码放在同一个文件夹后,编译:
g++ -O3 ./test.cpp
然后运行:
./a.out
运行完之后就可以看到本模型的MINST正确率了,如果想要更高正确率,可以尝试改变结构,或者增加训练次数,以此降低误差。
[修改于 8年2个月前 - 2016/11/17 07:09:05]
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);
该函数用于计算输出数组中最大值的序号。
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\)必须指定)
引用 小俊:首先我要解决掉模型的错误(XXXXXXXXXXXXXXXXXX/mwsht/CNN/projects/1),然后再做MPICH的扩展,但是暂时没有CUDA或OpenCL的打算,但是NEON可能会有。
纯CPU单线程运算?
引用 acmilan:。。。。当初就是贝尔实验室想用OpenGL实现神经网络,发现搞不定,找NVIDIA要技术支持,NVIDIA也觉得蛋疼,才推出cuda
其实用OpenGL 4.3以后版本也能调GPU运算,用GL_COMPUTE_SHADER→_→
引用 Cirno:貌似咱们说的opengl根本不是一个版本,4.3和compute shader是2012才出来的,cuda是2007就出来了→_→
。。。。当初就是贝尔实验室想用OpenGL实现神经网络,发现搞不定,找NVIDIA要技术支持,NVIDIA也觉得蛋疼,才推出cuda
引用 acmilan:其实不需要用compute shader。卷积层直接用fragment shader读纹理死算也是可以的(算法跟楼主的CPU版本一样,shader内双重循环)。如果用上CUDA的话就有很多快速卷积算法,例如FFT大法和Winograd大法。
貌似咱们说的opengl根本不是一个版本,4.3和compute shader是2012才出来的,cuda是2007就出来了→_→
200字以内,仅用于支线交流,主线讨论请采用回复功能。