У меня есть изображение размером 478 x 717 x 3 = 1028178 пикселей с ранга 1. Я проверил его, вызвав tf.shape и tf.rank.
Когда я вызываю 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, и это работает, но я думаю, что это не оптимально.
Как указано в FAQ TensorFlow
В чем разница между x.set_shape() и x = tf.reshape(x)?
Метод tf.Tensor.set_shape() обновляет статическую форму объекта Tensor, и он обычно используется для предоставления дополнительной информации о форме, когда это невозможно определить непосредственно. Он не меняет динамическую форму тензора.
Операция tf.reshape() создает новый тензор с другой динамической формой.
Создание нового тензора связано с распределением памяти и потенциально может быть более дорогостоящим, когда задействованы дополнительные примеры обучения. Это по дизайну, или я что-то пропустил?