由于 Theano 和 NumPy 变量类型导致的错误

Posted

技术标签:

【中文标题】由于 Theano 和 NumPy 变量类型导致的错误【英文标题】:Error because of Theano and NumPy variable types 【发布时间】:2014-05-19 20:03:36 【问题描述】:

我正在使用 numpy 1.9 和 Theano 的最新版本编写此代码,但我收到一个无法修复的错误。我怀疑这可能是我声明变量类型的方式,但我无法解决它。我很欣赏你的建议。我想用一个向量产生一个矩阵并将它与一个偏差相加。

import theano.tensor as T
from theano import function
import numpy as np
import pprint
def test_theano_matrix():
   pp = pprint.PrettyPrinter(indent=3)
   W= T.fmatrix()
   x=T.fvector()
   b= T.fvector()
   y = T.dot(W,x) + b
   lin_func = function([W,x,b],y)
   dt = np.dtype(np.float)
   w_inp = np.matrix('1 0;0 1',dtype=dt)
   x_inp = np.matrix('2;1',dtype=dt)
   b_inp = np.matrix('0;0',dtype=dt)
   lin_func(w_inp,x_inp,b_inp)

 if __name__ == '__main__':
   test_theano_matrix()

我收到以下错误:

raise TypeError(err_msg, data)
TypeError: ('Bad input argument to theano function at index 0(0-based)',
'TensorType(float32, matrix) cannot store a value of dtype float64 without risking loss of precision. If you do not mind this loss, you can: 1) explicitly cast your data to float32, or 2) set "allow_input_downcast=True" when calling "function".', matrix([[ 1.,  0.],[ 0.,  1.]]))

感谢您的宝贵时间!

【问题讨论】:

为什么不把dt = np.type(np.float)改成np.float64呢?此外,回溯明确告诉您可以自己解决问题的两种方法... 它将错误更改为TypeError: ('Bad input argument to theano function at index 1(0-based)', 'Wrong number of dimensions: expected 1, got 2 with shape (2, 1).') 再次,回溯告诉您问题...第一个错误(在索引 0 处)已通过使用正确的 dtype 修复。现在,它抱怨索引 1 处的参数 x_inp,它告诉您形状错误。 W_inp 是 2x2 矩阵,x_inp 是 2x1,所以我不明白它为什么抱怨形状。 【参考方案1】:

我遇到了类似的错误,我可以通过添加包含以下两行的 .theanorc 文件来解决它:

[global]

floatX = float32

这似乎解决了一切。但是,您的问题显示了稍微不同的错误。但我认为值得一试。

【讨论】:

【参考方案2】:

这个答案来自Theano-users google group。

您将x 变量定义为:

x=T.vector(dtype=theano.config.floatX)

这是一个向量(即它只有一维)。

x_inp = np.matrix('2;1',dtype=dt)

创建一个矩阵,而不是一个向量。

Theano 图是强类型的,你必须定义好的数量 方面。只需使用:

x_inp = np.asarray([2,1]) 

我实际上最终将xb 定义为矩阵。

【讨论】:

【参考方案3】:

错误看起来不言自明;你试过了吗:

dt = np.dtype(np.float32) 

??

【讨论】:

不,它不能解决问题。我什至尝试了 theano.config.floatX 但仍然得到同样的错误。 使用您的解决方案,错误更改为:TypeError: ('Bad input argument to theano function at index 1(0-based)', 'Wrong number of dimensions: expected 1, got 2 with shape (2, 1).') @EhsanK.Mohammadi 我没有使用过 Theano,但错误似乎表明它想要 1D 输入而不是 2D。根据定义,矩阵是二维的。因此,您应该尝试使用 numpy 数组而不是矩阵:即。 x_inp = np.array([2,1],np.float32).

以上是关于由于 Theano 和 NumPy 变量类型导致的错误的主要内容,如果未能解决你的问题,请参考以下文章

Theano 共享变量构造函数错误

theano使用

配置安装theano环境(非GPU版)

Theano set_value 用于强制转换的共享变量

Theano 中是不是有 GPU 加速的 numpy.max(X, axis=0) 实现?

Python/Theano 加载和保存模型