CNN实现猫狗识别(Tensorflow版本)

前言

对于计算机视觉方面的各种研究,目前都是以神经网络为基础,并且目前主流的在图像识别方面运用最多的就是基于**CNN(卷积神经网络)**的各种神经网络。本文就以CNN为基础对Kaggle经典的猫狗识别数据集进行分类。

本次采用最简单的CNN模型为例子,网络主要将构造两个卷积层和一个全连接层对猫狗数据集进行分类,后续将运用更加复杂的预训练模型进行训练,从而对比不同复杂程度的神经网络的预测效果。

数据预处理

图片展示
狗:
在这里插入图片描述
猫:
在这里插入图片描述
在图像识别中,我们可以对图片进行各种预处理,比如转换图片的裁剪,放缩,平移,旋转等等各种操作,这些统称为数据增强,利用有限的数据集构建出具有不同风格的庞大数据集。这里我就采用最简单的方式进行数据增强,运用keras库自带的ImageDataGenerator函数进行初步的数据增强,代码如下:(注意:这里的验证集是从训练集中分出来的,原始训练集是25000条数据,这里划分为训练集20000条,验证集5000条作为模型验证评估)

from tensorflow.keras.preprocessing.image import *
# 训练样本目录和验证样本目录
train_dir = 'train'#训练集20000条
validation_dir = 'validation'#验证集5000条
# 对训练图像进行数据增强
train_datagen = ImageDataGenerator(rescale = 1./255, #数据归一化
                                   rotation_range=30, #图片随机旋转的最大角度
                                   width_shift_range=0.2, #图片在水平位置上平移的最大百分比值
                                   height_shift_range=0.2, #图片在竖直位置上平移的最大百分比值
                                   shear_range=0.2, #随机错位切换的角度
                                   zoom_range = 0.2, #图片随机缩放的范围
                                   horizontal_flip = True) #随机将一半的图片进行水平翻转
# 对验证图像只将图片归一化,不进行增强变换
validation_datagen = ImageDataGenerator(rescale = 1./255)
# 利用flow_from_directory 函数生成训练数据
training_set = train_datagen.flow_from_directory(train_dir, # 训练集文件夹路径
                                                 target_size = (100, 100), # 每张图片的size
                                                 batch_size = 16, # 每个batch的大小
                                                 class_mode = 'categorical', # 标签的类型
                                                 shuffle=True) # 是否打乱
# 利用flow_from_directory 函数生成验证数据
validation_set = validation_datagen.flow_from_directory(validation_dir,
                                            	  target_size = (100, 100),
                                            	  batch_size = 16,
                                            	  class_mode = 'categorical',
                                            	  shuffle = False)

以上是对图片进行增强,当然也可以不进行增强处理,可以自由决定,比如我觉得本次猫狗识别数据集在进行数据增强后效果还没有以前好,所以这个都是看自身效果。

网络构建

CNN的网络结构包括输入层,中间的卷积层(这里包含有两个卷积层,每个卷积层后接池化层),在卷积层完成后接入全连接层,最后根据输出的要求接入输出层。其实也可以自己构建更加复杂的结构,中间层再多加几层,神经元的个数也可以自己设定,效果都会不一样,这里就构建两层中间层举个例子:

from tensorflow.keras.layers import *
from tensorflow.keras.models import *
import numpy as np
#CNN
# 初始化模型
model = Sequential()
# 卷积层
model.add(Conv2D(16, (3, 3), # 16个卷积核,卷积核大小为(3,3)
                 input_shape=(100,100,3), # 输入图像大小
                 activation='relu')) # 激活函数选取relu  
# 池化层
model.add(MaxPool2D(pool_size=(2, 2))) # 池化大小
# 卷积层
model.add(Conv2D(16, (3, 3), activation='relu')) 
# 池化层
model.add(MaxPool2D(pool_size=(2, 2)))  
#Flatten 
model.add(Flatten()) # 为全连接层做准备,拉成一维数据
# 全连接层
model.add(Dense(units=128, activation='relu')) 
# 输出层
model.add(Dense(len(training_set.class_indices), activation='softmax'))
#编译模型
model.compile(optimizer=Adam(learning_rate=0.001), 
              loss='categorical_crossentropy', 
              metrics=['accuracy'])#设置损失函数,优化器,模型在训练和测试时的性能指标
# 最后打印网络结构
model.summary()

在这里插入图片描述
网络打印出来的结构如上图,可以看到网络一共有一百多万的权重参数,这只是几个隐藏层的简单情况下,所以神经网络的强大就再于其复杂的结构和参数。

模型训练

编译过后,最后就是进行模型的训练,训练过程中会显示训练集的训练损失和训练精度,同时也会有验证集的损失和精度,代码如下:

# 训练模型
model.fit_generator(training_set, # 训练集
                    validation_data=validation_set , # 验证集
                    epochs=8) # 10个epoch
model.save('CNN.h5')	#保存模型(.h5文件格式)

在这里插入图片描述
上面就是训练过程,可以看到在8个epoch的情况下模型在验证集上的准确率可以达到**75%-80%**左右,而且可以继续提高。

写在最后

CNN在图像识别中的地位毋庸置疑,而且CNN还有很多变种,在计算机视觉领域表现突出,后面就介绍其中的深度残差神经网络ResNet50,并且比较它在猫狗识别这个数据集的表现效果。本人才疏学浅,如果有错误或者理解不到位的地方请指正!

完整代码详见:https://github.com/CquptDJ/CquptDJ.git

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值