最近我看了一些关于机器学习的教程,现在我想测试一下我是否可以自己制作一些图像识别程序。为此,我想使用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 plane,blue cat,normal horse,blue frog。在
谁能告诉我我是不是犯了错?在
出现奇怪颜色的图像是实际图像的negative,因此需要从255减去每个像素值,以获得真正的值。如果您只想查看原始图像的外观,请使用:
问题的原始原因是CIFAR-10数据以0-255的比例存储像素值,但是matplotlib的
imshow()
方法(我假设您正在使用)需要输入介于0和1之间。给定一个不在0和1之间缩放的输入,imshow()
会在内部进行一些标准化,这会导致一些图像变为负片。在相关问题 更多 >
编程相关推荐