在使用DataLoader处理完数据集以后,数据里图片的维度和类型会发生改变,具体见下:
# DataLoader之前
print(train_data.data[0].shape) #(32, 32, 3) 原始数据集图像的维度
# DataLoader之后
print(example_imgs[0].shape) #torch.Size([3, 32, 32]),经过DataLoader后,数据的维度会从32,32,3变为3,32,32,即神经网络能够接受的维度
要想在DataLoaer处理完数据后输出图片,这里提供2种方法:
方法一
该方法相当于是使用np.transpose让图片的维度变为原来的样子,然后输出跟原来通道数一致的图片,代码如下(这里设置的batch_size为64,相当于把一个batch全部输出):
examples = enumerate(test) #将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
batch_idx, (example_imgs, example_labels) = next(examples) #next的作用是返回迭代器的下一个项目,这里相当于取出来了test_data的第一个batch
print(batch_idx) #0
print(example_imgs[0].shape) #torch.Size([3, 32, 32]),经过DataLoader后,数据的维度会从32,32,3变为3,32,32,即神经网络能够接受的维度
print(example_labels[0].shape) #torch.Size([])
fig = plt.figure()
for i in range(64):
img=example_imgs[i] #3,32,32是原本图片数据的维度
img=np.transpose(img,(1,2,0)) #32,32,3需要转换成该维度才能输出3通道图片,即彩色图片,这里img已经是tensor格式了,
plt.subplot(8, 8, i + 1) #但可以用np.transpose进行维度转换
plt.imshow(img)
# plt.savefig('CIFAR100')
plt.show()
方法二
该方法没有进行维度转换,而是在图片的后面加了个[i],个人认为是把图片的第i-1个通道输出来了。比如如果原数据集中图片是3通道彩色图片,那么i就可以取0,1,2,而输出的图片仅仅是一个通道;如果图片是只有1个通道的灰度图片,那么i只能取0.代码见下:
examples = enumerate(test_data) #将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
batch_idx, (example_data, example_targets) = next(examples)
print(example_data[0].shape)
fig = plt.figure()
for i in range(64):
plt.subplot(8,8,i+1)
plt.imshow(example_data[i][0])
plt.imshow(img)
plt.show()