kaggle猫狗分类

本文介绍使用CNN卷积神经网络完成猫狗图像识别,数据集来源于kaggle:[猫狗分类数据集]。主要包括以下三部分:

  • 数据创建与预处理
  • 神经网络模型搭建
  • 数据增强实现减小正则化

数据处理

数据集包含25000张图片,猫和狗各有12500张;创建每个类别1000个样本的训练集、500个样本的验证集和500个样本的测试集(只使用部分数据进行建模)

import os
import shutilcurrent_dir = %pwd
current_dir #当前目录
base_dir = current_dir + '/cats_dogs_small'
os.mkdir(base_dir)#建立本次数据文件夹
train_dir = os.path.join(base_dir,'train')
os.mkdir(train_dir)#创建训练集val_dir = os.path.join(base_dir,'val')
os.mkdir(val_dir)#创建验证集test_dir = os.path.join(base_dir,'test')
os.mkdir(test_dir)#创建测试集
train_dir_cat = os.path.join(train_dir,'cat')
os.mkdir(train_dir_cat)#训练集猫train_dir_dog = os.path.join(train_dir,'dog')
os.makedirs(train_dir_dog)#训练集狗val_dir_cat = os.path.join(val_dir,'cat')
os.mkdir(val_dir_cat)#验证集猫val_dir_dog = os.path.join(val_dir,'dog')
os.mkdir(val_dir_dog)#验证集狗test_dir_cat = os.path.join(test_dir,'cat')
os.mkdir(test_dir_cat)#测试集猫test_dir_dog = os.path.join(test_dir,'dog')
os.mkdir(test_dir_dog)#测试集狗

将原有数据复制进创建好的文件中

fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]for name in fnames:src = os.path.join('../猫狗/cats_dogs/',name)dst = os.path.join(train_dir_cat,name)shutil.copyfile(src,dst) #复制文件内容fnames = ['dog.{}.jpg'.format(i) for i in range(1000)]for name in fnames:src = os.path.join('../猫狗/cats_dogs/',name)dst = os.path.join(train_dir_dog,name)shutil.copyfile(src,dst) #复制文件内容fnames = ['cat.{}.jpg'.format(i) for i in range(1000,1500)]for name in fnames:src = os.path.join('../猫狗/cats_dogs/',name)dst = os.path.join(val_dir_cat,name)shutil.copyfile(src,dst) #复制文件内容fnames = ['cat.{}.jpg'.format(i) for i in range(1000,1500)]for name in fnames:src = os.path.join('../猫狗/cats_dogs/',name)dst = os.path.join(test_dir_cat,name)shutil.copyfile(src,dst) #复制文件内容fnames = ['dog.{}.jpg'.format(i) for i in range(1500,2000)]for name in fnames:src = os.path.join('../猫狗/cats_dogs/',name)dst = os.path.join(val_dir_dog,name)shutil.copyfile(src,dst) #复制文件内容fnames = ['dog.{}.jpg'.format(i) for i in range(1500,2000)]for name in fnames:src = os.path.join('../猫狗/cats_dogs/',name)dst = os.path.join(test_dir_dog,name)shutil.copyfile(src,dst) #复制文件内容

显示图片内容

from PIL import Imagepath = os.path.join('../猫狗/cats_dogs_small/train/cat/cat.0.jpg')
Image.open(path)

或者

import matplotlib.pyplot as plt
path = os.path.join('../猫狗/cats_dogs_small/train/cat/cat.0.jpg')
img = plt.imread(path)
plt.imshow(img)

在这里插入图片描述

img.shape #打印图片大小:(374, 500, 3)

搭建神经网路

#导入需要的包
import tensorflow as tf
from keras import layers
from keras import models
#构建网络
model = models.Sequential()model.add(tf.keras.layers.Conv2D(32,(3,3),activation='relu',input_shape=(150,150,3))) #输入图片大小为(150,150,3)
model.add(tf.keras.layers.MaxPooling2D((2,2)))model.add(tf.keras.layers.Conv2D(64,(3,3),activation='relu'))
model.add(tf.keras.layers.MaxPooling2D((2,2)))model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(2,2))model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(2,2))model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(512,activation='relu'))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))model.summary()#打印网络结构

网络网络结构以及参数量

模型编译

from tensorflow.keras import optimizersmodel.compile(loss="binary_crossentropy",optimizer = optimizers.RMSprop(learning_rate=1e-4),metrics=['acc'])
#损失函数交叉熵损失函数,优化方法RMSprop,评价指标acc

数据预处理

数据输入到神经网络之前必须先转成浮点数张量。

keras有个处理图像的模块:keras.preprocessing.image
它包含ImageDataGenerator类,可以快速创建Python生成器,将图形文件处理成张量批量

