Tensorflow 訓練自己的資料集(一)(資料直接匯入到記憶體)
製作自己的訓練集
下圖是我們資料的存放格式,在data目錄下有驗證集與測試集分別對應iris_test, iris_train
為了向偉大的MNIST致敬,我們採用的資料名稱格式和MNIST類似
classification_index.jpg
影象的index都是5的整數倍是因為我們選擇測試集的原則是每5個樣本,選擇一個樣本作為測試集,其餘的作為訓練集和驗證集
生成這樣資料的過程相對簡單,如果有需要python程式碼的,可以給我發郵件,或者在我的github下載
至此,我們的訓練集,測試集,驗證集就生成成功了,之所以我們的資料夾只有訓練集和測試集是因為我們在後續的訓練過程中,會在訓練集中分出一部分作為驗證集,所以兩者暫時合稱為訓練集
將資料集寫入到Tensorflow中
1. 直接寫入到佇列中
import tensorflow as tf
import numpy as np
import os
train_dir = '/home/ruyiwei/data/iris_train/'#your data directory
def get_files(file_dir):
'''
Args:
file_dir: file directory
Returns:
list of images and labels
'''
iris = []
label_iris = []
contact = []
label_contact = []
for file in os.listdir(file_dir):
name = file.split('_')
if name[0]=="iris":
iris.append(file_dir + file)
label_iris.append(0)
else:
contact.append(file_dir + file)
label_contact.append(1)
print('There are %d iris\nThere are %d contact' %(len(iris), len(contact)))
image_list = np.hstack((iris, contact))
label_list = np.hstack((label_iris, label_contact))
temp = np.array([image_list, label_list])
temp = temp.transpose()
np.random.shuffle(temp)
image_list = list(temp[:, 0])
label_list = list(temp[:, 1])
label_list = [int(i) for i in label_list]
return image_list, label_list
為了大家更方便的理解和修改程式碼,我們對程式碼進行講解如下
1-3行 : 匯入需要的模組
5行: 定義訓練集合的位置,這個需要根據自己的機器進行修改
7行: 定義函式 get_files
18行: os.listdir(file_dir) 獲取指定目錄file_dir下的所有檔名詞,也就是我們的訓練圖片名稱
18行:for file in os.listdir(file_dir): 遍歷所有的圖片
19行: name為一個數組,由於我們根據MINIST來定製的圖片名詞,所以file.split(‘_’)會將影象名稱分為兩部分,第一部分為classification,通過name[0]來獲得分類資訊。
21行、24行:iris.append(file_dir + file)/contact.append(file_dir + file)將影象的絕對路徑放入到iris/contact中
22行、25行:label_iris.append(0)/label_contact.append(1)給對應的圖片貼標籤
28-29行:將二分類的影象與標籤壓入到list中
31-33行:合併二分類影象,然後打亂
38行:返回打亂後對應的影象與標籤
在spyder下執行如上程式碼後會返回如下資訊
這樣影象和標籤資訊就被load到了記憶體中,我們接下來就可以利用現有的模型對影象進行分類訓練,模型的選擇和訓練的過程,我們會在後面進行講解。