为什么我的机器学习图像如此混乱?
Why are my machine learning images so messy?
我正在使用 Keras 进行机器学习,我的神经网络输出图像。
我的数据是归一化的,所以我将我的网络的输出进行非归一化,然后使用 Image.fromarray
将它们转换为 PIL 图像,然后显示这些图像。
但是,我得到的图像看起来真的很乱。例如它们看起来像:
或
他们应该看起来像什么时候
我的损失正在下降到相当低的数字,当我查看网络的输出值时,它们似乎相当正常。
为什么这些图片显示的这么乱?我能做些什么来修复它?
问题是您的网络输出不完全在 [0, 255] 范围内。
即使您对网络的最后一层使用 sigmoid
函数(这将保证您的输出在 (0, 1) 范围内),当您 "unaverage" 图像时,您可能以某种方式在 [0, 255] 范围之上或之下操纵它们。
这通常与您对图像进行平均的方式有关。就我而言,我认为这是因为当我对我的图像进行平均时,在除以零的情况下我有一个小的 epsilon。取消平均时,这会导致值超出 [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 图像,就像您一直在做的那样。
您得到的图片应该看起来更像您在问题中发布的好图片。 (事实上 ,在您的情况下,它应该看起来 完全 就像您发布的那张好图片;))
我正在使用 Keras 进行机器学习,我的神经网络输出图像。
我的数据是归一化的,所以我将我的网络的输出进行非归一化,然后使用 Image.fromarray
将它们转换为 PIL 图像,然后显示这些图像。
但是,我得到的图像看起来真的很乱。例如它们看起来像:
或
他们应该看起来像什么时候
我的损失正在下降到相当低的数字,当我查看网络的输出值时,它们似乎相当正常。
为什么这些图片显示的这么乱?我能做些什么来修复它?
问题是您的网络输出不完全在 [0, 255] 范围内。
即使您对网络的最后一层使用 sigmoid
函数(这将保证您的输出在 (0, 1) 范围内),当您 "unaverage" 图像时,您可能以某种方式在 [0, 255] 范围之上或之下操纵它们。
这通常与您对图像进行平均的方式有关。就我而言,我认为这是因为当我对我的图像进行平均时,在除以零的情况下我有一个小的 epsilon。取消平均时,这会导致值超出 [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 图像,就像您一直在做的那样。
您得到的图片应该看起来更像您在问题中发布的好图片。 (事实上 ,在您的情况下,它应该看起来 完全 就像您发布的那张好图片;))