上个月发布了四篇文章,主要讲了深度学习中的“hello world”----mnist图像识别,以及卷积神经网络的原理详解,包括基本原理、自己手写CNN和paddlepaddle的源码解析。这篇主要跟大家讲讲如何用PaddlePaddle和Tensorflow做图像分类。
在卷积神经网络中,有五大经典模型,分别是:LeNet-5,AlexNet,GoogleNet,Vgg和ResNet。本文首先自己设计一个小型CNN网络结构来对图像进行分类,再了解一下LeNet-5网络结构对图像做分类,并用比较流行的Tensorflow框架和百度的PaddlePaddle实现LeNet-5网络结构,并对结果对比。
什么是图像分类
图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在很多领域有广泛应用,包括安防领域的人脸识别和智能视频分析等,交通领域的交通场景识别,互联网领域基于内容的图像检索和相册自动归类,医学领域的图像识别等(引用自官网)
cifar-10数据集
CIFAR-10分类问题是机器学习领域的一个通用基准,由60000张32*32的RGB彩色图片构成,共10个分类。50000张用于训练集,10000张用于测试集。其问题是将32X32像素的RGB图像分类成10种类别:飞机,手机,鸟,猫,鹿,狗,青蛙,马,船和卡车。更多信息可以参考CIFAR-10和Alex Krizhevsky的演讲报告。常见的还有cifar-100,分类物体达到100类,以及ILSVRC比赛的100类。
自己设计CNN
了解CNN的基本网络结构后,首先自己设计一个简单的CNN网络结构对cifar-10数据进行分类。
网络结构
代码实现
1.网络结构:simple_cnn.py
1 #coding:utf-8 2 ''' 3 Created by huxiaoman 2017.11.27 4 simple_cnn.py:自己设计的一个简单的cnn网络结构 5 ''' 6 7 import os 8 from PIL import Image 9 import numpy as np 10 import paddle.v2 as paddle 11 from paddle.trainer_config_helpers import * 12 13 with_gpu = os.getenv('WITH_GPU', '0') != '1' 14 15 def simple_cnn(img): 16 conv_pool_1 = paddle.networks.simple_img_conv_pool( 17 input=img, 18 filter_size=5, 19 num_filters=20, 20 num_channel=3, 21 pool_size=2, 22 pool_stride=2, 23 act=paddle.activation.Relu()) 24 conv_pool_2 = paddle.networks.simple_img_conv_pool( 25 input=conv_pool_1, 26 filter_size=5, 27 num_filters=50, 28 num_channel=20, 29 pool_size=2, 30 pool_stride=2, 31 act=paddle.activation.Relu()) 32 fc = paddle.layer.fc( 33 input=conv_pool_2, size=512, act=paddle.activation.Softmax())