博客地址:?https://blog.csdn.net/qq_34106574/article/details/80691162
python_數(shù)據(jù)輸入
1,在機(jī)器學(xué)習(xí)中對(duì)數(shù)據(jù)的讀入,預(yù)處理,清洗十分重要,這部分我們就從如何用python讀入數(shù)據(jù)開(kāi)始
(1) 首先我們先來(lái)對(duì)python的一些數(shù)據(jù)類型進(jìn)行一個(gè)回顧,暫時(shí)就list與numpy做簡(jiǎn)要介紹
我們先看下面的結(jié)果:兩個(gè)類型還是有區(qū)別的,可以用list來(lái)初始化numpy(以行來(lái)堆疊),list的apend函數(shù)可以增加元素,numpy不支持這個(gè)函數(shù)
>>> import numpy as np
>>> img=[]?//定義list
>>> tem=np.array([img,lab])?//list初始化numpy,以行堆疊
>>> tem.transpose()?//轉(zhuǎn)置
>>> np.vstack((tem,np.array([5,3])))?//垂直疊加,水平用 hstack()

(2)numpy的維度問(wèn)題
np.zeros((4,3,2)),第一項(xiàng)表表示個(gè)數(shù),第二項(xiàng)表示行數(shù),第三項(xiàng)表示列數(shù)
>>> 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)以上為小白補(bǔ)習(xí)內(nèi)容,下面開(kāi)始正文:
要讀入數(shù)據(jù)先要獲取文件路徑,下面一段程序給出解析:
os.walk可以返回參數(shù)(路徑)下的內(nèi)容為一個(gè)包含三個(gè)元素的元組:根路徑(絕對(duì)路徑),子目錄名,文件名
>>> import os
>>> for r,s,f in os.walk('K:/tensorflow_vgg16/face_train'):
... print(f)

os.path.join可以將路徑組合,不僅可以在當(dāng)前目錄組合,而且可以跨越子目錄組合,真是強(qiáng)力膠啊?。?!
>>> 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)列出當(dāng)前目錄所有文件

下面一個(gè)完整的獲取路徑的方式:
def?get_file(file_dir):
'''得到文件的數(shù)據(jù)(路徑+名字)列表和標(biāo)簽列表 參數(shù):
file_dir: 數(shù)據(jù)的目錄 返回值:
images: 數(shù)據(jù)(路徑+名字)字符列表
labels: 標(biāo)簽整型列表 '''
images = []
temp = []
for?root, sub_folders, files?in?os.walk(file_dir):
#os.walk可以返回參數(shù)(路徑)下的內(nèi)容為一個(gè)包含三個(gè)元素的元組:根路徑(絕對(duì)路徑),子目錄名,文件名
# image directories
for?name?in?files:
images.append(os.path.join(root, name))?#組合圖像與當(dāng)前目錄
# get 10 sub-folder names
for?name?in?sub_folders:
temp.append(os.path.join(root, name))?#組合子目錄與當(dāng)前目錄
# 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)列出當(dāng)前目錄所有文件,len計(jì)算字符列表的長(zhǎng),即個(gè)數(shù)
letter = one_folder.split('\\')[-1]?#字符切片[-1]表示切最后一個(gè)元素
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此步為了打亂數(shù)據(jù)和
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的數(shù)據(jù)是四維張量,如果使用其他圖像讀取工具時(shí),有時(shí)需要進(jìn)行數(shù)據(jù)維度轉(zhuǎn)換:
x=p.reshap(-1,30,50,3)
x=p[:,np.ewaxis,:]
......
(6)數(shù)據(jù)類型轉(zhuǎn)換:我們讀取數(shù)據(jù)時(shí)可能會(huì)用不同的工具,PIL.Image , cv2, numpy
以opencv現(xiàn)在的版本,只要適合維度的numpy.array都可以直接接收無(wú)需轉(zhuǎn)換;
PIL.Image的轉(zhuǎn)換也非常方便,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)

