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年1个月前 - 2016/11/17 07:09:05]
test.cpp是一份用于测试该库性能的代码,使用MINST对其进行测试。
<code class="language-c"> 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); </code>
这一段代码用于读取MINST数据集。
<code class="language-c">CNN.init(); </code>
该函数的作用是初始化卷积神经网络。
<code class="language-c"> 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-></code>
这是用于训练的代码,在该代码外加一层循环就可以改变训练次数。
<code class="language-c"> 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-></code>
该段代码用于计算正确率。
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就出来了→_→
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。