第12课:Tensorflow深度学习实战之获取数据

其实获取数据与数据处理有时候比建模更麻烦,更重要

因为Tensorflow主流算法模型代码都是现成的,稍微改改就能用,而数据却是和项目关联的,千变万化。


这里以猫狗大战数据集为例,最终可以实现对猫狗的准实时分类

实现步骤无外乎:

1.获取数据,数据处理

2.选择算法,数据建模,训练模型

3.实时使用模型


现在我们开始第一步,获取数据

先去官方网站:https://www.kaggle.com/c/dogs-vs-cats

下载猫狗数据集,作为训练用的基础数据

数据集由训练数据和测试数据组成,训练数据包含猫和狗各12500张图片,测试数据包含12500张猫和狗的图片。 


训练数据的提取

先引入必要的包

import tensorflow as tf

import numpy as np

import os


获取数据集中的文件

image_list = []

label_list = []

for file in os.listdir(file_dir):#file_dir是数据集存放的路径

    name = file.split('.')

    image_list.append(file_dir + file)#image_list用存在每张图片的路径信息

    label_list.append(model[name[0]])#label_list用来存在对应图片的属性,比如是狗还是猫,因为list的有序的,不必担心对应不上的问题

temp = np.array([image_list, label_list])#创建出一个二维数组,其实就是要得到一个矩阵,后面都是一些矩阵操作

temp = temp.transpose()

#转置出来的效果:

[['data/cat_vs_dog/train/cat.0.jpg' '0']

 ['data/cat_vs_dog/train/cat.1.jpg' '0']

 ['data/cat_vs_dog/train/cat.10.jpg' '0']

 ..., 

 ['data/cat_vs_dog/train/dog.9997.jpg' '1']

 ['data/cat_vs_dog/train/dog.9998.jpg' '1']

 ['data/cat_vs_dog/train/dog.9999.jpg' '1']]


np.random.shuffle(temp)#打乱顺序,让训练更随机有效

image_list = list(temp[:, 0])

label_list = list(temp[:, 1])

label_list = [int(i) for i in label_list]


获取到数据之后,生成相同大小的批次,这是个很重要的步骤,来给模型提供训练数据。相当于给奶牛喂饲料;饲料的配比,数量,各种搭配非常的重要,直接影响到产出

def getImageBatch(self, image, label, image_W = 208, image_H = 208, batch_size = 16, capacity = 2000):

    '''

    Args:

        image: list type   要生成batch的图像和标签list

        label: list type

        image_W: image width

        image_H: image height

        batch_size: batch size  每个batch有多少张图片

        capacity: the maximum elements in queue  队列容量

    Returns: 图像和标签的batch

        image_batch: 4D tensor [batch_size, width, height, 3], dtype=tf.float32

        label_batch: 1D tensor [batch_size], dtype=tf.int32

    '''


    image = tf.cast(image, tf.string)#数据类型定义 python.list类型转换成tf能够识别的格式

    label = tf.cast(label, tf.int32)


    # 生成队列

    input_queue = tf.train.slice_input_producer([image, label])

    label = input_queue[1]

    image_contents = tf.read_file(input_queue[0])

    image = tf.image.decode_jpeg(image_contents, channels=3)#tf.image.decode_jpeg解码JPEG格式图像。tf.image.decode_png解码PNG格式图像


    ######################################

    # data argumentation should go to here  TensorFlow内置文件格式TFRecord,二进制数据和训练类别标签数据存储在同一文件。模型训练前图像转换为TFRecord格式。TFRecord文件是protobuf格式。数据不压缩,可快速加载到内存。最好在预处理阶段完成图像操作,裁剪、缩放、灰度调整等。图像加载后,翻转、扭曲,使输入网络训练信息多样化,缓解过拟合。Python图像处理框架PILOpenCVTensorFlow提供部分图像处理方法。裁剪,tf.image.central_crop,移除图像区域,完全丢弃其中信息,与tf.slice(移除张量分量)类似,基于图像中心返回结果。训练时,如果背景有用,tf.image.crop_to_bounding_box(只接收确定形状张量,输入图像需要事先在数据流图运行) 随机裁剪区域起始位置到图像中心的偏移量。

    ######################################


    image = tf.image.resize_image_with_crop_or_pad(image, image_W, image_H)


    # if you want to test the generated batches of images, you might want to comment the following line.

    image = tf.image.per_image_standardization(image)#将整幅图片标准化(不是归一化),加速神经网络的训练


    image_batch, label_batch = tf.train.batch([image, label],

                                              batch_size=batch_size,

                                              num_threads=64,

                                              capacity=capacity)#tf.train.batch是按顺序读取数据,队列中的数据始终是一个有序的队列  capacity是队列的长度


    # you can also use shuffle_batch

    #    image_batch, label_batch = tf.train.shuffle_batch([image,label],

    #                                                      batch_size=BATCH_SIZE,

    #                                                      num_threads=64,

    #                                                      capacity=CAPACITY,

    #                                                      min_after_dequeue=CAPACITY-1)


    label_batch = tf.reshape(label_batch, [batch_size])#调整矩阵维度 ;第1个参数为被调整维度的张量;第2个参数为要调整为的形状;返回一个shape形状的新tensor。注意:shape里最多有一个维度的值可以填写为-1,表示自动计算此维度

    image_batch = tf.cast(image_batch, tf.float32)


    return image_batch, label_batch


经过上面的操作,一张张图片被送人队列等待深度学习模型学习,图片进行了标准化处理(其实可以看做是降维),使得模型可以认识辨别