【问题标题】:TypeError from theano While using 3D numpy array来自 theano 的 TypeError 使用 3D numpy 数组时
【发布时间】:2015-12-23 11:30:26
【问题描述】:

我正在尝试类似于下面的代码

datax=theano.shared(value=rng.rand(5,500,45))
x=T.dmatrix('x')
i=T.lscalar('i')
W=theano.shared(value=rng.rand(90,45,500))
Hb=theano.shared(value=np.zeros(90))
w_v_bias=T.dot(W,x).sum(axis=2).sum(axis=1)+Hb
z=theano.function([i],w_v_bias,givens={x:datax[i*5:(i+1)*5]})

z(0)

Theano 给我一个带有 msg 的 TypeError:

无法将类型 TensorType(float64, 3D)(变量 Subtensor{int64:int64:}.0)转换为类型 TensorType(float64, matrix)。您可以尝试手动将 Subtensor{int64:int64:}.0 转换为 TensorType(float64, matrix)

我在这里做错了什么?

编辑

正如丹尼尔所说,将 x 更改为 dtensor3 将导致另一个错误。

ValueError:输入维度不匹配。 (输入[0].shape[1] = 5, input[1].shape[1] = 90)

应用导致错误的节点:Elemwise{add,no_inplace}(Sum{axis=[1], acc_dtype=float64}.0, DimShuffle{x,0}.0)

另一种方法是修改我的训练功能,但我将无法进行批量学习。

  z=theano.function([x],w_v_bias)
  z(datax[0])

我正在尝试使用可见单位的整数值来实现 RBM。

【问题讨论】:

    标签: python theano


    【解决方案1】:

    问题在于 datax 是一个 3D 张量,datax[index*5:(index+1)*5] 也是一个 3D 张量,但您试图将其分配给 x 这是一个 2D 张量(即矩阵)。

    变化

    x = T.dmatrix('x')
    

    x = T.dtensor3('x')
    

    解决了这个问题,但创建了一个新问题,因为 W 和 x 的尺寸不匹配以执行点积。目前还不清楚期望的结果是什么。

    【讨论】:

    • 你好丹尼尔,我尝试了你的方法,点积在沿轴 3&1 添加后返回 np.array(90,5)。至于我需要的是 np.array(90,1) 逐元素添加 Hb。我认为 dataX[0],dataX[1] , ... 是在计算过程中顺序操作
    【解决方案2】:

    经过几次打击和试验后解决了。

    我需要的是改变

    x=T.dmatrix('x')
    w_v_bias=T.dot(W,x).sum(axis=2).sum(axis=1)+Hb 
    

    x=T.dtensor3('x')
    w_v_bias=T.dot(x,W).sum(axis=3).sum(axis=1)+Hb
    

    现在它在将 Hb 元素添加到点积的五个向量中的每一个后生成 (5,90) 数组。

    【讨论】:

      猜你喜欢
      • 2016-10-30
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      相关资源
      最近更新 更多