CNN实战分类猫与狗图片
目录
一、图片预处理
二、模型的构建与训练
一、图片预处理
因为数据集图片尺寸不一致,所以需要对图片进行预处理,试图片的长宽一致,如大小为200x200、150x150、100x100等。首先,加载图片预处理过程中需要的依赖库,包括对数组进行处理的Numpy库、用于对硬盘中文件进行处理的os库还有图片处理的cv2库。分别指定数据集在银盘中的储存位置、存储每一类图片数据的文件夹名称、图片处理过后的尺寸。
ps:没有下载库的同学:pip install opencv-python
pip install Numpy
import numpy as np
import os
import cv2
#数据集在硬盘中的存储位置
dataset_path = 'D:\image'
#存储猫与狗图片的文件夹名称分别称为cat与dog
categories = ['cat','dog']
图片经过处理后的尺寸
img_size = 100
定位到所有猫图片的文件夹,并指定猫图片标签为0。然后依次读取每一个文件夹中每一张猫的图片,最后将处理后的猫图片与对应的标签储存到一个新的数组中。同理,对狗也一样,标签定为1。
dataset = []
for category in categories:#依次获取猫或狗图片所在的文件夹folder_path = os.path.join(dataset_path,category)#将猫的图片标签设置为0,狗的图片设置为1class_num = categories.index(category)#获取文件夹中全部图片的名字,以列表的形式返回img_names = os.listdir(folder_path)#依次读取文件夹中的每一张图片,并对其进行处理for img_name in img_names:try:#将文件夹路径与图片名称进行拼接获取完整的图片路径img_path = os.path.join(folder_path,img_name)#读取图片img = cv2.imread(img_path,cv2.IMREAD_COLOR)#将图片的尺寸转换为100x100x3img = cv2.resize(img,(img_size,img_size))#将处理好的图片与对应标签存储在数据集中dataset.append((img,class_num))except Exception:pass
打乱数据集中的猫狗顺序
import random
random.shaffle(dataset)
最后,将数据集
#X储存处理好的图片,y储存图片对应的标签值
X=[]
y=[]
for img,label in dataset:X.append(img)y.append(label)
X = np.array(X).reshape(-1,img_size,img_size,3)
y = np.array(y)
np.save('X_cat_and_dog.npy')
np.save('y_cat_and_dog.npy')
中的图片与标签值分开,分别储存在x与y列表中。
二、模型的构建与训练
使用NumPy库中的load函数来读取使用save函数中储存的数据。使用sklearn模块中提供的train_test_split方法把数据集分成75%的训练集和25%的测试集。
from sklearn.model_selection import train_test_split
X = np.load('X_cat_and_dog.npy')
#图片像素的归一化
X = X/255.0
y = np.load('y_cat_and_dog.npy')
#将数据集划分
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25)
构建模型:模型需要卷积层,最大池化层,扁平化层,全连接层,防止过拟合的Dropout,优化算法Adam。
首先使用卷积层,然后连接池化层,为了避免过拟合在每个池化层后面加入Dropout。在第一个卷积层中使用32个卷积核,并将卷积核尺寸指定为3x3,这样就会得到32个尺寸为98x98的特征图。在这个卷积层中指定激活函数为reLu,在最大池化层中指定滑动窗口尺寸为2x2,因此在卷积层中得到的32个尺寸为98x98的特征图经池化层处理后,变为32个尺寸为49x49的特征图。接下来,应用Dropout,并指定概率为0.2,这样的模型在每次训练时,都会有20%的单元被随机去除掉。最后连接扁平化层,并将扁平化层处理过后的数据连接到只有一个256个单元的隐藏层的全连接神经网络。
from keras.models import Sequential
from keras.layers import Conv2D,MaxPooling2D,Flatten,Dense,Dropout
from keras.optimizers import adam_v2
model = Sequential()
#第一个卷积层与第一个池化层
model.add(Conv2D(input_shape = X.shape[1:],filters=32,kernel_size=(3,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
#第二个卷积层与第二个池化层
model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
#第三个卷积层与第三个池化层
model.add(Conv2D(filters=128,kernel_size=(3,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
#第四个卷积层与第四个池化层
model.add(Conv2D(filters=128,kernel_size=(3,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
#扁平化层
model.add(Flatten())
#全连接神经网络
model.add(Dense(256))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
为了防止过拟合,在训练中可以使用早停法(根据模型在验证集上的损失值来判断何时停止模型的训练),这里将patience参数值定为5,也就是说5次训练后,验证集上的损失值没有减小,则停止模型的训练。
from keras.callbacks import EarlyStopping
monitor = EarlyStopping(monitor = 'val_loss',patience=5,mode='auto',restore_best_weights=True)
将模型进行编译,因为是二分类任务,所以使用的损失函数为二元交叉熵,并指定Adam梯度下降优化算法来更新模型参数。
model.compile(loss='binary_crossentropy',optimizer=adam_v2.Adam(),metrics=['accuracy'])
model.fit(X_train,y_train,epochs=50,batch_size=64,verbose=2,callbacks=[monitor],validation_split=0.2)
model.save('fei_model2.h5')
CNN实战分类猫与狗图片相关推荐
- 卷积神经网络处理猫和狗图片(改进网络)
卷积神经网络处理猫和狗图片(改进网络) 摘要:上一篇文章<卷积神经网络处理猫和狗图片>中,训练精度随着时间线性增加,直接接近100%,而验证精度则停留在70-72%,从上一篇文章可以看出图 ...
- 卷积神经网络处理猫和狗图片
卷积神经网络处理猫和狗图片 1.将图像复制到训练.验证和测试的目录 import os, shutil #复制文件 # 原始目录所在的路径 # 数据集未压缩 original_dataset_dir ...
- 使用卷积神经网络(普通CNN和改进型LeNet)以及数据增强和迁移学习技巧识别猫和狗,并制作成分类器软件(基于Keras)
数据集:https://www.microsoft.com/en-us/download/confirmation.aspx?id=54765 猫和狗的图片各自有12500张. 第一步 整理数据集,查 ...
- 怎样教一台计算机区分猫和狗?一文零基础入坑机器学习
导读:机器学习是一个快速发展的研究领域,主要关注设计和分析能让计算机学习的算法.作为一门新兴学科,尽管有待发掘的知识比已经掌握的知识要多得多,但当前的机器学习方法已经被用于教计算机执行各种各样有用的任 ...
- 计算机基础猫狗,怎样教一台计算机区分猫和狗?一文零基础入坑机器学习
01 教计算机区分猫和狗 在教孩子区分"猫"和"狗"时,几乎所有父母都不会告诉孩子某种形式的科学定义(例如,狗属于哺乳动物这个大类中犬科的一员,而猫属于相同大类 ...
- Top2:CNN 卷积神经网络实现猫狗图片识别二分类
Top2:CNN 卷积神经网络实现猫狗图片识别二分类 系统:Windows10 Professional 环境:python=3.6 tensorflow-gpu=1.14 ```python &qu ...
- CNN简单实战:PyTorch搭建CNN对猫狗图片进行分类
在上一篇文章:CNN训练前的准备:PyTorch处理自己的图像数据(Dataset和Dataloader),大致介绍了怎么利用pytorch把猫狗图片处理成CNN需要的数据,今天就用该数据对自己定义的 ...
- 11.CNN实现真实猫狗图片分类
CNN实现真实猫狗图片分类 个人认为,和上一节的mnist数据集里面的手写数字图片不同之处就是,真实的图片更加复杂,像素点更多.因此在对应的图片预处理方面会稍微麻烦一些.但是这个例子能让我们可以处理自 ...
- 【Keras】 计算机视觉 CNN 实现猫狗图片分类
目录 综述 图像预览 数据预处理 验证集 模型训练 训练结果 综述 本项目旨在通过一个公开数据集,训练一个可以将图片中的猫和狗进行分类的模型. 数据集包括25,000 张训练数据.其中猫和狗的照片各 ...
最新文章
- 基于开源TiRG的文本检测与提取实现
- PHP数据结构算法实例
- 序列化技术的选型-选型建议
- 关于计算性能的若干重要事实
- 2.6.29的一个节省内存的补丁
- vue 自定义键盘组件_vue 自定义 数字键盘+mint UI MessageBox的应用
- 利用云服务器搭建内网映射服务器
- 《深入解析windows操作系统第6版下册》第10章:内存管理(第三部分译文与图片)...
- 电脑保护眼睛的颜色设置
- 中点圆c语言程序,[图形学] 画圆(基于中点算法)
- 新手小心:c语言的强符号和弱符号
- 知乎 量子计算机 未来,知乎打脸媒体“无脑吹”昆仑量子计算模拟机
- 常见自动化测试工具,你用过哪些?
- 南京技师学院计算机系,江苏南京技师学院
- 使用MFC实现将图像的RGB值转换到HSV空间,同时进行调节HSV,再将调节后的HSV值传进去转换到RGB空间实现图像在HSV空间中的色度、饱和度、亮度的调节
- iOS中的时间和日期
- Vue基础之指令与过滤器
- 手机GPU性能评估指标
- html直角三角形怎么实现,CSS绘制三角形的实现代码(border法)
- Windows域控管理—如何使用powershell远程连接服务器