将python列表转换为numpy数组时出现值错误

将python列表转换为numpy数组时出现值错误,python,numpy,csv,Python,Numpy,Csv,我正在处理一段由其他人编写的用于域泛化的代码,作为其中一部分,我设置了一个数据加载器,用于加载我的一个数据集的培训、验证和测试数据。当我加载列车或测试数据时,代码工作正常,但当我尝试加载val数据时,我得到值错误:无法在images=np.asarray(images)行的load_samples函数中将输入数组从shape(320371)广播到shape(320)。我明白这个错误在说什么,但我一辈子也弄不明白它为什么这么说。val部分的代码与列车和测试部分的代码相同,我从中读取的csv文件与其

我正在处理一段由其他人编写的用于域泛化的代码,作为其中一部分,我设置了一个数据加载器,用于加载我的一个数据集的培训、验证和测试数据。当我加载列车或测试数据时,代码工作正常,但当我尝试加载val数据时,我得到值错误:无法在images=np.asarray(images)行的load_samples函数中将输入数组从shape(320371)广播到shape(320)。我明白这个错误在说什么,但我一辈子也弄不明白它为什么这么说。val部分的代码与列车和测试部分的代码相同,我从中读取的csv文件与其他两个csv文件的格式完全相同。我还以完全相同的方式为它们调用get_chexpert函数。此外,我的另一个数据集的dataloader与此数据集的代码几乎相同,可以很好地创建验证集。我尝试通过用测试csv替换val csv来测试它是否是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)