Я использую 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) для достижения этой цели?