使用Keras做猫狗分类

本文介绍一个图像分类问题,目标是得到输入图像的类别。使用的方法是训练卷积神经网络,数据集包括上千张猫和狗的图像。
使用的框架是Keras库,数据集下载:这里写链接内容
1下载test_set 和training_set,其中有10000张图片。在training_set中包含两个子文件夹cats 和dogs, 每个都有8000张图片关于对应类别。在test_set文件夹中包含两个子文件夹cats和dogs,每个包含2000张图片。
2 建立卷积神经网络主要包含4步
* 卷积
* 池化
* 扁平化
* 全连接

3 建立cnn.py文件
导入库:

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
第一行导入Sequential来初始化网络模型作为一个序列化网络。一般有两种基本方法去初始化网络,要么是各种层的序列,要么是用图的方式。
第二行 引入Conv2D来完成卷积操作。我们这里使用的图像基本是2维数组,所以使用Conv2D,当处理视频文件时要使用Conv3D,第三维是时间。
第三行 引入MaxPooling2D用作池化操作。使用最大池化来保留感兴趣区域中的最大像素值。还有其他池化操作例如MinPooling, MeanPooling.
第四行引入扁平操作,用来转化所有2维数组到单个长的连续线性向量。
第五行引入Dense层,用来完成网络的全连接。

现在创建一个序列的object:

classifier = Sequential()
增加第一个卷积操作:
classifier.add(Conv2D(32, (3,3), input_shape=(64,64,3), activation = ‘relu’))
网络序列化的意思是我们可以通过add增加每一层到classifier上。Conv2D函数包含4个参数,第一个是卷积核的个数也就是32, 第二个参数时卷积核的大小也就是(3,3),第三个参数是输入大小和图像类型(RGB还是黑白图)这里表示卷积网络输入(64,64)分辨率的图像,3表示RGB图像。第四个参数为使用的激活函数。
接下来需要完成池化操作在相关特征图(由卷积操作之后产生的32个feature maps)上。池化操作主要意图是减少图像大小。关键就是我们试图为下一层减少总共的节点数。
classifier.add(MaxPooling2D(pool_size = (2,2)))
我们使用2*2矩阵,最小化像素损失并得到特征定位的精确区域。我们在不损失精度时减少模型复杂度。
接下来转化所有池化后图像到一个连续向量通过Flattening函数,将2维矩阵转化到一维向量。
classifier.add(Flatten())
然后创建全连接层。扁平后的节点将作为输入连接到全连接层。
classifier.add(Dense(units = 128, activation=’relu’))
Dense函数创建一个全连接层,”units”表示该层中定义的节点数,这些单元值一般在输入节点数和输出节点数之间,但只能通过实验来试出最好的值。
最后初始化输出层,其只包含一个节点,对于二元分类来说。
classifier.add(Dense(units=1, activation=’sigmoid’))

现在完成了建立CNN模型,需要编译它

classifier.compile(optimizer = ‘adam’, loss=’binary_crossentropy’, metrics=[‘accuracy’])

4在训练数据之前,需要预处理图像防止过拟合。首先在数据集上做数据增强image augmentations. 使用keras.preprocessing 库来合成部分去准备训练集和测试集,字典的名称为所有图像呈现的类别。

train_dategen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range = 0.2, horizontal_filp = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set= train_datagen.flow_from_directory(‘training_set’, target_size=(64, 64), batch_size=32, class_mode=’binary’)
test_set=test_datagen.flow_from_directory(‘test_set’, target_size=(64, 64), batch_size=32, class_mode=’binary’)

上面所有操作是为了创造合成数据通过利用不同类型操作例如旋转,模糊,裁剪等等。

下面使用数据去拟合模型

classifier.fit_generator(training_set, steps_per_epoch =8000, epochs = 25, validation_data =test_set, validation_steps = 2000)
其中steps_per_epoch表示训练样本个数,就是training_set文件夹中包含的图片数,单个epoch表示训练一个神经网络。换句话说一张图片只在一个epoch中输入到网络中一次。

5 预测

import numpy as np
from keras.preprocessing import image
test_image = image.load_img(‘datasets/cat_or_dog_1.jpg’, target_size = (64, 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis=0)
result = classifier.predict(test_image)
training_set.class_indices
if result[0][0] == 1:
prediction = ‘dog’
else:
prediction =’cat’
在测试时图像需要转化分辨率到64*64,然后使用predict()方法得到预测。
原文:https://github.com/venkateshtata/cnn_medium

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值