卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。与普通神经网络非常相似,它们都由具有可学习的权重和偏置常量(biases)的神经元组成。每个神经元都接收一些输入,并做一些点积计算,输出是每个分类的分数,普通神经网络里的一些计算技巧到这里依旧适用。
卷积神经网络通常包含以下几种层:
卷积层(Convolutional layer),卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。
线性整流层(Rectified Linear Units layer, ReLU layer),这一层神经的活性化函数(Activation function)使用线性整流(Rectified Linear Units, ReLU)f(x)=max(0,x)。
池化层(Pooling layer),通常在卷积层之后会得到维度很大的特征,将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。
Drop out, 通常我们在训练Covnets时,会随机的丢弃一部分训练获得的参数,这样可以在一定程度上来防止过度拟合
全连接层( Fully-Connected layer), 把所有局部特征结合变成全局特征,用来计算最后每一类的得分。
下面是代码部分,今天我将使用Covnets去完成一件非常非常简单的图像分类任务。这里我们将对 CIFAR-10 数据集 中的图片进行分类。该数据集包含飞机、猫狗和其他物体。
首先,我们先获得数据集 (或者直接从 https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz )这里直接下载
1 from urllib.request importurlretrieve2 from os.path importisfile, isdir3 from tqdm importtqdm4 importtarfile5
6 cifar10_dataset_folder_path = 'cifar-10-batches-py'
7
8 classDLProgress(tqdm):9 last_block =010
11 def hook(self, block_num=1, block_size=1, total_size=None):12 self.total =total_size13 self.update((block_num - self.last_block) *block_size)14 self.last_block =block_num15
16 if notisfile(tar_gz_path):17 with DLProgress(unit='B', unit_scale=True, miniters=1, desc='CIFAR-10 Dataset') as pbar:18 urlretrieve(19 'https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz',20 tar_gz_path,21 pbar.hook)22
23 if notisdir(cifar10_dataset_folder_path):24 with tarfile.open(tar_gz_path) as tar:25 tar.extractall()26 tar.close()
在数据载入之后,我们需要对我们的图片预处理下,因为现在的像素点是0-255之间,我们需要把图片的像素点的值变成0-1之间,这样方便在后面的计算
1 defnormalize(x):2 """
3 Normalize a list of sample image data in the range of 0 to 14 : x: List of image data. The image shape is (32, 32, 3)5 : return: Numpy array of normalize data6 """
7 a =08 b = 1
9 grayscale_min =010 grayscale_max = 255
11 return a + (((x - grayscale_min) * (b - a))/(grayscale_max - grayscale_min))
因为CIFAR数据集里面有10类不同的图片,现在我们需要使用ONE-HOT的方法来