Deep learning 如何在pytorch中将多个灰度图像作为单个张量加载?

Deep learning 如何在pytorch中将多个灰度图像作为单个张量加载?,deep-learning,conv-neural-network,pytorch,Deep Learning,Conv Neural Network,Pytorch,我目前正在尝试使用一个堆栈,将一组图像作为每个标签的单个实体,来训练CNN使用交叉验证。给定一个由224x224x1灰度图像组成的数据集,按以下顺序排序: Root/ Class0/image0_view0.png Class0/image0_view1.png Class0/image0_view2.png ... Class1/image0_view0.png Class1/image0_view1.png Class1/image0_

我目前正在尝试使用一个堆栈,将一组图像作为每个标签的单个实体,来训练CNN使用交叉验证。给定一个由224x224x1灰度图像组成的数据集,按以下顺序排序:

Root/
    Class0/image0_view0.png
    Class0/image0_view1.png
    Class0/image0_view2.png
    ...
    Class1/image0_view0.png
    Class1/image0_view1.png
    Class1/image0_view2.png
如何将3个图像(视图0、1和2)作为一个维度为224x224x3(3个灰度图像)的张量流动?换句话说,如何使用ImageFolder/DatasetFolder和DataLoader在pytorch中创建图像堆栈的数据集?我是否需要重新组织我的文件夹和类,或者在进行交叉验证拆分时是否更容易创建堆栈

谢谢你的时间和帮助!如果我能提供更多信息,请告诉我

如何在pytorch中将多个灰度图像作为单个张量加载

一般来说,通道的数量并不重要

所谓的“加载一批数据”操作就是您所需要的。因为这个小火把有等级
DataLoader
class进一步需要
Dataset
class

如果在
DataLoader
中,批处理大小为64(bs=64),您将从一次加载64个图像作为tensor

如果使用,则不会为您返回minibatch<代码>图像文件夹是一个
数据集
派生类

ImageFolder
(如果您只是使用它)的问题是,每个索引将获得一张图像。然后将多个图像合并为一个小批量

下面是一个使用带有CIFAR10数据的
ImageFolder
的示例

from torchvision import transforms
imagef = torchvision.datasets.ImageFolder(r'C:\Users\dj\data\cifar10\test', transform=transforms.ToTensor())

print(imagef)
print(imagef.classes)
img, label = imagef[0]
display(img)
print(img.size())
print(label)
输出:

下一个示例基于
DataLoader

import torch
from torch.utils.data import DataLoader, Dataset
import torchvision
from torchvision import transforms
import PIL.Image as Image

def pil_loader(path):    
    with open(path, 'rb') as f:
        img = Image.open(f)
        return img.convert('RGB')

ds = torchvision.datasets.DatasetFolder(r'C:\Users\dj\data\cifar10\test', 
                                        loader=pil_loader, 
                                        extensions=('.png'), 
                                        transform=transforms.ToTensor())
dl = DataLoader(ds, batch_size=2)
len(dl)
for imgs,lbls in dl:    
    print(imgs.size()) # torch.Size([2, 3, 32, 32])
    break 
这是您可能需要的
DataLoader
。我现在介绍的一个具有自定义加载功能:
pil\u loader

您还可以使用
ImageFolder
而不是上一示例中的
DatasetFolder

这大概是:

ds =  torchvision.datasets.ImageFolder(r'C:\Users\dj\data\cifar10\test', transform=transforms.ToTensor())
dl = DataLoader(ds, batch_size=3)
print(len(dl))

for imgs,lbls in dl:    
    print(imgs.size())
    break    

你为什么要这样做?您希望图像的通道是其他图像吗?如果我知道原因,我也许能更好地指导你。看起来你想要的东西根本不需要pytorch。你只需要读入图像并将其堆叠,然后将它们保存为一个有3个通道的新图像。这对我来说很有意义。我想这样做是因为每个标签并不总是在一张图片上看到,当我尝试将所有3张图片拼接成一张图片时,CNN也没有表现得那么好。好吧,我觉得你有一个分类问题,类可能只能从同一对象的3个“视图”中的1个看到。与其将图像合并在一起并尝试分类,我可能建议只为所有3个图像单独生成分类,然后将预测合并为一个。因此,如果view0预测了类1,view1没有,view2预测了类2,那么总体预测将是类1和类2。这些标签是为图像集生成的,因此,尽管确实可以执行您的建议,但这将更加耗时,计算成本也会更高。你对图像堆叠有什么担心?我不认为使用批处理可以解决这个问题。OP似乎希望将所有3个图像作为单个输入传递到网络中并生成单个标签。在批处理的情况下,这将导致大量预测等于批处理大小。
ds =  torchvision.datasets.ImageFolder(r'C:\Users\dj\data\cifar10\test', transform=transforms.ToTensor())
dl = DataLoader(ds, batch_size=3)
print(len(dl))

for imgs,lbls in dl:    
    print(imgs.size())
    break