Theano - значение печати TensorVariable
Как напечатать числовое значение anano TensorVariable?
Я новичок в theanano, поэтому, пожалуйста, будьте терпеливы:)
У меня есть функция, где я получаю y
как параметр.
Теперь я хочу отлаживать-напечатать форму этого y
на консоли.
Использование
print y.shape
выводит вывод консоли (i ожидал числа, т.е. (2,4,4)
):
Shape.0
Или как я могу напечатать числовой результат, например, следующего кода (это подсчитывает, сколько значений в y
больше половины максимального):
errorCount = T.sum(T.gt(T.abs_(y),T.max(y)/2.0))
errorCount
должно быть единственным числом, потому что T.sum
суммирует все значения.
Но используя
print errCount
дает мне (ожидается что-то вроде 134
):
Sum.0
Ответы
Ответ 1
Если y является переменной anano, y.shape будет переменной aano. так что это нормально, что
print y.shape
Возврат:
Shape.0
Если вы хотите оценить выражение y.shape, вы можете сделать:
y.shape.eval()
если y.shape
не вводится для вычисления самого себя (зависит только от общей переменной и константы). В противном случае, если y
зависит от переменной x
Theano, вы можете передать значения входов следующим образом:
y.shape.eval(x=numpy.random.rand(...))
это то же самое для sum
. Граф Theano - это символическая переменная, которая не выполняет вычисления, пока вы не скомпилируете ее с помощью theano.function
или вызовите eval()
на них.
EDIT: В docs синтаксис в новых версиях theano -
y.shape.eval({x: numpy.random.rand(...)})
Ответ 2
Для будущих читателей: предыдущий ответ неплох.
Но я нашел механизм tag.test_value более полезным для целей отладки (см. theano-debug-faq):
from theano import config
from theano import tensor as T
config.compute_test_value = 'raise'
import numpy as np
#define a variable, and use the 'tag.test_value' option:
x = T.matrix('x')
x.tag.test_value = np.random.randint(100,size=(5,5))
#define how y is dependent on x:
y = x*x
#define how some other value (here 'errorCount') depends on y:
errorCount = T.sum(y)
#print the tag.test_value result for debug purposes!
errorCount.tag.test_value
Для меня это гораздо более полезно; например, проверка правильных размеров и т.д.
Ответ 3
print Значение переменной тензора.
Выполните следующие действия:
print tensor[dimension].eval()
# это будет печатать содержимое/значение в этой позиции в тензоре
Пример, для 1-го тензора:
print tensor[0].eval()
Ответ 4
Используйте theano.printing.Print
чтобы добавить оператора печати в свой вычислительный граф.
Пример:
import numpy
import theano
x = theano.tensor.dvector('x')
x_printed = theano.printing.Print('this is a very important value')(x)
f = theano.function([x], x * 5)
f_with_print = theano.function([x], x_printed * 5)
#this runs the graph without any printing
assert numpy.all( f([1, 2, 3]) == [5, 10, 15])
#this runs the graph with the message, and value printed
assert numpy.all( f_with_print([1, 2, 3]) == [5, 10, 15])
Вывод:
this is a very important value __str__ = [ 1. 2. 3.]
Источник: Theano 1.0 docs: "Как напечатать промежуточное значение в функции?"