将python列表转换为numpy数组时出现值错误
我正在处理一段由其他人编写的用于域泛化的代码,作为其中一部分,我设置了一个数据加载器,用于加载我的一个数据集的培训、验证和测试数据。当我加载列车或测试数据时,代码工作正常,但当我尝试加载val数据时,我得到值错误:无法在images=np.asarray(images)行的load_samples函数中将输入数组从shape(320371)广播到shape(320)。我明白这个错误在说什么,但我一辈子也弄不明白它为什么这么说。val部分的代码与列车和测试部分的代码相同,我从中读取的csv文件与其他两个csv文件的格式完全相同。我还以完全相同的方式为它们调用get_chexpert函数。此外,我的另一个数据集的dataloader与此数据集的代码几乎相同,可以很好地创建验证集。我尝试通过用测试csv替换val csv来测试它是否是csv文件,但仍然得到相同的错误。有人能指出我做错了什么吗?我觉得这一定是个愚蠢的明显错误,但我就是看不出来将python列表转换为numpy数组时出现值错误,python,numpy,csv,Python,Numpy,Csv,我正在处理一段由其他人编写的用于域泛化的代码,作为其中一部分,我设置了一个数据加载器,用于加载我的一个数据集的培训、验证和测试数据。当我加载列车或测试数据时,代码工作正常,但当我尝试加载val数据时,我得到值错误:无法在images=np.asarray(images)行的load_samples函数中将输入数组从shape(320371)广播到shape(320)。我明白这个错误在说什么,但我一辈子也弄不明白它为什么这么说。val部分的代码与列车和测试部分的代码相同,我从中读取的csv文件与其
import os
import csv
from PIL import Image
import numpy as np
import torch
import torch.utils.data as data
from torchvision import datasets, transforms
import params
class Chexpert(data.Dataset):
def __init__(self, root, train=True, val=False, transform=None):
"""Init chexpert dataset."""
# init params
self.root = os.path.expanduser(root)
self.train = train
self.val = val
self.transform = transform
self.dataset_size = None
self.train_data, self.train_labels = self.load_samples()
if self.train:
total_num_samples = self.train_labels.shape[0]
indices = np.arange(total_num_samples)
np.random.shuffle(indices)
self.train_data = self.train_data[indices[0:self.dataset_size]]
self.train_labels = self.train_labels[indices[0:self.dataset_size]]
def __getitem__(self, index):
"""Get images and target for data loader.
Args:
index (int): Index
Returns:
tuple: (image, target) where target is index of the target class.
"""
img, label = self.train_data[index], self.train_labels[index]
if self.transform is not None:
img = self.transform(img)
label = torch.LongTensor([np.int64(label).item()])
return img, label
def __len__(self):
"""Return size of dataset."""
return self.dataset_size
def load_samples(self):
"""Load sample images from dataset."""
# some arbitrary limits so I'm not loading 100,000 images while debugging
numtr = 50
numts = 20
numvl = 10
data_root = os.path.join(self.root, 'CheXpert-v1.0-small')
images = []
labels = []
if self.val:
val_info = csv.reader(open(os.path.join(data_root, 'effusion-val-split.csv'), 'r'))
for count, row in enumerate(val_info):
if count == numvl:
break
image = np.array(Image.open(os.path.join(self.root, row[0])))
images.append(image)
labels.append(row[1])
elif self.train:
train_info = csv.reader(open(os.path.join(data_root, 'effusion-train-split.csv'), 'r'))
for count, row in enumerate(train_info):
if count == numtr:
break
image = np.array(Image.open(os.path.join(self.root, row[0])))
images.append(image)
labels.append(row[1])
elif not self.val and not self.train:
test_info = csv.reader(open(os.path.join(data_root, 'effusion-test-split.csv'), 'r'))
for count, row in enumerate(test_info):
if count == numts:
break
image = np.array(Image.open(os.path.join(self.root, row[0])))
images.append(image)
labels.append(row[1])
images = np.asarray(images)
labels = np.asarray(labels)
self.dataset_size = labels.shape[0]
return images, labels
def get_chexpert(train, val):
"""Get chexpert dataset loader."""
# image pre-processing
pre_process = transforms.Compose([transforms.ToPILImage(),
transforms.Resize((224, 224)),
transforms.ToTensor(),
#transforms.Normalize(
#mean=params.dataset_mean,
#std=params.dataset_std)])
])
# dataset and data loader
chexpert_dataset = Chexpert(root=params.data_root,
train=train,
val=val,
transform=pre_process)
chexpert_data_loader = torch.utils.data.DataLoader(
dataset=chexpert_dataset,
batch_size=params.batch_size,
shuffle=True)
return chexpert_data_loader
我怀疑
images
是一个形状不同的数组列表。它无法制作3d阵列。有时,它需要创建一维对象数组。有时它会因为这样的错误而失败。一定是这样。我的另一个数据集中的图像都是1024x1024,但在这个数据集中有一些可变大小的图像。大多数是390x390,但也有一些在390左右有不同的高度。不过,火车和测试设备也是如此。为什么这一套失败了,而其他的仍然有效?在任何情况下,在将图像添加到阵列之前,我都会尝试将图像大小调整为标准大小。
if __name__ == '__main__':
# load dataset
print("Loading Source Train Data")
src_data_loader = get_chexpert()
print("Loading Source Validation Data")
src_data_loader_val = get_chexpert(train=False, val=True)
print("Loading Source Test Data")
src_data_loader_eval = get_chexpert(train=False)
print("Loading Target Train Data")
tgt_data_loader = get_nih()
print("Loading Target Validation Data")
tgt_data_loader_val = get_nih(train=False, val=True)
print("Loading Target Test Data")
tgt_data_loader_eval = get_nih(train=False)