У меня есть изображение, которое составляет 478 x 717 x 3 = 1028178 пикселей, с рангом 1. Я проверил его, вызвав tf.shape и tf.rank.Уточнение на tf.Tensor.set_shape()
Когда я вызываю image.set_shape ([478, 717, 3]), он выдает следующую ошибку.
"Shapes %s and %s must have the same rank" % (self, other))
ValueError: Shapes (?,) and (478, 717, 3) must have the same rank
Я проверил еще раз, выполнив первое литье до 1028178, но ошибка все еще существует.
ValueError: Shapes (1028178,) and (478, 717, 3) must have the same rank
Ну, это имеет смысл, потому что один имеет ранг 1, а другой имеет ранг 3. Однако, почему необходимо бросить ошибку, так как общее количество пикселей по-прежнему совпадают.
Я мог бы, конечно, использовать tf.resape, и это работает, но я думаю, что это не оптимально.
Как указано на TensorFlow FAQ
В чем разница между x.set_shape() и х = tf.reshape (х)?
Метода tf.Tensor.set_shape() обновляет статическую форму тензорной объекта, и он, как правило, используется, чтобы обеспечить дополнительную информацию ФОРМЫ, когда это не может быть выведено непосредственно. Он не меняет динамическую форму тензора.
Операция tf.reshape() создает новый тензор с другой динамической формой.
Создание нового тензора связано с распределением памяти и потенциально может быть более дорогостоящим, когда задействованы дополнительные примеры обучения. Это по дизайну, или я что-то пропустил?
Реальный вопрос заключается в том, изменил ли тензор Тензорный буфер данных с оригинальным тензором или выполнил ли он копию. Я не мог сказать из быстрого чтения кода, но если он делает копию, это то, что должно быть исправлено. –
mrry выяснил, что это мелкая копия в его ответе ниже. – jkschin