我正在用Keras做机器学习,我的神经网络输出图像。
我的数据已标准化,因此我将网络的输出进行标准化,然后使用Image.fromarray
将其转换为PIL图像,然后显示这些图像。
或
什么时候看起来像
我的损失正在下降到相当低的数字,当我查看网络中的输出值时,它们似乎很正常。
这些图像为什么显示得如此凌乱?我该怎么解决?
答案 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图像。
您得到的图像应该看起来更像是您在问题中张贴的图像。 (实际上,在您的情况下,它应该看上去完全就像您发布的那张精美图片;))