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)