如何评估theano变量的值,如何打印?

时间:2015-05-06 19:36:52

标签: python theano

我使用千篇一律和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)来完成此操作?

1 个答案:

答案 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会有一些优化。