深度学习之图像类数据的处理方法及标签向量的生成

接下来的系列博文将会基于的猫狗识别项目,进行各种机器学习及深度学习的算法讲解,通过此系列博文可以学习到图像数据的处理方法、经典的机器学习算法、神经网络的搭建(分别使用Tensorflow及keras进行搭建)、各种优化算法、调参技巧等知识。

ps: 此专题为AI领域经典算法书籍及论文解析与代码复现,AI算法讲解。欢迎关注知乎专栏《致敬图灵》
https://www.zhihu.com/people/li-zhi-hao-32-6/columns
微信公众号:‘致敬图灵’。

kaggle比赛链接:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/overview

​ 从竞赛的信息中可以得知,所有的数据都是含有猫与狗的图片,且图片的大小不一,我们要完成的任务就是要对猫与狗的图片进行分类。

​ 进行算法的第一步,是要了解和处理数据。接下来,我们就将图片的信息读取,并将通过程序生成标签(y,列表型数据),以及每一个标签对应的x(图片数据,一个存储着narray的列表)
文件的名称为:cat.1.jpg,或者dog.2.jpg。。。

import numpy as np
import pandas as pd
import os
import cv2
#步骤:1.定义规范化图片大小。2.依次读取文件夹下的图片数据,根据每一个图片的名称确定图片的标签(猫为0,狗为1),并依次存入y矩阵。3.将图片数据转化为规范化数据,并存入x矩阵

#1.定义规范化的图片大小
fig_width=64
fig_high=64

#2.依次读取文件夹下的图片数据,根据每一个图片的名称确定图片的标签(猫为0,狗为1),并依次存入y矩阵
filenames = os.listdir("G:/MYWD/data/photo_dog&cat/train")
y=[]
for filename in filenames:
    filename_start=filename.split('.')
    filename_start=filename_start[0] #经过 . split进行切片后所形成数组的第一个元素就是dog或者cat,也可以直接使用字符串的startwith方法:filename_start.startwith('dog')
    if filename_start == 'dog':
        y.append(1)
    else:
        y.append(0)
#3.将图片数据转化为规范化数据,并存入x矩阵
data=[]
for filename in filenames:
    #以灰度图方式读取
    image=cv2.imread("G:/MYWD/data/photo_dog&cat/train/"+filename,cv2.IMREAD_GRAYSCALE) #读取文件,第二个参数是定义读取方式,cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数。cv2.IMREAD_GRAYSCALE:以灰度模式加载图片。cv2.IMREAD_UNCHANGED:包括alpha。
    #以彩色图方式读取
    #image = cv2.imread("G:/MYWD/data/photo_dog&cat/train/" + filename, cv2.IMREAD_COLOR)
    image=cv2.resize(image,(fig_width,fig_high)) # 将图片数据转化为规范化数据
    data.append(image)#data现在是一个存储着narray的列表。

​ 接下来我们可以再根据我们使用的算法所需要的数据来修改data列表中的数据,使其满足我们的使用要求。

​ 我们仅列出两种比较常见的处理方法,一种是将data中的narray(相当于一个二维矩阵)展开成1维的,在本例中,就是将64*64个像素点矩阵,展开成一个一维的向量,这个向量就是我们的特征向量,每一维都是这个图片的一种特征。

x=[]
for i in data:
    i=i.reshape(1,fig_high*fig_width)#将图片像素矩阵变为特征向量
    x.append(i)
	

算法设计注意点:在算法进行矩阵运算时,有三种方式进行,一种是通过列表中存放array,另一种是在array中存放矩阵,第三种是使用tensorflow进行神经网络的运算,
三种方法各有特点,tensorflow是封装好的用于实现神经网络算法的库,它将很多函数都进行了封装,比如进行神经网络的构建时,但是对于小规模的运算,不太适用,因为小规模的运算本身运算比较简单,运算时间需要的不多,而调用 tensorflow 库的时间相对来说比较长,因此不如直接array运算,但是tensorflow中有很多函数都是比较方便地进行神经网络的建立及分析的。
array应该注意一维与二维的数组之间进行区分, 比较适合少量计算的,且是针对样本整体进行计算的算法。list方法则是要通过for循环进行计算,适用于对每一个样本进行操作的算法。 应根据实际应用进行选择。
比如在感知机算法中,因为算法对参数进行更新的方式是:针对每一个样本,都有一个下降率,因此是对每一个样本进行操作,比较适合适用list。
下面再针对tensorflow在神经网络的搭建方面进行进一步的解释,下面分别解释了tensorflow进行搭建的时候所使用的数据的shape应该如何设置,tensorflow相对于numpy等方法,对于神经网络的搭建有什么优势。
首先我们要知道神经网络的本质,是生成特征。
进行tensorflow神经网络的搭建时,其输入的数据是一个nm的矩阵(n为行数,样本数,m为列数,是数据的特征)。
假设神经网络的第二层生成特征为p个。
那么中间的权重参数w的shape为输入的特征数
输出的特征数,即mp。
生成的特征的shape为n
p,样本数不变,而特征与特征的数量改变了。
深度学习之图像类数据的处理方法及标签向量的生成_第1张图片
在tensorflow中,我们不需要考虑太多样本的数量问题以及单个样本的问题,我们只需要对样本整体进行操作,不需要通过for循环等进行但个样本的操作,tensorflow中的函数比较好的解决了我们对样本的维数的计算与考虑,比如在计算损失时,平时我们进行计算时,要通过for循环,将每一个样本的损失()计算出来,然后相加求平均,而tensorflow提供了直接针对所有样本同时进行计算的函数,我们可以通过:loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=[1])) 对loss进行计算。tf.square(ys - prediction)同时对所有的样本的预测误差进行了平方运算,我们不需要再通过for循环进行运算。 当然numpy中也有相关函数,但是,tensorflow中还有tf.nn.softmax_cross_entropy_with_logits()之类的函数,对于神经网络来说会更加方便。

你可能感兴趣的:(深度学习,机器学习)