У меня есть код TensorFlow в настраиваемой функции потерь.
Я использую tf.Print(node, [debug1, debug2], "print my debugs: ")
Он работает нормально, но TF говорит, что tf.Print
является устаревшим и будет удален после обновления TensorFlow и что я должен использовать tf.**p**rint()
с маленьким p.
Я пробовал использовать tf.print
так же, как и tf.Print()
, но он не работает. Как только я помещаю свою модель в Керас, я получаю сообщение об ошибке. В отличие от tf.Print
, tf.print
, кажется, принимает все, что **kwargs
, так что я могу дать ему? и, в отличие от tf.Print
, похоже, что он не возвращает то, что я могу ввести в вычислительный граф.
Искать действительно сложно, потому что вся информация в сети посвящена tf.Print()
.
Может кто-нибудь объяснить, как использовать tf.print()
?
Обновлено: пример кода
def custom_loss(y_true, y_pred):
loss = K.mean(...)
print_no_op = tf.Print(loss, [loss, y_true, y_true.shape], "Debug output: ")
return print_no_op
model.compile(loss=custom_loss)
В документации tf.print
и tf.Print
упоминается, что tf.print
возвращает операцию без вывода, поэтому ее нельзя оценить как какое-либо значение. Синтаксис tf.print
должен быть больше похож на встроенный в Python print
. В вашем случае вы можете использовать его следующим образом:
def custom_loss(y_true, y_pred):
loss = K.mean(...)
print_op = tf.print("Debug output:", loss, y_true, y_true.shape)
with tf.control_dependencies([print_op]):
return K.identity(loss)
Здесь K.identity
создает новый тензор, идентичный loss
, но с зависимостью управления от print_op
, поэтому его оценка приведет к принудительному выполнению операции печати. Обратите внимание, что Keras также предлагает K.print_tensor
, хотя он менее гибкий, чем tf.print
.
@CodeMonkey Нет, print_op
не имеет никакого значения, действительно имеет смысл использовать его только с tf.control_dependencies
, чтобы гарантировать его выполнение (я немного изменил пример кода). Если вы опубликуете часть своего кода, возможно, будет проще объяснить, как внести изменения.
Я добавил пример функции. Обратите внимание, что я использую Keras, поэтому я не совсем уверен, как это вписывается во внутреннюю работу TensorFlow. Print_no_op вернет переменную потерь после оценки, но также распечатает выходные данные отладки в списке.
Спасибо, я первым делом попробую, когда вернусь домой, и перезвоню вам :)
Хорошее обсуждение здесь: github.com/tensorflow/community/pull/14/files. Кажется, что tf.print был создан для активного выполнения, и эта дополнительная боль при выполнении графа была всего лишь ценой. Предположительно, вы не должны нуждаться в операторах печати, когда находитесь в режиме графика.
Просто небольшое дополнение к отличному ответу jdehesa:
tf.tuple можно использовать для объединения операции печати с другой операцией, которая затем будет запускаться с этой операцией в зависимости от того, какой сеанс выполняет график. Вот как это делается:
print_op = tf.print(something_you_want_to_print)
some_tensor_list = tf.tuple([some_tensor], control_inputs=[print_op])
# Use some_tensor_list[0] instead of any_tensor below.
Как мне использовать это в настраиваемой функции потерь с помощью Keras? Мог бы я просто включить переменную print_op в некоторые вычисления, как если бы я использовал tf.Print?