背景:由於處理小樣本學習過程中特別容易出現過擬合現象,有因爲是小樣本,所以一般處理方法會增強,增強後的數據包含大量的相似圖像,這時al驗證集可能就無法起到作用,因此需要提前從原始數據中提取一部分樣本作爲測試集。
這裏要區分以下訓練集、驗證集以及測試集的概念:
- 訓練集是用來訓練模型使用的數據,
- 驗證集是在訓練過程中用來迭代驗證模型的準確率,這部分數據並不參與訓練,但是可以通過這一部分數據來檢驗模型每次迭代準確率的變化。
- 測試集是在模型訓練完成後,我們進行最終測試的數據。和驗證集不同的是:驗證集和訓練集都是在數據增強後分離的,自然可能出現 一張圖像經過平移旋轉增強到了6張,前五張作爲訓練集,最後一張作爲了驗證集,由於這6張圖像都是從一張得到的,存在高度相似的情況,所以驗證集此時就發揮不出分析模型好壞的作用,充當了“臥底”的角色
先說一下如何統計文件夾內的數量:
for file in fileNames:
#獲取臨時的路徑
temp_path=os.path.join(pathc, file)
#os.listdir能夠獲得該路徑下的列表,我們在和len()方法相結合就能夠快速的得到文件夾下的數量,
file_count=len(os.listdir(temp_path))
下面在說一下整體代碼主要功能:在原始數據集文件夾中,根據每個子文件夾包括的數量大小,從中抽取10%作爲測試集。
主函數:
if __name__ == "__main__":
#提取到測試文件夾目錄下
patha="/home/scsc/dataset/2000_test"
# 合併圖像總的文件夾
pathc = "/home/scsc/dataset/rename_2000images"
#遍歷當前文件夾
fileNames = os.listdir(pathc)
#遍歷子文件夾,獲取每個文件夾內的圖像數量,根據圖像數量提取測試圖像數
for file in fileNames:
#獲取臨時的路徑
temp_path=os.path.join(pathc, file)
#os.listdir能夠獲得該路徑下的列表,我們在和len()方法相結合就能夠快速的得到文件夾下的數量,
file_count=len(os.listdir(temp_path))
train_size = int(file_count * 0.9)
#獲取訓練集的大小
test_size = file_count-train_size
#將子目錄、目標目錄、拷貝的數量作爲參數傳遞到拷貝方法中
CopyFile(os.path.join(pathc,file), patha + "/" + file,test_size)
拷貝方法:根據size進行判斷,將選中的文件拷貝到指定的測試集目錄下,操作完成後,移除當前圖像,如果size爲0則完成當前文件夾抽取工作
def CopyFile(filepath, newPath,size):
# 獲取當前路徑下的文件名,返回List
fileNames = os.listdir(filepath)
for file in fileNames:
# 將文件命加入到當前文件路徑後面
newDir = filepath + '/' + file
if size==0:
return
# 如果是文件
if os.path.isfile(newDir):
print(newDir)
print(newPath)
#驗證文件夾是否存在,若不存在則創建一個新的文件夾
isExists = os.path.exists(newPath)
# 判斷結果
if not isExists:
# 如果不存在則創建目錄
os.makedirs(newPath)
#驗證圖片是否正常,若不正常則跳過,不進行復制錯誤圖像,並且打印出錯誤圖像的名
img = cv2.imread(newDir)
newFile = newPath +'/'+ file
shutil.copyfile(newDir, newFile)
os.remove(newDir)
#如果不是文件,遞歸這個文件夾的路徑
else:
CopyFile(newDir,newPath)
size = size - 1