pytorch-book
pytorch-book copied to clipboard
【已解决】第五章 pytorch中常用的工具 P148 关于怎么将单通道灰度的minist手写数据集 预处理拼成4*4的网格(并不会像书中自动转化为3通道,需自己转化),预处理单通道要么归一化单通道的均值方差,要么将单通道转化为3通道,再归一化三通道
from torchvision import models from torch import nn from torchvision import datasets from torchvision import transforms import torch from torch.utils.data import DataLoader from torchvision.utils import make_grid, save_image from PIL import Image
transform = transforms.Compose([ transforms.RandomSizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), # 因为minist是单通道灰色图,因此此处要么扩展为三通道,要么只对三通道归一化 # transforms.Normalize((0.1307,), (0.3081,)) transforms.Lambda(lambda x: x.repeat(3, 1, 1)), transforms.Normalize(mean=[0.4, 0.4, 0.4], std=[0.2, 0.2, 0.2]),
])
resnet34 = models.resnet34(pretrained=True, num_classes=1000) resnet34.fc = nn.Linear(512, 10)
dataset = datasets.MNIST('data/', download=True, train=False, transform=transform)
to_pil = transforms.ToPILImage()
'''这是将随机的3通道,64*64的显示出来 a = (torch.randn(3, 64, 64)).float() to_pil = transforms.ToPILImage()(a * 0.2 + 0.4) to_pil.show()
to_pil(torch.randn(3, 64, 64)).show()'''
dataloader = DataLoader(dataset, shuffle=True, batch_size=16) dataiter = iter(dataloader) # dataiter为迭代器 print(len(dataiter)) # 10000个手写数据 =16625 ,此处len为 625 data = next(dataiter)[0].float() # a为list对象,通过next获取下一条数据 print('data.size', data.size(), data) # 如果是按照归一化单通道,则tensor [16, 1, 224,224] 否则为[16, 3, 224, 224] img = make_grid(data, 4) # 拼成44的网格图片 to_pil(img).show()
save_image(img, 'a.png') Image.open('a.png')
GitHub原地址 https://github.com/huangpan2507/minist_MakeGrid_show/blob/master/Minist_MakeGrid_Show 欢迎查看
请问你们谁有第十章数据集吗?可以百度云分享一下吗?感激不尽!
感谢楼主提供的两个解决思路!我来把楼主的解决方案整理一下吧
核心的地方就是修改transforms.Compose的参数
下面两段代码的运行结果和教程里边是一致的(具体的图片可能会不一样)
1、
from torchvision import datasets
from torchvision import transforms as T
from torch.utils.data import DataLoader
from torchvision.utils import make_grid
to_img = T.ToPILImage()
transform = T.Compose([
T.RandomResizedCrop(224),
T.RandomHorizontalFlip(),
T.ToTensor(),
#将一个通道的图片转换为三个通道,这样归一化时可以使用三个通道的数据(三维数组)
T.Lambda(lambda x: x.repeat(3, 1, 1)),
T.Normalize(mean=[0.4, 0.4, 0.4], std=[0.2, 0.2, 0.2]),
])
dataset = datasets.MNIST('data/', download=True, train=False,
transform=transform)
dataloader = DataLoader(dataset, shuffle=True, batch_size=16)
dataiter = iter(dataloader)
img = make_grid(next(dataiter)[0], 4)
to_img(img)
2、
from torchvision import datasets
from torchvision import transforms as T
from torch.utils.data import DataLoader
from torchvision.utils import make_grid
to_img = T.ToPILImage()
transform = T.Compose([
T.RandomResizedCrop(224),
T.RandomHorizontalFlip(),
T.ToTensor(),
#因为只有一个通道,所以只需给出一个通道的归一化参数
T.Normalize((0.1307,), (0.3081,))
])
dataset = datasets.MNIST('data/', download=True, train=False,
transform=transform)
dataloader = DataLoader(dataset, shuffle=True, batch_size=16)
dataiter = iter(dataloader)
img = make_grid(next(dataiter)[0], 4)
to_img(img)
嗯。可以的,欢迎交流