import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path
# 数据集主目录
DATA_ROOT = 'D:\BaiduNetdiskDownload\pycv-learning\data\spot_data_cls'
# 训练集验证集划分比例
ratio = 0.8
# 创建path对象
DATA_ROOT_PATH = Path(DATA_ROOT)
上面是我导入的模块,以及预定义的一些参数。
dict_num2name = {} # 数据集标签序号to类别名称的转换字典
sep_class_paths = {} # 获取数据集下的各个类别的图片路径
for i,path in enumerate(DATA_ROOT_PATH.iterdir()):
dict_num2name[i] = path.name # {0: 'copper', 1: 'edge', 2: 'normal', 3: 'overlap', 4: 'splash', 5: 'twist'}
sep_class_paths[path.name] = list(map(lambda x : str(x), path.iterdir()))
np.random.shuffle(list(sep_class_paths[path.name]))
print(len(list(sep_class_paths[path.name])))
使用上面的代码,获得的图片文件路径如下,仍然是按文件的名称排序。
然后我发现, 在上面的代码中,我已经用list(map())把map对象转换成列表了,所以在乱序的时候,我就不需要再用list()转一遍了。
于是我把代码改成下面这样:
dict_num2name = {} # 数据集标签序号to类别名称的转换字典
sep_class_paths = {} # 获取数据集下的各个类别的图片路径
for i,path in enumerate(DATA_ROOT_PATH.iterdir()):
dict_num2name[i] = path.name # {0: 'copper', 1: 'edge', 2: 'normal', 3: 'overlap', 4: 'splash', 5: 'twist'}
sep_class_paths[path.name] = list(map(lambda x : str(x), path.iterdir()))
np.random.shuffle(sep_class_paths[path.name])
print(len(list(sep_class_paths[path.name])))
结果如下,乱序效果很明显。
为什么在shuffle()里用list()会产生无法乱序的效果呢?
我不懂,只是在这里记录一下我对这一异常的解决思路。