python 基本CNN的输入类型和偏倚类型出错

xqkwcwgp  于 2023-01-24  发布在  Python
关注(0)|答案(1)|浏览(121)

我希望你们都有一个美好的夜晚!(或者一天中的任何时候)我正在尝试跟随一个用pytorch(Link)制作CNN的指南。我没有使用CIFAR-10数据集,而是制作了自己的数据集。我认为这就是问题所在,但我不知道发生了什么。下面是我的错误:

这听起来很傻,但是我试着按照指南去做,期望成功,却遇到了这些错误。我试着在网上搜索一些可能的解决方案,努力寻找任何可能对我有帮助的资源。我没有在stackoverflow上看到任何与我的问题直接相同的东西,所以我想我应该试着寻求帮助!
我还将与您分享我的Dataset类:

class ASLDataset(torch.utils.data.Dataset): # inheritin from Dataset class
    def __init__(self, csv_file, root_dir="", transform=None):
        self.annotation_df = pd.read_csv(csv_file)
        self.root_dir = root_dir # root directory of images, leave "" if using the image path column in the __getitem__ method
        self.transform = transform

    def __len__(self):
        return len(self.annotation_df) # return length (numer of rows) of the dataframe

    def __getitem__(self, idx):
        image_path = os.path.join(self.root_dir, self.annotation_df.iloc[idx, 1]) #use image path column (index = 1) in csv file
        image = cv2.imread(image_path) # read image by cv2
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # convert from BGR to RGB for matplotlib
        class_name = self.annotation_df.iloc[idx, 2] # use class name column (index = 2) in csv file
        class_index = self.annotation_df.iloc[idx, 3] # use class index column (index = 3) in csv file
        if self.transform:
            image = self.transform(image)
        return image, class_index #, class_name

train_dataset = ASLDataset('./train.csv') #, train_transform)
train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers)

val_dataset = ASLDataset('./test.csv')  # val.csv
val_dataloader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False, num_workers=num_workers)

classes = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'nothing', 'O', 'P', 'Q', 'R', 'S', 'space', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z')

以下是错误代码中出现的行以及指南中的网络:
x一个一个一个一个x一个一个二个x
我很感激任何帮助,谢谢你的时间!让我知道如果我需要显示任何其他东西,上帝保佑你们所有人!

mzillmmw

mzillmmw1#

通过进一步的工作和一些外部帮助,我能够得到这个问题的答案。我的问题部分在于我的类定义和我在代码后面调用一些项的方式。我应该有以下内容,而不是在init中定义没有转换的ASLDataset类:

class ASLDataset(torch.utils.data.Dataset): # inheritin from Dataset class
    def __init__(self, csv_file, root_dir="", transform=transforms.ToTensor()):
        self.annotation_df = pd.read_csv(csv_file)
        self.root_dir = root_dir # root directory of images, leave "" if using the image path column in the __getitem__ method
        self.transform = transform
        
        ....

当我开始将输入转换为Tensor时,我还必须改变后面调用return的方式,无论何时调用图像或标签(我将class_index重命名为它们),我都必须这样调用它们:

#Define the device which will be used for processing
            device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

            #Modify both the images and the labels so that they are stored as tensors
            images = images.to(device)
            labels = labels.to(device)

请记住,图像和标签是ASL数据集类的getitem的返回值:

def __getitem__(self, idx):
        image_path = os.path.join(self.root_dir, self.annotation_df.iloc[idx, 1]) #use image path column (index = 1) in csv file
        # image = read_image(image_path)

        print("Got item")

        image = cv2.imread(image_path) # read image by cv2
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # convert from BGR to RGB for matplotlib
        label = self.annotation_df.iloc[idx, 3]
        if self.transform:
            image = self.transform(image)
        return image, label

我希望这个答案对那些现在和将来都在这个问题或类似问题上挣扎的人有帮助,上帝保佑你们所有人!

相关问题