Я пытался использовать crop_and_resize , чтобы получить способ увеличения определенных областей изображения в качестве механизма внимания для распознавания мелкозернистых изображений.
Я делаю это хотя на TPU, и при попытке обучения я получаю сообщение об ошибке, говорящее о том, что операция недоступна.
Поэтому я пытаюсь найти способ взять пакет изображений и партия соответствующих координат ограничивающего прямоугольника и размер возвращаемых посевов, размер которых соответствовал размеру исходных изображений.
Я не мог понять, как это сделать в качестве операции над полными тензорами, поэтому я попытался все oop:
result = tf.Variable([tf.image.resize(images[0][tx[0]:tx[0]+tl[0], ty[0]:ty[0]+tl[0], :], [1200, 1200])])
for i in range(1, tf.shape(images)[0]):
result = tf.concat([result, [tf.image.resize(images[i][tx[i]:tx[i]+tl[i], ty[i]:ty[i]+tl[i], :], [1200, 1200])]], axis=0)
Итак, на словах я делаю следующее:
- Инициализация переменной с измененным размером первого изображения в пакете (с соответствующей ограничительной рамкой) )
- Зацикливание на остальной части пакета и конкатенация на мою переменную.
Это прекрасно работает, если я запускаю его как отдельный скрипт, но не работает при попытке обучить или с помощью модели предсказывают:
ValueError: "result" has shape (1, 1200, 1200, 3) before the loop, but shape (2, 1200, 1200, 3) after one iteration. TensorFlow control flow requires it stays the same or be more specific.
Кто-нибудь знает правильный способ сделать это? Могу ли я выполнить операцию обрезки без необходимости l oop?
Мне также интересно, собирается ли Tensorflow узнать, как распространять обратно на этом.
Кстати, я использую Tensorflow 2