【问题标题】:How to stack vectors in Theano without using scan?如何在不使用扫描的情况下在 Theano 中堆叠向量?
【发布时间】:2014-10-06 16:43:22
【问题描述】:

我正在使用 theano.scan 创建这样的上下文堆叠向量:

Y_, scan_updates = theano.scan(fn=lambda *args,**kwargs: T.concatenate(args, axis=0),outputs_info=None, sequences=dict(input = Y_, taps=range(-left_ctx,right_ctx+1)))

扫描似乎太慢了,这会减慢整个处理速度。 在信号处理中,这是相当标准的操作,所以我正在考虑为此创建一个特殊的操作。 不幸的是,我还需要 GPU 实现和这个操作的 grad ,这对我来说看起来很长。 你能把我踢到正确的方向吗?我已经阅读了扩展 theano 文档,但仍然没有多大帮助。

例子:

如果是

left_ctx=right_ctx=1

矩阵:

[[0.0, 0.1],
 [1.0, 1.1],
 [2.0, 2.1],
 [3.0, 3.1]]

将被转换为

[[0.0, 0.1, 1.0, 1.1, 2.0, 2.1],
 [1.0, 1.1, 2.0, 2.1, 3.0, 3.1]]

谢谢 J

【问题讨论】:

  • 究竟什么是“堆叠向量上下文”?任何参考或替代描述?我在信号处理中没有听说过这个名字。
  • 您有一个特征向量矩阵(例如 100x15)。假设您想一次拍摄 5 帧并将它们堆叠到一个大向量中,因此对于每一帧,您将获得大小为 (1x75) 的向量。最后你会得到矩阵 96x75 (96 因为你在原始矩阵的开头和结尾没有足够的数据)。现在好点了吗?
  • 我在原始问题中添加了示例。
  • 啊好吧——基本上只是一个滑动窗口。

标签: python gpu theano


【解决方案1】:

所以问题可以通过这种方式解决。现在可以使用了。

Y_= T.concatenate([Y_[c:Y_.shape[0]+c-left_ctx-right_ctx] for c in range(left_ctx+right_ctx+1)], axis=1)

【讨论】:

  • 很高兴看到您找到了答案 - 这明显比扫描快吗?
  • 在上面的答案中,Y_必须有指定的形状值吗?
猜你喜欢
  • 2022-08-16
  • 2017-10-21
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多