Python Keras在训练后合并成批的单个图像
我使用自动编码器去噪高分辨率的灰度图像。每个图像被分成特定大小的子批次,即Python Keras在训练后合并成批的单个图像,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我使用自动编码器去噪高分辨率的灰度图像。每个图像被分成特定大小的子批次,即52 x 52,模型在每个批次上工作,然后结果是将每个图像中的去噪批次连接回原始批次。以下是结果后的图像示例: 连接后,您可以看到较小的图像批次。如何克服这种行为 我考虑过做进一步的处理,比如给边缘添加模糊来将它们混合在一起,但是我认为这不是最佳解决方案 连接代码: num_hor_patch = 19 num_ver_patch = 26 print("Building the Images Batche
52 x 52
,模型在每个批次上工作,然后结果是将每个图像中的去噪批次连接回原始批次。以下是结果后的图像示例:
连接后,您可以看到较小的图像批次。如何克服这种行为
我考虑过做进一步的处理,比如给边缘添加模糊来将它们混合在一起,但是我认为这不是最佳解决方案
连接代码:
num_hor_patch = 19
num_ver_patch = 26
print("Building the Images Batches")
for i in range(num_image):
reconstruct = []
for j in range(num_hor_patch):
from_vertical_patches = predictions[start_pos:(start_pos+num_ver_patch)]
horizontal_patch = np.concatenate(from_vertical_patches, axis=1)
start_pos += num_ver_patch
reconstruct.append(horizontal_patch)
restored_image = np.concatenate(np.array(reconstruct), axis=0)
output.append(restored_image)
start_pos = 0
test_data = np.array([np.reshape(test_data[i], (52, 52)) for i in range(test_data.shape[0])])
for i in range(num_image):
reconstruct = []
for j in range(num_hor_patch):
from_vertical_patches = test_data[start_pos:(start_pos+num_ver_patch)]
horizontal_patch = np.concatenate(from_vertical_patches, axis=1)
start_pos += num_ver_patch
reconstruct.append(horizontal_patch)
restored_image = np.concatenate(np.array(reconstruct), axis=0)
input.append(restored_image)
start_pos = 0
test_noisy_data = np.array([np.reshape(test_noisy_data[i], (52, 52)) for i in range(test_noisy_data.shape[0])])
for i in range(num_image):
reconstruct = []
for j in range(num_hor_patch):
from_vertical_patches = test_noisy_data[start_pos:(start_pos+num_ver_patch)]
horizontal_patch = np.concatenate(from_vertical_patches, axis=1)
start_pos += num_ver_patch
reconstruct.append(horizontal_patch)
restored_image = np.concatenate(np.array(reconstruct), axis=0)
noisy.append(restored_image)
print("Exporting the Model")
output_model['output'] = output
output_model['original'] = input
output_model['noisy'] = noisy
如果我错了,请纠正我,但您有以下问题:
- 去噪自动编码器,获得52x52图像
- 尺寸为HxW的图像,其中W>>52和H>>52
从图像中可以看出,您正在处理的是~400x800分辨率的图像。对于这一点,V100 GPU的16GB-32GB内存应该足以满足具有适当型号容量的适当批量大小!即使没有,您也可以使用混合精度甚至fp16将内存利用率降低2到4倍 如果您的分辨率太高,无法玩这些把戏,那么理想情况下,您需要通过在GPU上分割图像块(空间分区),并在向前和向后传递期间在计算图中的这些域之间交换张量来实现模型并行方法。这将使修补程序保持一致,但可能会导致严重的性能瓶颈 您可以看看这个UNET体系结构,它必须从Conv3D转换到Conv2D,并从分割转换到去噪任务
你好!为什么不将整个图像立即传递到自动编码器并获得结果?这也会缩短你的推理时间。此外,坚持你目前的方法,你也可以遵循这一点。谢谢你的评论@RishabP。不幸的是,这些图像无法放入可用的内存中。如果您推荐了另一种解决方案使之成为可能,请用它回答问题!你能告诉我,你如何确保从重叠的瓷砖中获取像素的平均值会导致沿着图像边界的平滑过渡?你能提供一个大小为200x200的图像的非常简单的例子吗?我不能确定它是否会窒息,但它认为,因为每个像素都将参与几个瓷砖,它将更接近它的黑鬼,很抱歉,我不能提供一个例子。我将尝试后一种解决方案。我正在处理最小1000x1000灰度的图像。我只裁剪了一部分,以明确您可能需要在GCP中使用TPU内核来实现此体系结构。他们没有很好地解释如何在GPU上运行它。