在 Pytorch 中为 HDF5 文件创建数据集和数据加载器时出现问题:没有足够的值来解包(预期 2,得到 1)

Posted

技术标签:

【中文标题】在 Pytorch 中为 HDF5 文件创建数据集和数据加载器时出现问题:没有足够的值来解包(预期 2,得到 1)【英文标题】:Trouble crating Dataset and Dataloader for HDF5 file in Pytorch: not enough values to unpack (expected 2, got 1) 【发布时间】:2020-03-30 02:38:42 【问题描述】:

使用 Torchvision 的数据集后,我尝试在 Pytorch 中加载 HDF5 文件,但没有成功。我读到我应该定义我自己的 Dataset 和 Dataloader 类,其中包含 getitem 以启用索引和 len 以返回数据集的长度。另外,我应该定义转换,因为 pytorch 的默认选项需要 PIL 图像。我尝试这样做,但我收到错误“ValueError:没有足够的值来解包(预期 2,得到 1)”我做错了什么?

#PyTorch packages
import torch
from torch.utils.data import Dataset, DataLoader
import torch.nn as nn
import torch.nn.functional as F
import torchvision
from torchvision import transforms, datasets
from torch import optim
from torch.autograd import Variable 
from torch.utils import data

import h5py 
import numpy as np
import matplotlib.pyplot as plt

torch.manual_seed(0)

#open training file
with h5py.File('train_catvnoncat.h5', 'r') as hdf:
    ls = list(hdf.keys())
    print('List of datasets in this file: \n', ls)
    data = hdf.get('dataset')
    dataset1 = np.array(data)
    print('Shape of dataset1: \n', dataset1.shape)  
    length = len(h5py.File('train_catvnoncat.h5', 'r'))
    print(length)

#image size (64,64,3) 64*64*3=12,288. 
#209 training examples 
#50 test examples

# Example of a picture

#image size (64,64,3) 64*64*3=12,288. 
#209 training examples 
#50 test examples

#Def the dataloader for h5 files:

class HDF5Dataset(Dataset):   
    def __init__(self, h5_path):
        self.h5_path = '/Users/teff/Downloads/'
        self.train = train_catvnoncat.h5(h5_path, 'r')
        self.train = test_catvnoncat.h5(h5_path, 'r')
        self.length = len(h5py.File(h5_path, 'r')) 
        # self.transform = transform_hdf5    #I need to define the "transformToTensor"

    def __getitem__(self, index): #to enable indexing
        record = self.train[str(index)]
        return (
                record['X'].value,
                record['y'].value,
        )

    def __len__(self): #returns the lenght of the dataset
        return self.length


train_loader = torch.utils.data.DataLoader('train_catvnoncat.h5', shuffle=True)
test_loader = torch.utils.data.DataLoader('test_catvnoncat.h5', shuffle=True)

【问题讨论】:

【参考方案1】:

您的数据集应如下所示:

import torchvision.transforms as transforms

class HDF5Dataset(Dataset):

    transform = transforms.Compose([
        transforms.RandomHorizontalFlip(p=0.5),
        transforms.ToTensor(),
        transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
    ])

    def __init__(self, h5_path):
        self.h5_path = '/Users/teff/Downloads/'
        self.train = test_catvnoncat.h5(h5_path, 'r')
        self.length = len(h5py.File(h5_path, 'r')) 

    def __getitem__(self, index): #to enable indexing
        record = self.train[str(index)]
        image = record['X'].value

        # transform to PIL image
        image = Image.fromarray(pixels.astype('uint8'), 'RGB') # assume your data is  uint8 rgb
        label = record['y'].value

        # transformation here
        # torchvision PIL transformations accepts one image as input
        image = self.transform(image)
        return (
                image,
                label,
        )

    def __len__(self):
        return self.length

PS 看看 great tutorial 了解 pytorch 数据加载。

【讨论】:

谢谢,格里高利!我看到您没有定义不同的转换,而是选择首先将图像转换为 PIL 以便能够使用默认转换。这说得通。现在查看教程。 要转换为 PIL 图像,可以使用“transforms.ToPILImage()”。为什么要使用您告诉我的代码行?我不明白......为什么你需要使用 transforms.RandomHorizo​​ntalFlip(p=0.5)? 没什么大区别,可以用transforms.TiPILImage。我想在格式之间使用显式转换。 @GrigoryFeldman 你在任何地方都没有.close() h5py 数据集不是很危险吗?

以上是关于在 Pytorch 中为 HDF5 文件创建数据集和数据加载器时出现问题:没有足够的值来解包(预期 2,得到 1)的主要内容,如果未能解决你的问题,请参考以下文章

在 Matlab 中转置 Python 创建的 HDF5 数据集

将多个数据集读/写到单个 HDF5 文件

在 HDF5 文件中创建和访问数据集

如何在 HDF5 C# 上创建复合数据集

在HDF5文件中创建和访问数据集

从时间戳图像对创建 HDF5 数据集的最佳方法是啥?