检查cifar10是否转换得很好

时间:2017-12-28 12:10:06

标签: python numpy matplotlib

最近我接受了一些关于机器学习的教程,现在我想测试一下我是否可以自己制作一些图像识别程序。为此,我想使用CIFAR 10数据集,但我认为在转换数据集方面存在一个小问题。

对于谁不熟悉此集合:数据集以n行和3072列的列表形式出现,其中前1024列表示红色值,第二列1024表示绿色值,最后一列表示蓝色值。每行是单个图像(大小为32x32),像素行相互堆叠(前32个值是最顶部像素行的红色值等)。

我想用这个数据集做的是将它转换为4D张量(有numpy),所以我可以使用matplotlibs .imshow()查看图像。我制作的张量有这样的形状:(n, 32, 32, 3),所以第一个'维度'存储所有图像,第二个存储像素行,第三个存储单个像素,最后一个表示这些像素的rgb值。这是我做的功能应该这样做:

def rawToRgb(data):
    length = data.shape[0]

    # convert to flat img array with rgb pixels
    newAr = np.zeros([length, 1024, 3])
    for img in range(length):
        for pixel in range(1024):
            newAr[img, pixel, 0] = data[img, pixel]
            newAr[img, pixel, 1] = data[img, pixel+1024]
            newAr[img, pixel, 2] = data[img, pixel+2048]

    # convert to 2D img array
    newAr2D = newAr.reshape([length, 32, 32, 3])
    # plt.imshow(newAr2D[5998])
    # plt.show()
    return newAr2D

它采用单个参数(形状(n, 3072)的张量)。我已经注释了pyplot代码,因为这仅用于测试,但是在测试时,我注意到一切似乎都没问题(我可以识别图像中对象的形状,但我不确定颜色是否良好或者不是,因为我得到了一些奇怪的图像以及一些非常正常的图像......以下是一些示例:purple planeblue catnormal horseblue frog

任何人都可以告诉我,我犯了错误吗?

坦克提前!!

1 个答案:

答案 0 :(得分:2)

出现奇怪颜色的图像是实际图像的negative,因此您需要从255中减去每个像素值以获得真实值。如果您只想查看原始图像的外观,请使用:

from scipy.misc import imread
import matplotlib.pyplot as plt
img = imread(file_path)
plt.imshow(255 - img)
plt.show()

问题的最初原因是CIFAR-10数据以0-255的比例存储像素值,但matplotlib的imshow()方法(我假设您正在使用)期望输入在0和1之间。如果输入未在0和1之间缩放,imshow()会在内部进行一些归一化,这会导致某些图像变为负片。