numpy和张量流RNN形状表示不匹配

时间:2018-12-27 13:49:04

标签: python-3.x numpy tensorflow

我正在使用Tensorflow构建我的第一个RNN。了解了有关3D输入形状的所有概念之后,我遇到了这个问题。

在我的numpy版本(1.15.4)中,3D数组的形状表示如下:(panel, row, column)。我将使每个维度都不同,以便更清晰:

In [1]: import numpy as np                                                                                                                  

In [2]: arr = np.arange(30).reshape((2,3,5))                                                                                                

In [3]: arr                                                                                                                                 
Out[3]: 
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14]],

       [[15, 16, 17, 18, 19],
        [20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29]]])

In [4]: arr.shape                                                                                                                           
Out[4]: (2, 3, 5)

In [5]: np.__version__                                                                                                                      
Out[5]: '1.15.4'

我的理解是:我有两个时间步,每个时间步包含3个观测值,每个观测值有5个特征。

但是,在张量流“理论”(我认为它强烈地基于numpy)中,RNN单元期望形状为[batch_size, timesteps, features]的张量(即n维矩阵),可以将其转换为:{{1 }}中的数字“行话”。

可以看出,表示形式不匹配,将numpy数据输入占位符时会导致错误,在大多数示例和理论中,其定义如下:

(row, panel, column)

  • x = tf.placeholder(tf.float32, shape=[None, N_TIMESTEPS_X, N_FEATURES], name='XPlaceholder')不能解决问题,因为它只是重新排列尺寸,但弄乱了数据。

  • 我第一次使用 Dataset API ,但是我在会话中遇到的问题是一次,而不是在Dataset API操作中。

  • 我正在使用np.reshape()方法,并且一切正常,直到必须将数据输入占位符为止,这显然会导致形状错误。

  • 我试图将占位符形状更改为static_rnn。但是,我使用的是数据集API,如果将Xplaceholder更改为shape=[N_TIMESTEPS_X, None, N_FEATURES],则在进行初始化时会出错。

所以,总结一下:

  • 第一个问题:具有不同形状表示形式的形状错误。
  • 第二个问题:将形状表示形式等价时出现数据集错误(我认为如果解决了此问题,static_rnn或dynamic_rnn都可以起作用)。

我的问题是:

¿关于这种不同的表示逻辑,我有什么遗漏之处吗?

??是否可以将解决方案切换到dynamic_rnn? (尽管我遇到的形状问题与以数据集[N_TIMESTEPS_X,None,N_FEATURES]而不是RNN单元本身提供的数据集API初始化程序有关。

非常感谢您的宝贵时间。

完整代码:

shape=[N_TIMESTEPS_X, None, N_FEATURES]

1 个答案:

答案 0 :(得分:2)

  

关于这个不同之处,我有什么想念的吗?   表示逻辑,这会使实践产生混乱?

实际上,您在static_rnndynamic_rnn的输入形状上犯了一个错误。 static_rnn的输入形状是[timesteps,batch_size, features]link),它是形状为[batch_size,features]的2D张量的列表。但是dynamic_rnn的输入形状是[timesteps,batch_size, features][batch_size,timesteps, features],具体取决于time_major是True还是False(link)。

  

能否实现切换到dynamic_rnn的解决方案?

关键不是您使用static_rnndynamic_rnn,而是您的数据形状与所需形状匹配。占位符的一般格式就像您的代码为[None, N_TIMESTEPS_X, N_FEATURES]。使用数据集API也很方便。 您可以使用transpose()link)代替reshape()transpose()会置换数组的维数,并且不会弄乱数据。

因此您的代码需要修改。

# permute the dimensions
xt = xt.transpose([1,0,2])
xval = xval.transpose([1,0,2])

# adjust shape,axis=1 represents timesteps
inputs = tf.unstack(next_features,  axis=1)

其他错误与rnn形状无关。