为什么我的机器学习图像如此混乱?

时间:2018-07-12 19:12:49

标签: image numpy machine-learning python-imaging-library pillow

我正在用Keras做机器学习,我的神经网络输出图像。

我的数据已标准化,因此我将网络的输出进行标准化,然后使用Image.fromarray将其转换为PIL图像,然后显示这些图像。

但是,我得到的图像看起来非常混乱。例如,它们看起来像: Messy 1

Messy 2

什么时候看起来像

Good 1

我的损失正在下降到相当低的数字,当我查看网络中的输出值时,它们似乎很正常。

这些图像为什么显示得如此凌乱?我该怎么解决?

1 个答案:

答案 0 :(得分:0)

问题是您的网络输出不在[0,255]范围内。

即使您在网络的最后一层使用sigmoid函数(这将确保您的输出在(0,1)范围内),当您对图像进行“平均化”时,您也可能以某种方式在[0,255]范围之上或之下操纵它们。

这通常与您平均图像的方式有关。就我而言,这是因为当我对图像进行平均时,在被零除的情况下,我有一个小的ε。当进行平均时,这会导致值超出[0,255]范围的问题。

解决方案是在将数组变成PIL图像之前,将数组强制设置为[0,255]范围。

我这样做是:

image_array = np.minimum(image_array, np.full(image_array.shape, 255))
image_array = np.maximum(image_array, np.full(image_array.shape, 0))

这会对数组进行两次元素逐个比较,如果值超过255,则将值设置为255,如果值小于0,则将值设置为0。

然后您就可以像以前一样使用生成的image_array并使用Image.fromarray(image_array)将其转换为PIL图像。

您得到的图像应该看起来更像是您在问题中张贴的图像。 (实际上,在您的情况下,它应该看上去完全就像您发布的那张精美图片;))