Python - theano.scan() - 返回函数值而不返回循环

时间:2015-05-21 05:43:52

标签: python theano

是否可以返回扫描功能中计算出的值,而无需将它们反馈回扫描功能。

e.g。

import theano
import theano.tensor as T
import numpy as np

theano.config.exception_verbosity='high'
theano.config.optimizer='None'

def f(seq_v, prev_v):
    return seq_v*prev_v#, prev_v+1

a = T.dvector('a')

ini = T.constant(1, dtype=theano.config.floatX)

result, updates = theano.scan(fn=f,
                              outputs_info=[ini],
                              sequences=[a],
                              non_sequences=None)

fn  = theano.function(inputs=[a], outputs=result)

A = np.arange(1,5)
out = fn(A)

print 'Values:\nf:\t{}'.format(out)

给出了

Values:
f:  [  1.   2.   6.  24.]

但是,我想输出f()中的两个值而不将后一个值反馈回扫描函数:

def f(seq_v, prev_v):
    return seq_v*prev_v, prev_v+1

给出类似的东西:

Values:
f:  [ [1. , 2.]   [2. , 3.]   [6. , 4.]  [24. , 5.] ]

(我只想指出这个问题很简单,但我想用这个想法来调试扫描函数和检查输出值)

1 个答案:

答案 0 :(得分:1)

您需要为输出指定outputs_infoNone,而不想将其反馈到f。有关详细信息,请参阅the scan documentation.以下示例应该可以执行您想要的操作。

import theano
import theano.tensor as T
import numpy as np

theano.config.exception_verbosity='high'
theano.config.optimizer='None'

def f(seq_v, prev_v):
    return seq_v*prev_v, seq_v+1

a = T.vector('a')

ini = T.constant(1, dtype=theano.config.floatX)

result, updates = theano.scan(fn=f,
                              outputs_info=[ini,None],
                              sequences=[a])

fn  = theano.function(inputs=[a], outputs=result)

A = np.arange(1,5, dtype=T.config.floatX)
out = fn(A)

print('Values:\nf:\t{}'.format(out))

输出:

Values:
f:  [array([  1.,   2.,   6.,  24.], dtype=float32), array([ 2.,  3.,  4.,  5.], dtype=float32)]