python_数据输入

在机器学习中对数据的读入,预处理,清洗十分重要,这部分我们就从如何用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)