前言
我在写CupCnn的时候,一个困扰我很久的问题,就是如何组织卷积神经网络的数据结构。尤其是卷积层和全连接层之间的衔接问题。卷积层至少需要四维的数据结构(batch+channel+height+width),而全连接层则只需一个二维的数据即可(batch+数据)。
CupCnn是我用java实现的一个卷积神经网络,它的源码可以从github下载:
点击下载CupCnn
卷积神经网络模型
这张图片是一个很典型的卷积神经网络模型,在CupCnn中识别手写数字的例子中使用的模型和它非常类似。从图中可以看出,卷积层和全连接层有很大的不同,全连接层用一维数组就可以表示(加上batch就是二维),而卷积层的数据则至少需要一个三维的数据结构(加上batch就是四维,batch是指训练的时候,一次送入神经网络的图片的数量。)。同一个神经网络,使用统一的数据接口会使编程更加容易,因此,我们必须使用统一的四维模型来装载一切的数据。
在CupCnn中,这个数据接口叫Blob,它的实现如下:
public class Blob implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private double[] data;
private int numbers;
private int channels;
private int width;
private int height;
private int id;
public Blob(int numbers,int channels,int height,int width){
this.numbers = n