python - 批处理主要 VS 时间主要 LSTM

标签 python tensorflow deep-learning lstm recurrent-neural-network

当输入是批量优先而不是时间优先时,RNN 是否学习不同的依赖模式?

最佳答案

(编辑:抱歉,我最初的论点是为什么它有道理,但我意识到它没有所以这有点过时了。)

我还没有找到这背后的 TF 组推理,但它确实没有具有计算意义,因为操作是用 C++ 编写的。

直觉上,我们希望在同一时间步上混合(相乘/相加等)来自同一序列的不同特征。不同的时间步不能并行完成,而批处理/序列可以并行执行,因此 feature>batch/sequence>timestep。

通过 default Numpy and C++ uses row-major (C-like) 内存布局 so

[[ 0.  1.  2.]
 [ 3.  4.  5.]
 [ 6.  7.  8.]]

[0,1,2,3,4,5,6,7,8] 一样放在内存中。这意味着如果我们有

x = np.zeros([time,batch,feature])

( tensorflow 中的time_major=True)

在行优先内存中,我们得到类似 x[0,0,0],x[0,0,1],x[0,0,2],…,x[0,1 ,0],... 所以前。来自相同序列和时间步长的权重和向量的点积 (w*x[t,b,:]) 是最连续的操作,紧随其后的是下一个序列 w*x[t,b +1,:] 等。这就是我们在训练期间想要的。

使用 time_major=False 默认情况下,我们有 [batch,time,feature] 因此来自相同序列但不同时间步的 ex 特征更连续,即 w*x[batch,t, :] 后跟 w*x[batch,t+1,:] 等。如果推出 RNN,一次预测一个序列可能会更快,但这是推测.

如果你出于与我相同的原因来到这个问题,我学会了小心稍微不直观的 Numpy 索引,它意味​​着 pythonic,不一定是 Row Major。看这个。正如预期的那样:

x = np.zeros([3,3])
x[0:9].flat = np.arange(10)
print x
>   [[ 0.  1.  2.]
>    [ 3.  4.  5.]
>    [ 6.  7.  8.]]

我们还期望 x[1] == x[0,1] 但是

print x[1]
> [ 3.  4.  5.]

print x[np.arange(10)<=4]
> IndexError: index 3 is out of bounds for axis 0 with size 3

关于python - 批处理主要 VS 时间主要 LSTM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42130491/

相关文章:

android-studio - java.lang.IllegalArgumentException : No OpKernel was registered to support Op 'GatherV2' with these attrs.

tensorflow - 做 Tensorflow 教程时出错

python - 如何创建一个能够根据假设做出决策的深度神经网络?

computer-vision - 从 Fast R-CNN 的所有边界框中提取特征

python - 错误 - TypeError 在 django 中得到了一个意外的关键字参数 'name'

python - 在 Python 中绘制网格

tensorflow - 我的模型的损失值缓慢下降。如何在训练时更快地减少我的损失?

machine-learning - 神经网络是否很复杂 "Linear Functions"有很多参数?

python - 如何在没有for循环的情况下更改python(opencv)中的像素值

python - CondaEnvException : Pip failed. 尝试使用 .yml 文件在 conda 中创建环境时出现 pip 子进程错误