一些吐槽和文章简介

博主是那种“拿来就用,不会再查”的人。而几乎所有教程都秉持着“这应该是python课教的”的理念,从而使得没学过python的人颇为头疼。博主虽接触过python,但还没系统学过,阅读一篇代码,最耗时的部分不是探索算法原理,而是查阅python函数用法……

嗯?你说什么?学python?在我眼中,专门学一门语言是最低效的事情之一(大学学C语言除外,毕竟是基础)。python是不会学的,这辈子也不可能学的。但也不能永远被语言问题所困扰,于是博主决定,总结一个“数据处理‘万能’模板”,将来需要用时,直接稍加改动,复制粘贴。

本文代码来源《Tensorflow实战Google深度学习框架(第2版)》第六章最后一节,本来是一个迁移学习的程序,但其中的数据处理模块我觉得很有帮助,特拿出来逐行精析。一不小心写了很多注释,干脆放在博客上,希望能帮有需要的人节省语言学习时间。


一、程序功能和数据集

http://download.tensorflow.org/example_images/flower_photos.tgz ,在这个网址下载数据,解压缩如下图:

代码文件要和这两个文件夹放在一个文件夹下
左边文件夹是解压得到,右边文件夹是新建的。flower_photos文件夹中有五个子文件夹,每个文件夹中都是同种类的花朵图片,这就是我们要面对的数据。
平均每一种花有734张图片,每张图都是RGB彩色,大小不同。

本文程序的input就是这些图片,output就是一个以.npy格式存储的数据文件(文末会说明如何读取这种文件)。


二、代码精析

# -*- coding: utf-8 -*-import glob
import os.path
import numpy as np
import tensorflow as tf
from tensorflow.python.platform import gfileINPUT_DATA = 'flower_photos'     # 原始输入数据的目录,其有五个子目录,每个目录下保存属于该类别的所有图片
OUTPUT_DATA = 'processed_flower_data/flower_processed_data.npy'     # 将整理后的图片数据通过numpy的格式保存# 测试数据和验证数据的比例
VALIDATION_PERCENTAGE = 10
TEST_PERCENTAGE = 10# 读取数据并将数据分割成训练数据、验证数据和测试数据
def create_image_lists(sess, testing_percentage, validation_percentage):# sub_dirs用于存储INPUT_DATA下的全部子文件夹目录sub_dirs = [x[0] for x in os.walk(INPUT_DATA)]  # os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下is_root_dir = True# 初始化各个数据集training_images = []training_labels = []testing_images = []testing_labels = []validation_images = []validation_labels = []current_label = 0   # 在接下来的for循环中,第一次循环时值为0,每次循环结束时加一count = 1   # 循环计数器# 对每个在sub_dirs中的子文件夹进行操作for sub_dir in sub_dirs:# 直观上感觉这个条件结构是多此一举,暂时不分析为什么要加上这个语句if is_root_dir:is_root_dir = Falsecontinue    # 继续下一轮循环,下一轮就无法进入条件分支而是直接执行下列语句print("开始读取第%d类图片:" % count)count += 1# 获取一个子目录中所有的图片文件extensions = ['jpg', 'jpeg', 'JPG', 'JPEG']     # 列出所有扩展名file_list = []# os.path.basename()返回path最后的文件名。若path以/或\结尾,那么就会返回空值dir_name = os.path.basename(sub_dir)    # 返回子文件夹的名称(sub_dir是包含文件夹地址的串,去掉其地址,只保留文件夹名称)# 针对不同的扩展名,将其文件名加入文件列表for extension in extensions:# INPUT_DATA是数据集的根文件夹,其下有五个子文件夹,每个文件夹下是一种花的照片;# dir_name是这次循环中存放所要处理的某种花的图片的文件夹的名称# file_glob形如"INPUT_DATA/dir_name/*.extension"file_glob = os.path.join(INPUT_DATA, dir_name, '*.' + extension)# extend()的作用是将glob.glob(file_glob)加入file_list# glob.glob()返回所有匹配的文件路径列表,此处返回的是所有在INPUT_DATA/dir_name文件夹中,且扩展名是extension的文件file_list.extend(glob.glob(file_glob))# 猜想这句话的意思是,如果file_list是空list,则不继续运行下面的数据处理部分,而是直接进行下一轮循环,# 即换一个子文件夹继续操作if not file_list: continueprint "文件名列表制作完毕,开始读取图片文件"# 将file_list中的图片文件一条一条进行数据处理# 注意此时file_list已经变成了一个基本单位为字符串的list,list中的每个字符串存储的是一个图片的完整文件名(含路径),# 这些图片所属的文件夹就是这一轮循环的sub_dirfor file_name in file_list:# 以下两行是读文件常用语句image_raw_data = gfile.FastGFile(file_name, 'rb').read()image = tf.image.decode_jpeg(image_raw_data)# 如果图片数据的类型不是float32,则转换之if image.dtype != tf.float32:image = tf.image.convert_image_dtype(image, dtype=tf.float32)# 调整图片的尺寸,将其化为299*299,以便inception-v3模型来处理image = tf.image.resize_images(image, [299, 299])image_value = sess.run(image)   # 提示:sess.run(image)返回image的计算结果;# 至此, image_value类型是299*299的float32型矩阵,代表当前循环所处理的图片文件# 随机划分数据集,通过生成一个0-99的随机数chance来决定当前循环中的图片文件划入验证集、测试集还是训练集# np.random.randint(100)作用是随机生成在0-99间的一个数(此函数还可以指定返回的尺寸,比如可以指定返回一个x*y的矩阵,未指定尺寸则返回一个数)chance = np.random.randint(100)if chance < validation_percentage:validation_images.append(image_value)   # 由于一共有3670张图片,这样最终的validation_images的尺寸大致是(3670*validation_percentage%)*229*229*3validation_labels.append(current_label)     # 由于一共有3670张图片,这样最终的validation_labels的尺寸大致是(3670*validation_percentage%)*1elif chance < (testing_percentage + validation_percentage):testing_images.append(image_value)testing_labels.append(current_label)else:training_images.append(image_value)training_labels.append(current_label)current_label += 1  # 注意这一行在上一个for外面,在最外层for里面;作用是在进入最外层for的下一轮循环之前,将"当前标签"加一,以表示下一个图片文件夹print "本类图片读取完毕"print "开始打乱训练数据集"# 将训练数据随机打乱以获得更好的训练效果# 注意这里已经跳出了for循环,此时的training_image尺寸大致是(3670*(100-validition_percentage-testing_percentage)%)*299*299*3# training_labels尺寸大致是(734*(100-validition_percentage-testing_percentage)%)*1state = np.random.get_state()   # 获取随机生成器np.random的状态np.random.shuffle(training_images)      # 进行打乱操作,如果对象是多维矩阵,只对第一维进行打乱操作np.random.set_state(state)      # 将之前随机生成器的状态设置为现在随机生成器的状态,目的是让下面一行对标签的打乱和上一行图片的打乱一致np.random.shuffle(training_labels)print "数据集处理完毕!"return np.asarray([training_images, training_labels,validation_images, validation_labels,testing_images, testing_labels])def main():with tf.Session() as sess:processed_data = create_image_lists(sess, TEST_PERCENTAGE, VALIDATION_PERCENTAGE)np.save(OUTPUT_DATA, processed_data)if __name__ == '__main__':main()

