gpt4 book ai didi

python - theano 扫描函数缺少输入错误

转载 作者:太空宇宙 更新时间:2023-11-03 17:19:25 25 4
gpt4 key购买 nike

我正在试验 Theano,特别是函数 scan

我想用它来将线性分类器应用于存储为矩阵 X 的列的一组特征向量(我确信有更好的方法可以做到这一点,这只是为了熟悉函数 scan)。

这是我的代码片段:

T_W = T.fmatrix('W')
T_b = T.fmatrix('b')

T_X = T.fmatrix('X')
T_x = T.fmatrix('x')

# this is the linear classifier
T_f = T.dot(T_W, T_x) + T_b
f = theano.function(inputs=[T_x, theano.Param(T_W), theano.Param(T_b)],outputs=T_f)

T_outputs, T_updates = theano.scan(fn=lambda x,W,b : T_f, sequences=[T_X], non_sequences=[T_W,T_b])

F = theano.function(inputs=[T_X, theano.Param(T_W), theano.Param(T_b)],outputs=T_outputs)

从 iPython 执行代码片段时,出现以下错误(由最后一条指令触发):

    MissingInputError: A variable that is an input to the graph was neither provided as an input to the function nor given a value. A chain of variables leading from this input to an output is [x, for{cpu,scan_fn}.0]. This chain may not be unique
Backtrace when the variable is created:
File "<ipython-input-40-72b539c54ff4>", line 5, in <module>
T_x = T.fmatrix('x')

最佳答案

尚不完全清楚您在这里要做什么,但我猜测您正在实现两个不同版本的线性分类器,一个不使用扫描,另一个则使用扫描。

下面的代码演示了我执行此操作的方法。

回答您的具体问题:

出现错误消息是因为您的扫描版本在扫描步骤函数中使用了 T_f (这很奇怪,也是不清楚您要执行的操作的原因之一;步骤函数未使用它的任何输入变量 xWb 都可以!)并且 T_f 使用 T_x 但您的扫描版本的函数不将 T_x 作为输入。相反,它需要 T_X (注意大小写差异),然后根本不会使用它。

这里有一些关于你的代码和我的代码之间差异的提示和解释。

  1. 将事物分成离散的方法非常有帮助。通过将代码拆分为 v1v2 方法,我们确保这两种不同的实现不会相互干扰。

  2. 建议始终使用 theano.scanstrict 参数。它确保您不会意外引入因步骤函数参数中的命名冲突而导致的错误。默认情况下不启用它,因为当 strict 不存在时,这可能会破坏旧代码。

  3. 对于 scan 的步骤函数,使用成熟的函数而不是 lambda。与严格模式一样,这有助于避免意外的命名冲突,并使步骤代码更易于遵循。阶跃函数也可以单独测试。

  4. 使用compute_test_value确保计算适用于简单的示例数据。特别是,这将识别形状不匹配(例如,使用错误顺序的参数执行点),并通过能够在计算图时打印/探索中间值来简化调试正在构建,而不是稍后执行计算时。

  5. 此代码将每个输入样本编码为 x 行,而不是 x 列。这需要后乘以 w 而不是预乘。无论哪种方式都可以做到,但预乘 w 会使与 b 的加法有点困惑(需要使用 dimshuffle介绍)。

  6. 除非您需要使用关于默认值等的非标准行为,否则无需使用 theano.Param

  7. 避免命名仅在大小写上有所不同的事物!一般来说,坚持Python style guide (即实例变量应该小写,单词之间用下划线分隔)。

  8. 在扫描版本的步骤函数中需要进行暗洗牌和选择第一行,以确保点积和偏置的子序列加法维度兼容。在非扫描版本中不需要这样做,因为我们正在做矩阵-矩阵点积。

代码:

import numpy
import theano
import theano.tensor as T


def create_inputs(x_value, w_value, b_value):
x, w = T.matrices(2)
b = T.vector()
x.tag.test_value = x_value
w.tag.test_value = w_value
b.tag.test_value = b_value
return x, w, b


def v1(x_value, w_value, b_value):
x, w, b = create_inputs(x_value, w_value, b_value)
y = T.dot(x, w) + b
f = theano.function(inputs=[x, w, b], outputs=y)
print f(x_value, w_value, b_value)


def v2_step(x, w, b):
return (T.dot(x.dimshuffle('x', 0), w) + b)[0]


def v2(x_value, w_value, b_value):
x, w, b = create_inputs(x_value, w_value, b_value)
y, _ = theano.scan(v2_step, sequences=[x], non_sequences=[w, b], strict=True)
f = theano.function(inputs=[x, w, b], outputs=y)
print f(x_value, w_value, b_value)


def main():
batch_size = 2
input_size = 3
hidden_size = 4
theano.config.compute_test_value = 'raise'
numpy.random.seed(1)
x_value = numpy.random.standard_normal(size=(batch_size, input_size))
w_value = numpy.random.standard_normal(size=(input_size, hidden_size))
b_value = numpy.zeros((hidden_size,))
v1(x_value, w_value, b_value)
v2(x_value, w_value, b_value)


main()

关于python - theano 扫描函数缺少输入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33327144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com