我正在使用在另一个问题中找到的自定义反射填充层-
class ReflectionPadding2D(Layer):
def __init__(self, padding=(1, 1), **kwargs):
self.padding = tuple(padding)
self.input_spec = [InputSpec(ndim=4)]
super(ReflectionPadding2D, self).__init__(**kwargs)
def compute_output_shape(self, input_shape):
return (input_shape[0], input_shape[1] + 2 * self.padding[0], input_shape[2] + 2 * self.padding[1], input_shape[3])
def call(self, input_tensor, mask=None):
padding_width, padding_height = self.padding
return pad(input_tensor, [[0,0], [padding_height, padding_height], [padding_width, padding_width], [0,0] ], 'REFLECT')
在训练过程中效果很好。问题是我的模型同时使用(1,1)尺寸填充和(2,2)。当我加载模型以使用该模型时,即使已保存的模型正在使用(2,2), init 函数也会将填充初始化为(1,1),从而为下一个模型提供错误的输出形状层和模型无法加载。
编辑:这是正确加载的一种工作方式(只要在加载模型时将“ pad”添加为自定义对象)。我仍然想找到一种方法来加载已经训练有素的模型,因为我花了几天的时间对其进行训练。
from tensorflow import pad
def reflectPad(inp, p):
return Lambda(lambda x: pad(x, [[0, 0], [p, p], [p, p], [0, 0]], 'REFLECT'))(inp)