三、代码运行

如果你的目录结构和文件夹的名称和我在一中所述一样,那么上述代码能不加改动直接在你的pycharm上运行。毕竟要对付3670张彩图,我运行了约33分钟,成功后大概是这样:

# 开始读取第1类图片:
# 文件名列表制作完毕,开始读取图片文件
# 本类图片读取完毕
# 开始读取第2类图片:
# 文件名列表制作完毕,开始读取图片文件
# 本类图片读取完毕
# 开始读取第3类图片:
# 文件名列表制作完毕,开始读取图片文件
# 本类图片读取完毕
# 开始读取第4类图片:
# 文件名列表制作完毕,开始读取图片文件
# 本类图片读取完毕
# 开始读取第5类图片:
# 文件名列表制作完毕,开始读取图片文件
# 本类图片读取完毕
# 开始打乱训练数据集
# 数据集处理完毕!

然后在processed_flower_data下发现有一个新文件flower_processed_data.npy


四、.npy文件的简单使用

import numpy as np
data = np.load(xxx.npy)

然后data就是如下格式:

[training_images, training_labels,
validation_images, validation_labels,
testing_images, testing_labels]

比如data[0]就是training_images的list,用如下代码查看其尺寸(应该有比这更简单的方法):

array=np.array(data[0])
array.shape

结果:

(2915, 299, 299, 3)

这是我的训练集的尺寸,共2915张图片,由于是用随机数分配的图片,可能每个人的图片张数不一样。

以上。