from keras.preprocessing.image import ImageDataGeneratortrain_datagen = ImageDataGenerator(rescale=1./255)#进行缩放
test_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory(train_dir,#训练集所在目录target_size=(150,150),#将图片转换为目标大小batch_size=20,#每一批的数量class_mode='binary' # 损失函数是binary_crossentropy 所以使用二进制标签)valid_generator = test_datagen.flow_from_directory(val_dir,target_size=(150,150),batch_size=20,class_mode = 'binary'
)
for data_batch,labels_batch in train_genertor:print(data_batch.shape)print(labels_batch.shape)break(20, 150, 150, 3)
(20,)

生成器的输出是150-150的RGB图像和二进制标签,形状为(20,)组成的批量。每个批量包含20个样本(批量的大小)。

生成器会不断地生成这些批量,不断地循环目标文件夹中的图像。

keras模型使用fit_generator方法来拟合生成器的效果。模型有个参数steps_per_epoch参数:从生成器中抽取steps_per_epoch个批量后,拟合进入下一轮。

本例中:总共是2000个样本,每个批量是20个样本,所以需要100个批量

模型拟合

history = model.fit_generator(train_generator,#第一个参数必须是python生成器steps_per_epoch=100,#批量数epochs = 30,#迭代次数validation_data = valid_generator,#待验证的数据集validation_steps = 50
)

保存模型

model.save("cats_and_dogs_small.h5")

损失和精度曲线

import matplotlib.pyplot as plthistory_dict = history.history  # 字典形式
for key, _ in history_dict.items():print(key)
#history.history保存以下四个参数
loss
acc
val_loss
val_acc
acc = history_dict["acc"]
val_acc = history_dict["val_acc"]loss = history_dict["loss"]
val_loss = history_dict["val_loss"]
epochs = range(1, len(acc)+1)# acc
plt.plot(epochs, acc, "bo", label="Training acc")
plt.plot(epochs, val_acc, "b", label="Validation acc")
plt.title("Training and Validation acc")
plt.legend()plt.figure()# loss
plt.plot(epochs, loss, "bo", label="Training loss")
plt.plot(epochs, val_loss, "b", label="Validation loss")
plt.title("Training and Validation loss")
plt.legend()

上传训练集和验证集的时候搞错了,,,出现了如下bug
在这里插入图片描述
在这里插入图片描述
小结:得到过拟合的结论

随着时间的增加,训练精度在不断增加,接近100%,而验证精度则停留在70%
验证的损失差不多在第6轮后达到最小值,后面一定轮数内保持不变,训练的损失一直下降,直接接近0

数据增强

数据增强也是解决过拟合的一种方法,另外两种是:

  • dropout
  • 权重衰减正则化

什么是数据增强:从现有的训练样本中生成更多的训练数据,利用多种能够生成可信图像的随机变化来增加数据样本。

模型在训练时候不会查看两个完全相同的图像

设置数据增强

datagen = ImageDataGenerator(rotation_range=40,  # 0-180的角度值width_shift_range=0.2,  # 水平和垂直方向的范围;相对于总宽度或者高度的比例height_shift_range=0.2,shear_range=0.2,  # 随机错切变换的角度zoom_range=0.2,  # 图像随机缩放的角度horizontal_flip=True,  # 随机将一半图像进行水平翻转fill_mode="nearest"  # 用于填充新创建像素的方法
)

显示增强后图像

from keras.preprocessing import imagefnames = [os.path.join(train_dir_cat,fname) for fname in os.listdir(train_dir_cat)]img_path = fnames[3]img_path #打印图形路径img = image.load_img(img_path,target_size=(150,150))x = image.img_to_array(img)x.shape	#(150,150,3)x = x.reshape((1,) + x.shape)x.shape  #(1,150,150,3)i = 0
for batch in datagen.flow(x, batch_size=1):  # 生成随机变换后的图像批量plt.figure()   imgplot = plt.imshow(image.array_to_img(batch[0]))i += 1if i % 4 == 0:break  # 循环是无限,需要在某个时刻终止plt.show()

在这里插入图片描述
在这里插入图片描述

包含Dropout层的新卷积神经网络
数据增强来训练网络的话,网络不会看到两次相同的输入。但是输入仍是高度相关的,不能完全消除过拟合。

可以考虑添加一个Dropout层,添加到密集分类连接器之前

model = models.Sequential()model.add(tf.keras.layers.Conv2D(32,(3,3),activation='relu',input_shape=(150,150,3)))
model.add(tf.keras.layers.MaxPooling2D((2,2)))model.add(tf.keras.layers.Conv2D(64,(3,3),activation='relu'))
model.add(tf.keras.layers.MaxPooling2D((2,2)))model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(2,2))model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(2,2))model.add(tf.keras.layers.Flatten())model.add(tf.keras.layers.Dropout(0.5))#新加的dropout层model.add(tf.keras.layers.Dense(512,activation='relu'))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))model.summary()

