人工智能/模式识别/机器学习精华专题人工智能与机器学习深入理解tensorflow

Tensorflow数据输入

2018-07-24  本文已影响14人  AI小白龙

博客地址: https://blog.csdn.net/qq_34106574/article/details/80691162

python_数据输入

1,在机器学习中对数据的读入,预处理,清洗十分重要,这部分我们就从如何用python读入数据开始

(1) 首先我们先来对python的一些数据类型进行一个回顾,暂时就list与numpy做简要介绍

我们先看下面的结果:两个类型还是有区别的,可以用list来初始化numpy(以行来堆叠),list的apend函数可以增加元素,numpy不支持这个函数

>>> import numpy as np

>>> img=[] //定义list

>>> tem=np.array([img,lab]) //list初始化numpy,以行堆叠

>>> tem.transpose() //转置

>>> np.vstack((tem,np.array([5,3]))) //垂直叠加,水平用 hstack()

(2)numpy的维度问题

np.zeros((4,3,2)),第一项表表示个数,第二项表示行数,第三项表示列数

>>> a=np.zeros((4,3,2))

>>> print(a)

>>> b=np.zeros((3,2))

>>> print(b)

[[0. 0.]

[0. 0.]

[0. 0.]]

按第一维度切片输出:

>>> for r in b:

... print(r)

...

[0. 0.]

[0. 0.]

[0. 0.]

>>> for r in a:

... print(r)

(3)以上为小白补习内容,下面开始正文:

要读入数据先要获取文件路径,下面一段程序给出解析:

os.walk可以返回参数(路径)下的内容为一个包含三个元素的元组:根路径(绝对路径),子目录名,文件名

>>> import os

>>> for r,s,f in os.walk('K:/tensorflow_vgg16/face_train'):

... print(f)

os.path.join可以将路径组合,不仅可以在当前目录组合,而且可以跨越子目录组合,真是强力胶啊!!!

>>> for r,s,f in os.walk('K:/tensorflow_vgg16/face_train'):

... for n in f:

... print(os.path.join(r,n))

#os.listdir(one_folder)列出当前目录所有文件

下面一个完整的获取路径的方式:

def get_file(file_dir):

'''得到文件的数据(路径+名字)列表和标签列表 参数:

file_dir: 数据的目录 返回值:

images: 数据(路径+名字)字符列表

labels: 标签整型列表 '''

images = []

temp = []

for root, sub_folders, files in os.walk(file_dir):

#os.walk可以返回参数(路径)下的内容为一个包含三个元素的元组:根路径(绝对路径),子目录名,文件名

# image directories

for name in files:

images.append(os.path.join(root, name)) #组合图像与当前目录

# get 10 sub-folder names

for name in sub_folders:

temp.append(os.path.join(root, name)) #组合子目录与当前目录

# assign 10 labels based on the folder names

labels = []

for one_folder in temp:

n_img = len(os.listdir(one_folder)) #os.listdir(one_folder)列出当前目录所有文件,len计算字符列表的长,即个数

letter = one_folder.split('\\')[-1#字符切片[-1]表示切最后一个元素

if letter == '0':

labels = np.append(labels, n_img * [0])

elif letter == '1':

labels = np.append(labels, n_img * [1])

elif letter == '2':

labels = np.append(labels, n_img * [2])

elif letter == '3':

labels = np.append(labels, n_img * [3])

# shuffle此步为了打乱数据和

temp = np.array([images, labels])

temp = temp.transpose()

np.random.shuffle(temp)

#重新分离

image_list = list(temp[:, 0])

label_list = list(temp[:, 1])

label_list = [int(float(i)) for i in label_list] #???? int(i)

return image_list, label_list

(4)获取路径之后就是读图了

读图一般有很多工具,opencv,matplot,keras,tensorflow

import cv2

def read_img(image_list):

images[]

for path in image_list:

images.append(cv2.imread(path ))

rerurn images

(5)通常TensorFlow的数据是四维张量,如果使用其他图像读取工具时,有时需要进行数据维度转换:

x=p.reshap(-1,30,50,3)

x=p[:,np.ewaxis,:]

......

(6)数据类型转换:我们读取数据时可能会用不同的工具,PIL.Image , cv2, numpy

以opencv现在的版本,只要适合维度的numpy.array都可以直接接收无需转换;

PIL.Image的转换也非常方便,imag=image.fromarray() / array=np.array(imag)

img = Image.open('K:/keras_project/fine-tuning/test.jpg')

imge = np.array(img)

cv2.imshow('src',imge) #由于cv2中是bgr存放,所以色彩有异常 可前置 :cv2.cvtColor(imge,cv2.COLOR_BGR2RGB)

cv2.waitKey(0)

版权声明:本文为博主原创文章,转载请联系作者取得授权。https://blog.csdn.net/qq_34106574/article/category/7628923 

上一篇下一篇

猜你喜欢

热点阅读