我使用tf.extract_image_patches()
来获得重叠补丁的张量
来自this链接中描述的图像。上述链接中的答案建议使用tf.space_to_depth()
从重叠的补丁中重建图像。但问题是,在我的案例中,这并没有给出理想的结果,经过研究,我发现tf.space_to_depth()
没有处理重叠的块。我的代码如下:
import tensorflow as tf
import numpy as np
c = 3
height = 3900
width = 6000
ksizes = [1, 150, 150, 1]
strides = [1, 75, 75, 1]
image = #image of shape [1, height, width, 3]
patches = tf.extract_image_patches(image, ksizes = ksizes, strides= strides, [1, 1, 1, 1], 'VALID')
patches = tf.reshape(patches, [-1, 150, 150, 3])
reconstructed = tf.reshape(patches, [1, height, width, 3])
rec_new = tf.space_to_depth(reconstructed,75)
rec_new = tf.reshape(rec_new,[height,width,3])
这给了我错误:
InvalidArgumentError Traceback(最近一次调用 持续) d:\ AnacondaIDE \ LIB \站点包\ tensorflow \ python的\框架\ common_shapes.py 在_call_cpp_shape_fn_impl中(op,input_tensors_needed, input_tensors_as_shapes_needed,require_shape_fn) 653 graph_def_version,node_def_str,input_shapes,input_tensors, - > 654 input_tensors_as_shapes,status) 655除了errors.InvalidArgumentError为错误:
D:\ AnacondaIDE \ lib \ contextlib.py在退出(自我,类型,价值, 追溯) 87尝试: ---> 88下一个(self.gen) 89除StopIteration外:
d:\ AnacondaIDE \ lib中\站点包\ tensorflow \蟒\框架\ errors_impl.py 在raise_exception_on_not_ok_status()中 465 compat.as_text(pywrap_tensorflow.TF_Message(status)), - > 466 pywrap_tensorflow.TF_GetCode(status)) 467终于:
InvalidArgumentError :尺寸大小必须可被整除 ' Reshape_22'是70200000但是271957500 (输入:'重塑')输入 形状:[4029,150,150,3],[4]并且输入张量计算为 部分形状:输入1 = [?,3900,6000,3]。
在处理上述异常期间,发生了另一个异常:
ValueError 回溯(最近一次通话 最后)in() ----> 1重建= tf.reshape(特征,[-1,高度,宽度,通道]) 2 rec_new = tf.space_to_depth(重建,75) 3 rec_new = tf.reshape(rec_new,[h,h,c])
d:\ AnacondaIDE \ lib中\站点包\ tensorflow \蟒\ OPS \ gen_array_ops.py 重塑(张量,形状,名称)2617""" 2618结果= _op_def_lib.apply_op("重塑",张量=张量,形状=形状, - > 2619 name = name)2620返回结果2621
d:\ AnacondaIDE \ lib中\站点包\ tensorflow \蟒\框架\ op_def_library.py 在apply_op中(self,op_type_name,name,** keywords) 765 op = g.create_op(op_type_name,inputs,output_types,name = scope, 766 input_types = input_types,attrs = attr_protos, - > 767 op_def = op_def) 768如果output_structure: 769输出= op.outputs
D:\ AnacondaIDE \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py in create_op(self,op_type,inputs,dtypes,input_types,name,attrs, op_def,compute_shapes,compute_device)2630
original_op = self._default_original_op,op_def = op_def)2631 if compute_shapes: - > 2632 set_shapes_for_outputs(ret)2633 self._add_op(ret)2634
self._record_op_seen_by_control_dependencies(RET)D:\ AnacondaIDE \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py in set_shapes_for_outputs(op)1909 shape_func = _call_cpp_shape_fn_and_require_op 1910 - > 1911 shapes = shape_func(op)1912如果形状为无:1913引发RuntimeError(
D:\ AnacondaIDE \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py in call_with_requiring(op)1859 1860 def call_with_requiring(OP): - > 1861返回call_cpp_shape_fn(op,require_shape_fn = True)1862 1863 _call_cpp_shape_fn_and_require_op = call_with_requiring
d:\ AnacondaIDE \ lib中\站点包\ tensorflow \蟒\框架\ common_shapes.py 在call_cpp_shape_fn中(op,require_shape_fn) 593 res = _call_cpp_shape_fn_impl(op,input_tensors_needed, 594 input_tensors_as_shapes_needed, - > 595 require_shape_fn) 596如果不是isinstance(res,dict): 597#处理_call_cpp_shape_fn_impl调用unknown_shape(op)的情况。
d:\ AnacondaIDE \ lib中\站点包\ tensorflow \蟒\框架\ common_shapes.py 在_call_cpp_shape_fn_impl中(op,input_tensors_needed, input_tensors_as_shapes_needed,require_shape_fn) 657 missing_shape_fn =真 658否则: - > 659引发ValueError(err.message) 660 661 if missing_shape_fn:
ValueError :尺寸大小必须可被70200000整除,但是 271957500 for' Reshape_22' (op:' Reshape')输入形状: [4029,150,150,3],[4]和输入张量计算为部分 形状:输入1 = [?,3900,6000,3]。
我知道这是由于不兼容的尺寸造成的错误,但它应该是这样的,对吧?请帮我解决这个问题。
答案 0 :(得分:0)
我想问题是,在您发布的链接中,作者使用Navigate | Next Occurrence
和strides
的相同值,而您使用ksizes
等于strides
的一半{ {1}}。这就是为什么尺寸不匹配的原因,您应该在粘贴之前编写减小补丁大小的逻辑(例如,通过选择每个补丁的中心方块)。