在这里插入图片描述
再次训练

# 训练数据的增强
train_datagen = ImageDataGenerator(rescale=1. / 255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True
)# 不能增强验证数据
test_datagen = ImageDataGenerator(rescale=1.0 / 255)train_generator = train_datagen.flow_from_directory(train_dir,  # 目标目录target_size=(150,150),  # 大小调整batch_size=32,class_mode="binary"
)validation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150,150),batch_size=32,class_mode="binary"
)# 优化:报错有修改
history = model.fit_generator(train_generator,# 原文 steps_per_epoch=100,steps_per_epoch=63,  # steps_per_epoch=2000/32≈63 取上限epochs=100,validation_data=validation_generator,# 原文 validation_steps=50validation_steps=32  # validation_steps=1000/32≈32
)

模型保存

model.save("cats_and_dogs_small_2.h5")

损失和精度曲线

history_dict = history.history  # 字典形式acc = history_dict["acc"]
val_acc = history_dict["val_acc"]
loss = history_dict["loss"]
val_loss = history_dict["val_loss"]

具体绘图代码

epochs = range(1, len(acc)+1)# acc
plt.plot(epochs, acc, "bo", label="Training acc")
plt.plot(epochs, val_acc, "b", label="Validation acc")
plt.title("Training and Validation acc")
plt.legend()plt.figure()# loss
plt.plot(epochs, loss, "bo", label="Training loss")
plt.plot(epochs, val_loss, "b", label="Validation loss")
plt.title("Training and Validation loss")
plt.legend()plt.show()

结论:在使用了数据增强之后,模型不再拟合,训练集曲线紧跟着验证曲线;而且精度也变为81%,相比未正则之前得到了提高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/43259.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CNN实现猫狗分类

一、实验原理 模型的输入数据是包含猫狗信息的RGB图像,将其输入到网络模型中,经过模型的前向计算得到输出的二分类结果,通过损失函数度量计算输出结果与输入图像标签的差异度,并通过反向传播算法根据这个差异来调整网络各层的参数…

猫舍内网靶场

文章目录 内网渗透我们首先先讲一下,如何去利用sql注入漏洞url编码就是16进制提权 下面是详细的提权过程最后讲一个工具猕猴桃mimikatz 内网渗透 我们首先先讲一下,如何去利用sql注入漏洞 先讲两个导出文件的函数 into dumpfile C:\\phpstudy\\WWW\\1…

手工注入(猫舍为例)

第一步,判断是否存在sql注入漏洞 ?id1 and 11(and 11 可以去掉) ?id1 and 12 第二步:判断字段数 ?id1 and 11 order by 1 ?id1 and 11 order by 2 ?id1 and 11 order by 3 第三步:判断回显点 ?id1 and 12 union select 1,2 第四步:查询相关…

猫狗分类-简单CNN

文章 1.导入第三方库2.定义模型3.训练数据和测试数据生成4.训练模型 猫狗分类的数据集可以查看图像数据预处理。 代码运行平台为jupyter-notebook,文章中的代码块,也是按照jupyter-notebook中的划分顺序进行书写的,运行文章代码,直…

基于卷积神经网络VGG的猫狗识别

!有需要本项目的实验源码的可以私信博主! 摘要:随着大数据时代的到来,深度学习、数据挖掘、图像处理等已经成为了一个热门研究方向。深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远…

宠物交易平台的设计

国内宠物行业的快速发展,人们为了能够更加方便地管理宠物交易,宠物交易平台被人们开发出来从而更好地方便管理宠物交易,一个完美的宠物交易平台已经成为各个宠物店的追求目标。 本系统利用SSM技术进行开发宠物交易平台是未来的趋势。该系统使…

深度学习实现猫狗分类

本文使用vgg网络实现对猫狗分类。 可以当做图像分类的一个baseline。 一、前期工作 数据:直接到kaggle上下载相应的数据集即可。 1.导入模块 # 数据import torchfrom torchvision.datasets import ImageFolderimport torch.utils.data as Datafrom torchvision impo…

深度学习--猫狗图像分类

1、环境介绍 python3.6,tensorflow1.4版本,pycharm编译器 2、函数库导入 import cv2 import matplotlib.pyplot as plt import os, PIL, pathlib import numpy as np from tensorflow.keras.layers import Conv2D,MaxPooling2D,Dropout,Dense,Flatten,A…

Kaggle-猫狗图像分类全流程实践(支持迁移学习和其他分类任务迁移)

