Python 从hdf5获取随机数组元素

Python 从hdf5获取随机数组元素,python,hdf5,h5py,Python,Hdf5,H5py,我正在训练一个神经网络,我的训练集存储在一个1.5Tb的hdf5文件中,该文件分为125组(grp0…grp124)。每个组包含2个数据集“x”和“y”,它们是保存为hdf5格式的numpy数组。每个数据集x和y由大约10000个训练示例组成,给出或获取几百个(这些组的大小并不一致,总共约120万个训练示例)。我想做的是从这个hdf5文件动态生成随机训练小批量。现在,生成这样一个批的代码如下所示: #grps is a dictionary of group sizes (they ar

我正在训练一个神经网络,我的训练集存储在一个1.5Tb的hdf5文件中,该文件分为125组(grp0…grp124)。每个组包含2个数据集“x”和“y”,它们是保存为hdf5格式的numpy数组。每个数据集x和y由大约10000个训练示例组成,给出或获取几百个(这些组的大小并不一致,总共约120万个训练示例)。我想做的是从这个hdf5文件动态生成随机训练小批量。现在,生成这样一个批的代码如下所示:

    #grps is a dictionary of group sizes (they are not exactly uniform)
    def data_gen(PATH,grps,batch_size=32):
        while(True): 
            pick_grp = random.randint(0,len(grps)-1)
            size = grps['grp_'+str(pick_grp)]
            indices = random.sample(range(size),batch_size)
            with h5py.File(PATH,'r') as f:
                X = f['grp'+str(pick_grp)]['x'][indices]
                Y = f['grp'+str(pick_grp)]['y'][indices]
                yield (X,Y)
正如你所看到的,我试图做的是选择一个随机的grp,然后从grp中选择一个随机的批量大小的训练示例。对于numpy阵列,这种切片可能会起作用,但显然h5py不支持数据集的这种切片,我得到了错误

    TypeError: Indexing elements must be in increasing order
当我尝试运行此代码时。或者,我可以使用for循环一次手动构造一个批处理培训示例,但我认为这会完全降低代码的速度。我使用GeForce 1080Ti运行小批量,因此在单个小批量上的训练速度非常快。我不想被构造小批量的CPU过程所束缚。有没有一个聪明的方法来做我想做的事?我还考虑过简单地选择一个随机起始索引,然后从GRP中获取一个小批量,如:

    i = random.randint(0,size-batch_size-1)
    X=f['grp'+str(pick_grp)]['x'][i:i+batch_size]

我可以在抓到它后洗牌。但这意味着相邻的训练示例可能总是出现在同一个小批量中。我不知道这会对神经网络训练产生什么样的影响(如果有的话),但它似乎是次优的随机指数切片方法,我现在。理想情况下,我希望能够在一个小批量中从125个组中的任何一个组中抓取示例(由于在生成此hdf5文件期间内存限制,该文件被分割为125个组),但我还没有找到一种方法

我的解决方案是简单地使用
sorted()
索引列表,然后再次洗牌批次:

def data_gen(PATH,grps,batch_size=32):
        while(True): 
            pick_grp = random.randint(0,len(grps)-1)
            size = grps['grp_'+str(pick_grp)]
            indices = random.sample(range(size),batch_size)
            with h5py.File(PATH,'r') as f:
                X = f['grp'+str(pick_grp)]['x'][sorted(indices)]
                Y = f['grp'+str(pick_grp)]['y'][sorted(indices)]
                another_idx = np.random.permutation(X.shape[0]) #shuffle after reading data but not necessary
                yield (X[another_idx],Y[another_idx])

你试过排序
索引吗?哦,哇…真管用!太简单了!英雄联盟你可以将此作为解决方案发布,我会接受。我一直在尝试做完全相同的事情,但能够从你最后提到的125组时装中的任何一组中取样。我的文件大小也不一样。你找到一个可能的解决办法了吗?