注:本文应用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】
这是作者的学习笔记,在此分享,仅供参考。因为作者水平有限,如有疏漏之处,还望批评指正。