来自包含七个子文件夹的主文件夹中的 mat` 文件。每个文件夹都以类(class)编号命名。
import glob
import os
import hdf5storage
import numpy as np
DATASET_PATH = "D:/Dataset/Multi-resolution_data/Visual/High/"
files = glob.glob(DATASET_PATH + "**/*.mat", recursive= True)
class_labels = [i.split(os.sep)[-2] for i in files]
for label in range(0, len(class_labels)):
class_labels [label] = int(class_labels[label])
files
变量包含以下内容:
我想问几个问题:
1) 当我读取 .mat
文件时,如果 dict
和每个 dict 包含不同的变量名就会出现。我想知道如何读取 key
并分配给数组?
array_store=[]
for f in files:
mat = hdf5storage.loadmat(f)
arrays = np.array(mat.keys())
array_store.append(arrays)
2) files = glob.glob(DATASET_PATH + "**/*.mat", recursive= True)
是否可以从主目录中的每个文件夹中随机读取特定数量的文件文件夹?比如 60% 用于训练,40% 用于测试?
更新
我已经尝试了@vopsea 在答案中提出的建议。
输出看起来像 train
变量的输出。
我如何制作每个文件的最终图像数组 foy Key 1 - 7(数组(256 x 256 x 11 x 图像总数))和标签(图像总数 x 1)?标签将与键值相同,例如,与键 1 关联的所有文件(188 个文件)将具有标签 1 (188 x 1)。
更新
解决无键名制作标签和访问键的问题。
import os
import random
import hdf5storage
import numpy as np
DATASET_PATH = "D:/Dataset/Multi-resolution_data/Visual/High/"
train_images = []
test_images = []
train_label = list()
test_label = list()
percent_train = 0.4
class_folders = next(os.walk(DATASET_PATH))[1]
for x in class_folders:
files = os.listdir(os.path.join(DATASET_PATH,x))
random.shuffle(files)
n = int(len(files) * percent_train)
train_i = []
test_i = []
for i,f in enumerate(files):
abs_path= os.path.join(DATASET_PATH,x,f)
mat = hdf5storage.loadmat(abs_path)
if(i < n):
train_i.append(mat.values())
train_label.append(x)
else:
test_i.append(mat.values())
test_label.append(x)
train_images.append(train_i)
test_images.append(test_i)
最佳答案
1) 您能否在问题 1 中多解释一下您想要什么?附加了什么?我可能误会了,但很容易阅读未知的键值对
for key, value in mat.items():
print(key, value)
2) 我这样做时没有 glob。打乱类文件并根据训练百分比将它们分成两个列表。可能最好为每个类(class)(或关闭类(class))提供相同数量的文件,因此培训不会特别偏爱一个类(class)。
import os
import random
DATASET_PATH = "D:/Dataset/Multi-resolution_data/Visual/High/"
train = {}
test = {}
percent_train = 0.4
class_folders = next(os.walk(DATASET_PATH))[1]
for x in class_folders:
files = os.listdir(os.path.join(DATASET_PATH,x))
random.shuffle(files)
n = int(len(files) * percent_train)
train[x] = files[:n]
test[x] = files[n:]
编辑 2: 这是你的意思吗?
import os
import random
import hdf5storage
import numpy as np
DATASET_PATH = "D:/Dataset/Multi-resolution_data/Visual/High/"
train_images = []
test_images = []
train_label = []
test_label = []
percent_train = 0.4
class_folders = next(os.walk(DATASET_PATH))[1]
for x in class_folders:
files = os.listdir(os.path.join(DATASET_PATH,x))
random.shuffle(files)
n = int(len(files) * percent_train)
for i,f in enumerate(files):
abs_path= os.path.join(DATASET_PATH,x,f)
mat = hdf5storage.loadmat(abs_path)
if(i < n):
train_images.append(mat.values())
train_label.append(x)
else:
test_images.append(mat.values())
test_label.append(x)
编辑 3:为简单起见使用 dict
请注意最后遍历图像是多么简单。另一种方法是存储两个列表(数据和标签),其中一个列表会有很多重复项。然后你必须同时通过它们。
虽然这取决于您稍后要做什么,但两个列表可能是正确的选择。
import os
import random
import hdf5storage
import numpy as np
DATASET_PATH = "D:/Dataset/Multi-resolution_data/Visual/High/"
train_images = {}
test_images = {}
percent_train = 0.4
class_folders = next(os.walk(DATASET_PATH))[1]
for x in class_folders:
files = os.listdir(os.path.join(DATASET_PATH,x))
random.shuffle(files)
n = int(len(files) * percent_train)
for i,f in enumerate(files):
abs_path= os.path.join(DATASET_PATH,x,f)
mat = hdf5storage.loadmat(abs_path)
if(i < n):
train_images[x] = mat.values()
else:
test_images[x] = mat.values()
for img_class,img_data in train_images.items():
print( img_class, img_data )
关于python - 从主文件夹的子文件夹中随机提取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57967261/