项目中,使用Pytorch的torch.utils.data.DataLoader加载自己准备好的数据集。同时想要直观查看或验证生成的数据是否正确。通过直观展示数据–训练数据和标签–来验证数据集。
自定义的数据集是使用PIL库的Image.open读取的图像数据。还是用它来展示验证数据。测试代码如下:
if __name__ == "__main__":
import time
from PIL import Image
playPhoneData = PlayPhoneData("E:/Datasets/玩手机")
# 利用dataloader加载数据集
train_loader = torch.utils.data.DataLoader(playPhoneData, batch_size=1, shuffle=True, drop_last=True)
# 展示和验证数据
for i, (inputs, labels) in enumerate(train_loader, 0):
print(i, inputs[0].shape, labels)
# array = inputs[0]
im1 = Image.fromarray(256 * inputs[0][0].numpy())
im2 = Image.fromarray(256 * inputs[0][1].numpy())
im3 = Image.fromarray(256 * inputs[0][2].numpy())
im = Image.merge("RGB", [im1, im2, im3])
im.show("i")
break
问题描述:ValueError: mode mismatch
代码中:im1 = Image.fromarray(256 * inputs[0][0].numpy())
的inputs
是数据集1个batch的图像。inputs[0]
表示batch中取第一副图像。inputs[0][0]
表示该图像的一个通道。.numpy()
是将tensor转换成数组。256 *
是因为生成图像数据集石对图像做了归一化处理,需要还原。im1,im2,im3
分别表示3个通道,通过merge
函数将他们还原成3通道彩色图像。运行时,报错分析:
- 首先,每一个通道单独展示正常。
- 合并数据时会报错,ValueError: mode mismatch,或者数组数据没有model属性。
原因分析:
转化的im1,im2,im3
3个通道数组没有定义图像模式,需要明确定义model.需要im1,im2,im3
调用convert设置图像模式。
解决方案:
使用im1.convert('L')
定义图像模式。
im1 = Image.fromarray(256 * inputs[0][0].numpy()).convert('L')
im2 = Image.fromarray(256 * inputs[0][1].numpy()).convert('L')
im3 = Image.fromarray(256 * inputs[0][2].numpy()).convert('L')