cats-and-dogs 猫狗识别,自己分割数据为训练集和测试集,并利用Tensorflow进行模型构建并预测自己准备的数据

发布时间:2024-01-10 13:04:39

注:本文应用Tensorflow2.9.1,python3.10

若原始数据集为dogs,和cats 两个文件夹,可进行自动划分数据集为训练集train_data(子文件cats,dogs),测试集test_data(子文件cats,dogs)

分割数据集用到的库shutil,random,os

--shutil:?模块提供了一系列对文件和文件集合的高阶操作。 特别是提供了一些支持文件拷贝和删除的函数。

--shutil.copyfile(src,dst)? 将源目录中的文件拷贝到路径dst下,dst?必须是完整的目标文件名,如果?dst?已经存在,它将被替换

--shutil.rmtree(path)? 删除指定的path目录

--os.mkdir(path)? 创建一个名为path的目录

--os.makedirs(path)? 递归创建目录path ,会自动创建到达最后一级的中间目录

--os.listdir(path)返回一个包含由?path?指定目录中条目名称组成的列表。 该列表按任意顺序排列,并且不包括特殊条目?'.'?和?'..'

random.sample(population,k)? 返回从总体序列或集合中选择的唯一元素的?k?长度列表。 用于无重复的随机抽样。

1 查看源数据,数据下载可参考【http://t.csdn.cn/8XWRZ】,若下载的数据已经被划分为训练集和测试集,想要自己划分的话可自己合并各个类别的所有数据然后自己划分。

? 查看cats 和dogs 分别有多少张图片

import os
print(len(os.listdir('E:/machine learning data/cats-dogs-images/cats'))) #查看cats数据一共有多少张图片
print(len(os.listdir('E:/machine learning data/cats-dogs-images/dogs')))

?2?创建文件夹存放训练集和测试集

try:
    os.mkdir('E:/machine learning data/cat-dog') #在路径'E:/machine learning data/'下创建文件名为cat-dog的文件
    os.mkdir('E:/machine learning data/cat-dog/training')
    os.mkdir('E:/machine learning data/cat-dog/testing')
    os.mkdir('E:/machine learning data/cat-dog/training/cats')
    os.mkdir('E:/machine learning data/cat-dog/training/dogs')
    os.mkdir('E:/machine learning data/cat-dog/testing/cats')
    os.mkdir('E:/machine learning data/cat-dog/testing/dogs')
except OSError:
    pass  

3 分割数据

#分割原始数据为训练集和测试集
import shutil
import random
def split_data(source,training,testing,split_size): #参数分别为cats或者dogs源目录,训练集目录,测试集目录,划分比例
    files=[] #临时列表容器存放遍历的文件名
    for filename in os.listdir(source): #将遍历的非空文件追加到files
        file=source+filename
        if os.path.getsize(file)>0:
            files.append(filename)
        else:
            print(filename+'is zero,so ingoring')
    training_length=int(len(files)*split_size)
    testing_length=int(len(files)-training_length)
    shuffled_set=random.sample(files,len(files))   #返回随机采样的长度为len(files)的列表
    trainging_set=shuffled_set[0:training_length]  #随机选取training_length张图片为训练集
    testing_set=shuffled_set[-testing_length:]
    
    for filename in trainging_set:
        this_file=source+filename
        destination=training+filename
        shutil.copyfile(this_file,destination)  #copyfile(src,dst),dst必须是完整的目标文件名,从src复制到dst;copy(src,dst),dst可以为目录名
    
    for filename in testing_set:
        this_file=source+filename
        destination=testing+filename
        shutil.copyfile(this_file,destination)
cat_source_dir='E:/machine learning data/cats-dogs-images/cats/'  #cats数据源目录
training_cats_dir='E:/machine learning data/cat-dog/training/cats/'
testing_cats_dir='E:/machine learning data/cat-dog/testing/cats/'
dog_source_dir='E:/machine learning data/cats-dogs-images/dogs/'  #dogs数据源目录
training_dogs_dir='E:/machine learning data/cat-dog/training/dogs/'
testing_dogs_dir='E:/machine learning data/cat-dog/testing/dogs/'

#确认前面是否建立了训练集和测试集的子目录
def create_dir(file_dir):
    if os.path.exists(file_dir):
        print('true')
        shutil.rmtree(file_dir)#删除目录
        #os.makedirs(file_dir)#重建目录,makedirs自动创建到达最后一级目录所需要的中间目录
        os.mkdir(file_dir)
    else:
        os.mkdir(file_dir)
create_dir(training_cats_dir)
create_dir(testing_cats_dir)
create_dir(training_dogs_dir)
create_dir(testing_dogs_dir)

split_size=0.9
split_data(cat_source_dir,training_cats_dir,testing_cats_dir,split_size)  #开始分割cats数据集
split_data(dog_source_dir,training_dogs_dir,testing_dogs_dir,split_size)  #开始分割dogs数据集

4?查看分割后的数据

#查看分割后的数据
import numpy as np
from PIL import Image
print(len(os.listdir(training_cats_dir)))
print(len(os.listdir(testing_cats_dir)))
print(len(os.listdir(training_dogs_dir)))
print(len(os.listdir(testing_dogs_dir)))
img=Image.open("E:/machine learning data/cat-dog/training/cats/0.1.jpeg") #打开一张图片看其大小
print(img.size)

5 模型构建及预测可参考【?http://t.csdn.cn/DI4a4】和【http://t.csdn.cn/9BOXR

这是作者的学习笔记,在此分享,仅供参考。因为作者水平有限,如有疏漏之处,还望批评指正。

文章来源:https://blog.csdn.net/m0_57190374/article/details/126901003
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。