从头开始​​的神经网络 - 第 2 部分

如何使用 C++ 和 OpenCL 构建卷积神经网络库

来源:AI夏令营

在本部分中,我们将研究如何通过添加卷积神经网络结构来改进我们的神经网络库,以用于图像数据集。没有人会否认卷积神经网络是分类和训练图像的最佳方式,这就是它们在计算机视觉系统中如此广泛使用的原因。当然,目标是再次使用 GPU 和 OpenCL,因为 ConvNets 比普通的全连接网络需要更多的计算资源和内存。

让我们开始吧。首先,我们必须记住,CovNets 的简单形式由卷积层、池化层和全连接层组成。幸运的是,我们已经实现了最后一个。所以剩下的就是前两个。

卷积层

这次我不会详细介绍 C++ 部分以及我们将如何构建我们的 ConvNet 的基本结构(我在第一部分为完全连接层做了这个),但我会深入研究内核代码,我认为这是最有趣的。在这些层中,我们将输入图像与小尺寸内核进行卷积,并获得特征图。

完全连接层
kernel void convolve(global float *image, global Filter* filters, global float * featMap,int filterWidth,int inWidth,int featmapdim){ const int xIn=get_global_id(0); const int yIn=get_global_id(1); const int z=get_global_id(2); float sum=0;对于 (int r=0;r
 kernel void convolve(global float *image, global Filter* filters, global float * featMap,int filterWidth,int inWidth,int featmapdim){ 
 kernel 
 void 
 convolve 
 ( 
 global 
 float 
 * 
 image 
 , 
 global Filter 
 * 
 filters 
 , 
 global 
 float 
 *   featMap   ,   int   filterWidth   ,   int   inWidth   ,   int   featmapdim   )   {   const int x In=get_global_id(0);   const   int   xIn   =   get_global_id   (   0   )   ; 
 const int yIn=get_global_id(1); 
 const 
 =

kernel void convolve(global float *image, global Filter* filters, global float * featMap,int filterWidth,int inWidth,int featmapdim){

kernel void convolve ( global float * image , global Filter * filters , global float * featMap , int filterWidth , int inWidth , int featmapdim ) {

const int x In=get_global_id(0);

const int xIn = get_global_id ( 0 ) ;

const int yIn=get_global_id(1);

const =