我使用千篇一律和theano来构建一个卷积神经网络,我在尝试遵循http://deeplearning.net/software/theano/tutorial/debug_faq.html#how-do-i-step-through-a-compiled-function
中的printdebugging示例时遇到了问题我的功能看起来像这样,G和Y是theano张量
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的情况下返回G的身份函数,但在此过程中打印pre_func和post_func。
如何使用theano.function(或theano.printing.Print)来完成此操作?
答案 0 :(得分: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 的内容似乎没有改变。 为什么要打印它呢?由于印刷也可以防止 如果我没记错的话,Theano会有一些优化。