pytorch 4d numpy数组在自定义数据集中应用转换

pytorch 4d numpy数组在自定义数据集中应用转换,pytorch,torchvision,Pytorch,Torchvision,在我的自定义数据集中,我想将transforms.Compose应用于NumPy数组 from torchvision import transforms import numpy as np import torch img_transform = transforms.Compose([ transforms.Scale((224,224)), transforms.ToTensor(), transforms.Normalize([0.46

在我的自定义数据集中,我想将transforms.Compose应用于NumPy数组

from torchvision import transforms
import numpy as np
import torch

img_transform = transforms.Compose([
        transforms.Scale((224,224)),
        transforms.ToTensor(),
        transforms.Normalize([0.46, 0.48, 0.51], [0.32, 0.32, 0.32])
    ])

a = np.random.randint(0,256, (299,299,3))
print(a.shape)

img_transform(a)
我的图像采用NumPy数组格式,具有形状num_样本、宽度、高度和通道

如何将以下转换应用于完整的numpy数组

img_transform=transforms.Compose[ transforms.scale22424, ToTensor先生, 变换.规格化[0.46,0.48,0.51],[0.32,0.32,0.32] ]

我的尝试以多个错误告终,因为转换接受的是PIL图像而不是4-d NumPy数组

from torchvision import transforms
import numpy as np
import torch

img_transform = transforms.Compose([
        transforms.Scale((224,224)),
        transforms.ToTensor(),
        transforms.Normalize([0.46, 0.48, 0.51], [0.32, 0.32, 0.32])
    ])

a = np.random.randint(0,256, (299,299,3))
print(a.shape)

img_transform(a)

所有torchvision变换都在单个图像上操作,而不是批量图像,因此不能使用4D阵列

如代码示例中所示,作为NumPy数组给出的单个图像可以通过将它们转换为PIL图像来使用。您可以简单地添加到转换管道的开头,因为它将张量或NumPy数组转换为PIL图像

img_transform=transforms.Compose[ transforms.ToPILImage, transforms.Resize224, ToTensor先生, 变换.规格化[0.46,0.48,0.51],[0.32,0.32,0.32] ] 注:不推荐使用,赞成使用

在您的示例中,您使用了np.random.randint,默认情况下它使用int64类型,但是图像必须是uint8。加载图像时,OpenCV等库返回uint8数组

a=np.random.randint02562999,3,dtype=np.uint8
谢谢,那么我应该对自定义数据集4-d NumPy数组中的每个图像分别应用变换吗?我有几百万张图片,单独应用可能会变慢,你认为这是一种方法吗?如果你有一百万张图片,你应该根据需要将它们加载到数据集的u_getitem_uu_u中,然后将转换应用到单个图片。这样,当使用DataLoader时,图像可以在后台工作人员中加载和转换,而不必在主进程中进行加载和转换。谢谢,这很有意义。因此,在uu getitem_uuu内,将传递一个图像的单个idx,我可以在那里应用变换。据我所知,如果我没有弄错的话,_getitem__;可以处理数据集中的单个数据点。是的,它是单个图像。但我所说的按需加载图像的意思是,您只保留数据集中图像的路径,而不是内存中的所有图像,然后加载指定id的图像,然后应用转换。在内存中保存一百万个图像可能会有问题,或者至少需要大量RAM。感谢您的建议,对于我的情况,原始数据集是一个大而胖的NumPy数组,好主意,也许我可以将它们恢复到图像以节省一些RAM内存。不过就我而言,我的ram似乎不需要128 Gig,而且我的训练是在GPU上进行的,所以加载完整的NumPy阵列对我来说有点快。