Я строю сеть пирамид изображений, где каждый слой выводит сетку передискретизации, поэтому мне нужно передискретизировать изображение на каждом уровне пирамиды. Я использую функцию dense_image_warp
из tensorflow_addons
(не нашел другой ...) для повторной выборки изображения.
С этой функцией много проблем, и один из них распечатывает следующее сообщение несколько раз:
ПРЕДУПРЕЖДЕНИЕ: tenorflow: 7 из последних 11 вызовов сработавшего восстановления функции tf. Трассировка стоит дорого, и чрезмерное количество трассировок, вероятно, связано с передачей python объектов вместо тензоров. Кроме того, tf.function имеет параметр экспериментальной_relax_shapes = True, который смягчает формы аргументов, чтобы избежать ненужного повторения. Пожалуйста, обратитесь к https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args и https://www.tensorflow.org/api_docs/python/tf/function для получения более подробной информации.
Я попытался обернуть слой Lambda
, в значительной степени проблема . Я также попытался создать собственный слой, используя подклассы, снова безуспешно.
Пример кода:
def pyramid_net(num_levels):
in_image = Input(shape=(INPUT_HEIGHT, INPUT_WIDTH, 3))
# using average pooling to downscale
in_image_pyramid = CreateImagePyramid(num_levels)(in_image)
x = in_image_pyramid[0]
for level in range(num_levels):
resampler = SequenceOfConv2D(x)
if level==num_levels-1:
break
x = tfa.image.dense_image_warp(in_image_pyramid[level+1], resampler)
# for some reason the outputs is of None shape
x.set_shape(in_image_pyramid[level+1].shape)
return Model(inputs=[in_image], outputs=[resampler])
network = pyramid_net(3)
test_image = tf.random.normal((1, INPUT_HEIGHT, INPUT_WIDTH, 3))
output = network(test_image)