Как вывести значение переменной theano всякий раз, когда она оценивается?

Я использую lasagne и theano для создания сверточной нейронной сети, и у меня возникают проблемы с попыткой следовать примерам отладки печати в http://deeplearning.net/software/theano/tutorial/debug_faq.html#как-делать-я-пошагово-скомпилированную-функцию

Моя функция выглядит так, когда G и Y являются теано-тензорами.

def loss_function(self, G, Y_):
    # Split batch into pairs
    G1, G2 = G[0::2], G[1::2]
    Y = Y_[:G.shape[0] // 2]
    # Energy of training pairs
    E = T.abs_((G1 - G2)).sum(axis=1)
    Q = 2
    genuine_loss = (1 - Y) * (2 / Q) * (E ** 2)
    imposter_loss = (Y) * 2 * Q * T.exp((-2.77 * E) / Q)
    loss = genuine_loss + imposter_loss
    avg_loss = T.mean(loss)
    return ave_loss

поэтому выходное значение ave_loss должно быть символическим выражением, которое при компиляции и выполнении с входными данными приведет к вычислению средней потери по пакету обучающих изображений.

Что я хочу сделать, так это поместить сюда символическое выражение для печати, чтобы всякий раз, когда вычисляется ave_loss, оно печатало содержимое G.

Но сейчас я застрял, просто пытаясь что-то напечатать до и после

def loss_function(self, G, Y_):

    # Inject a symbolic expression to print something before and after G is used. 

    def pre_func(i, node, fn):
        print('Before')

    def post_func(i, node, fn):
        print('After')

    dbgfunc = theano.function([G], [G],
                              mode=theano.compile.MonitorMode(
                                  pre_func=pre_func,
                                  post_func=post_func))
    G = dbgfunc()

    # Split batch into pairs
    G1, G2 = G[0::2], G[1::2]
    Y = Y_[:G.shape[0] // 2]
    # Energy of training pairs
    E = T.abs_((G1 - G2)).sum(axis=1)
    Q = 2
    genuine_loss = (1 - Y) * (2 / Q) * (E ** 2)
    imposter_loss = (Y) * 2 * Q * T.exp((-2.77 * E) / Q)
    loss = genuine_loss + imposter_loss
    avg_loss = T.mean(loss)
    return ave_loss

Приведенный выше код не работает, и я не совсем уверен, как манипулировать theano.function, чтобы заставить его работать.

Что я пытаюсь сделать, так это создать функцию идентификации, которая принимает G и возвращает G без его изменения, но по пути печатает pre_func и post_func.

Как использовать theano.function (или theano.printing.Print) для достижения этой цели?


person Erotemic    schedule 06.05.2015    source источник


Ответы (1)


К сожалению, я не могу помочь вам с подходом к печати, так как сам никогда не использовал печать. Но... нельзя ли вернуть G вместе с ave_loss. Затем вы можете ознакомиться с содержимым...

что-то типа:

def loss_function(self, G, Y_):
    ...
    G = dbgfunc()
    ...
    return ave_loss, G


G = T.matrix('G') 
Y_ = T.matrix('Y')

ave_loss, G_prime = loss_function(G, Y_)

f = function([G, _Y], [ave_loss, G_prime])

print( f(...) )

РЕДАКТИРОВАТЬ:

Я только что увидел, что содержимое G не меняется. Почему вы хотите напечатать его в любом случае. Поскольку печать также предотвращает некоторые оптимизации Теано, если я правильно помню.

person Nima Mousavi    schedule 10.05.2015
comment
Это просто фиктивный пример. Я пытаюсь убедиться, что значения находятся в определенном диапазоне. Я не собираюсь включать их постоянно. Я думаю, что использование отдельной функции - это нормальное решение. - person Erotemic; 12.05.2015