Tensorflow入门——自制数据集:将未经处理的图片制成npy格式的数据集相关推荐

  1. 【数据集处理】Python修改图片为.jpg格式批量修改名字为000000格式

    修改图片名字为.jpg格式 #第一步 #把某种类型的图片改为.jpg格式 import os import string dirName = "/home/dlut/网络/make_data ...

  2. tensorflow入门数据集:mnist详解

    文章目录 python处理二进制 mnist介绍 mnist显示 方法一:读取解压后的原始文件 方法二:使用TensorFlow封装代码读取 需求一:同时显示图片和标签,验证图片和标签一一对应 需求二 ...

  3. TensorFlow入门:第一个机器学习Demo

    TensorFlow入门:第一个机器学习Demo 2017年12月13日 20:10:23 阅读数:8604 本文主要通过一个简单的 Demo 介绍 TensorFlow 初级 API 的使用方法,因 ...

  4. Tensorflow入门——训练结果的保存与加载

    2019独角兽企业重金招聘Python工程师标准>>> 训练完成以后我们就可以直接使用训练好的模板进行预测了 但是每次在预测之前都要进行训练,不是一个常规操作,毕竟有些复杂的模型需要 ...

  5. Tensorflow 入门教程

    Tensorflow 入门教程  http://tensornews.cn/ 深度学习发展史 特征工程 深度学习之激活函数 损失函数 反向传播算法 [上] 反向传播算法 [下] Tensorflow ...

  6. 比官方更简洁的Tensorflow入门教程

    声明: 参考自Python TensorFlow Tutorial – Build a Neural Network,本文简化了文字部分 文中有很多到官方文档的链接,毕竟有些官方文档是中文的,而且写的 ...

  7. JC-6、OpenCV+Tensorflow入门人工智能图像处理

    目录 Beginner 1. Anaconda下载与环境搭建 2. 计算机视觉入门 hello world 2.1. OpenCV基础操作 2.1.1. 图片的读取与展示 2.1.2. OpenCV中 ...

  8. TensorFlow入门之二:tensorflow手写数字识别

    一.基础知识 基础知识可以跳过,可以直接看后面的代码实现 MNIST数据集 MNIST数据集的官网是Yann LeCun's website.可以使用下面的python代码自动下载数据集. #已经下载 ...

  9. 世界最清楚tensorflow入门教程

    人工智能.机器学习和深度学习 在介绍TensorFlow(以下简称为TF)之前,我们首先了解一下相关背景. TF是一种机器学习框架,而机器学习经常和人工智能,深度学习联系在一起,那么三者到底是什么关系 ...

最新文章

  1. 在存储过程中如何使用另一个存储过程返回的结果集
  2. jpa 不自动建表_如何来实现SpringBoot应用的JPA数据持久化和热插拔
  3. 博客搬迁地址到csdn了
  4. UNITY2018 真机开启deepprofiling的操作
  5. 把一个英语句子中的单词次序颠倒后输出。例如输入“how are you”,输出“you are how”;...
  6. v8引擎和v12引擎_为什么V8和V12发动机至今还存在,而V10发动机却早早被淘汰了?...
  7. function与感叹号!
  8. 修改本机域名服务器为Google Public DNS或者OpenDNS
  9. jQuery获取所选单选按钮的值
  10. 彻底拿下QSPI双闪存W25Q256| STM32H750| QSPI 双FLASH |cubeIDE |下载算法(一)
  11. 短视频封面抽取和标题自动化生成
  12. Java工程师胜任力素质模型,胜任力故事汇编C47│AspiringMinds:高潜力程序员的胜任力素质模型...
  13. 论文的研究背景如何着笔
  14. 产品之路第四年的再思考
  15. ps裁剪和裁切的区别_ps裁剪工具怎么用?调整图像与画布的尺寸(三)
  16. recyclerView的滑动
  17. python 处理大数据
  18. centos查看显卡型号时出现 NVIDIA Corporation
  19. SpringMVC控制器内请求转发关键字forward无效原因
  20. pytorch深度学习基础(九)——深入浅析卷积核

热门文章

  1. 用STRAIGHT_JOIN优化mysql的执行速度
  2. 注册表usbstor删除不了_彻底清除注册表U盘与USB使用记录技巧
  3. 【iOS】内存五大分区
  4. 机器学习训练过程中常见问题
  5. QtDesigner和python结合起来实现窗口化猜数字游戏
  6. ntp 服务 --Centos
  7. mysql四种隔离级别
  8. 互联网公司平均薪资Top8 , 阿里勇夺第一。
  9. Python数据分析入门笔记6——数据清理案例练习
  10. Qt Android 调用系统文件管理