1、insatll environment|安装环境 !pip install torchtoolbox !pip install torchsummary2、import package|导入三方库 # 基础库 import os import time import random import shutil import pandas as pd import csv from math import exp from PIL import Image import nu…

神经网络实战--使用迁移学习完成猫狗分类

前言: Hello大家好,我是Dream。 今天来学习一下如何使用基于tensorflow和keras的迁移学习完成猫狗分类,欢迎大家一起前来探讨学习~ 本文目录: 一、加载数据集1.调用库函数2.加载数据集3.数据集管理 二、猫狗数据集介绍1.猫狗数据集…

基于Pytorch的猫狗分类

无偿分享~ 猫狗二分类文件下载地址 在下一章说 猫狗分类这个真是困扰我好几天,找了好多资料都是以TensorFlow的猫狗分类,但我们要求的是以pytorch的猫狗分类。刚开始我找到了也运行成功了觉得可以了,最后看了一眼实践要求傻眼了,…

猫舍 靶场

目标url:http://117.41.229.122:8003/?id1 第一步,判断是否存在sql注入漏洞 构造 ?id1 and 11 ,回车 页面返回正常 构造 ?id1 and 12 ,回车 页面不正常,初步判断这里 可能 存在一个注入漏洞 第二步:判断字段数 构造 ?id1 and 11 order…

Olaparib 有望治疗 UBQLN4 过表达型肿瘤

基因组的不稳定性是人类遗传病和癌症的一大特点。在这篇文章当中,研究人员在常染色体隐性遗传病家族中发现了有害的 UBQLN4 突变。蛋白酶体穿梭因子UBQLN4 被 ATM 磷酸化并与泛素化的 MRE11 相互作用,从而介导早期的同源重组修复 (HRR)。在体外和体内实验…

神经内分泌肿瘤治疗新进展,神经内分泌肿瘤进展

脑肿瘤复发 。 颅内及椎管内肿瘤【概述】1.原发性肿瘤:起源于头颅、椎管内各种组织结构,如颅骨、脑膜、脑组织、颅神经、脑血管、脑垂体、松果体、脉络丛、颅内结缔组织、胚胎残余组织、脊膜、脊神经、脊髓、脊髓血管及脂肪组织等&#xff…

Nature Cancer | 发现非肿瘤药物的抗癌潜力

今天给大家介绍美国Broad Institute of MIT and Harvard的 Todd R. Golub团队发表在Nature cancer上的一篇文章:“Discovering the anticancer potential of nononcology drugs by systematic viability profiling“。在这个研究中,作者试图创建一个公共…

文献分享:定义的肿瘤抗原特异性T细胞增强了个性化的TCR-T细胞治疗和免疫治疗反应的预测

《Defifined tumor antigen-specifific T cells potentiate personalized TCR-T cell therapy and prediction of immunotherapy response》 简介 从患者体内自然发生的肿瘤抗原特异性T(Tas)细胞中提取的T细胞受体(TCRs)设计的T细胞将靶向其肿瘤中的个人TSAs。为了建立这种个性…

Irinotecan和vandetanib在治疗胰腺癌患者时产生协同效应(Irinotecan and vandetanib create synergies for t)

1. 摘要 背景:在胰腺癌(PAAD)中最常突变的基因对是KRAS和TP53,文章的目标是阐明KRAS/TP53突变的多组学和分子动力学图景,并为KRAS和TP53突变的PAAD患者获得有前景的新药物。此外,文章根据多组学数据尝试发现KRAS与TP53之间可能的联系。    …

癌症/肿瘤免疫治疗最新研究进展(2022年4月)

近年来,免疫治疗一直都是国内外肿瘤治疗研究领域的火爆热点,可以称之为革命性的突破。 除了大家熟知的PD-1/PD-L1已经先后斩获了包括肺癌、胃肠道肿瘤、乳腺癌、泌尿系统肿瘤、皮肤癌、淋巴瘤等在内的近20大实体肿瘤,成为免疫治疗的第一张王牌…

MCE | 癌症诊断和靶向治疗的“遍地开花”

据研究报道,很多癌细胞分泌的外泌体 (Exosome) 比正常细胞分泌的多 10 倍以上。外泌体参与了癌症的发生、进展、转移和耐药性,并通过转运蛋白和核酸,建立与肿瘤微环境的联系。例如,外泌体可导致免疫逃逸,癌细胞的免疫逃…

泛癌分析·找出各个癌症的预后相关基因

泛癌分析找出各个癌症的预后相关基因 ` 其他相关文章: 万物皆可pan分析高分文章登山梯for循环的熟练操作 前言 pan分析的第二篇我想写一下如何在TCGA整个基因集内实现COX单因素分析,将所有的预后相关基因筛选出来,同时得到这些基因的基本参数、统计量等信息。这样的分析的…