我正在使用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]
,则在进行初始化时会出错。
所以,总结一下:
我的问题是:
¿关于这种不同的表示逻辑,我有什么遗漏之处吗?
??是否可以将解决方案切换到dynamic_rnn? (尽管我遇到的形状问题与以数据集[N_TIMESTEPS_X,None,N_FEATURES]而不是RNN单元本身提供的数据集API初始化程序有关。
非常感谢您的宝贵时间。
完整代码:
shape=[N_TIMESTEPS_X, None, N_FEATURES]
答案 0 :(得分:2)
关于这个不同之处,我有什么想念的吗? 表示逻辑,这会使实践产生混乱?
实际上,您在static_rnn
和dynamic_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_rnn
或dynamic_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形状无关。