dynamic_rnn 中的 Tensorflow 1.0 LSTM Cell 抛出维度错误
Tensorflow 1.0 LSTM Cell in dynamic_rnn throws dimension error
我正在尝试将 LSTM 模型实现为 model_fn 估算器的输入。我的 X 只是一个包含价格时间序列的 .txt。在进入我的第一个隐藏层之前,我尝试将 lstm 单元定义为:
def lstm_cell():
return tf.contrib.rnn.BasicLSTMCell(
size, forget_bias=0.0, state_is_tuple=True)
attn_cell = lstm_cell
if is_training and keep_prob < 1:
def attn_cell():
return tf.contrib.rnn.DropoutWrapper(
lstm_cell(), output_keep_prob=keep_prob)
cell = tf.contrib.rnn.MultiRNNCell([attn_cell() for _ in range(num_layers)], state_is_tuple=True)
initial_state = cell.zero_state(batch_size, data_type())
inputs = tf.unstack(X, num=num_steps, axis=0)
outputs = []
outputs, state = tf.nn.dynamic_rnn(cell, inputs,
initial_state=initial_state)
这应该进入:
first_hidden_layer = tf.contrib.layers.relu(outputs, 1000)
不幸的是,它抛出一个错误,指出 "ValueError: Dimension must be 1 but is 3 for 'transpose' (op: 'Transpose') with input shapes: [1], [3]."
我发现我的问题是 "inputs" 张量。在它的描述中,输入变量应该是一个形式为 [batch_size,max_time,...] 的张量,但我不知道如何将其转换为上述结构,因为通过估算器,只有输入值 X 和目标值 y 被馈送到系统。所以我的问题是如何创建一个张量作为 dynamic_rnn class.
的输入变量
非常感谢。
我相信你不需要这条线:
inputs = tf.unstack(X, num=num_steps, axis=0)
您可以将 X
直接提供给 dynamic_rnn
,因为 dynamic_rnn
不采用张量列表;它需要一个张量,其中时间轴是维度 0(如果 time_major == True
)或维度 1(如果 time_major == False
)。
实际上,X
似乎只有二维,因为 inputs
是一维张量的列表(如错误消息所示)。所以您应该将 unstack
行替换为:
inputs = tf.expand_dims(X, axis=2)
这将添加 dynamic_rnn
所需的大小为 1 的第 3 个维度
我正在尝试将 LSTM 模型实现为 model_fn 估算器的输入。我的 X 只是一个包含价格时间序列的 .txt。在进入我的第一个隐藏层之前,我尝试将 lstm 单元定义为:
def lstm_cell():
return tf.contrib.rnn.BasicLSTMCell(
size, forget_bias=0.0, state_is_tuple=True)
attn_cell = lstm_cell
if is_training and keep_prob < 1:
def attn_cell():
return tf.contrib.rnn.DropoutWrapper(
lstm_cell(), output_keep_prob=keep_prob)
cell = tf.contrib.rnn.MultiRNNCell([attn_cell() for _ in range(num_layers)], state_is_tuple=True)
initial_state = cell.zero_state(batch_size, data_type())
inputs = tf.unstack(X, num=num_steps, axis=0)
outputs = []
outputs, state = tf.nn.dynamic_rnn(cell, inputs,
initial_state=initial_state)
这应该进入:
first_hidden_layer = tf.contrib.layers.relu(outputs, 1000)
不幸的是,它抛出一个错误,指出 "ValueError: Dimension must be 1 but is 3 for 'transpose' (op: 'Transpose') with input shapes: [1], [3]." 我发现我的问题是 "inputs" 张量。在它的描述中,输入变量应该是一个形式为 [batch_size,max_time,...] 的张量,但我不知道如何将其转换为上述结构,因为通过估算器,只有输入值 X 和目标值 y 被馈送到系统。所以我的问题是如何创建一个张量作为 dynamic_rnn class.
的输入变量非常感谢。
我相信你不需要这条线:
inputs = tf.unstack(X, num=num_steps, axis=0)
您可以将 X
直接提供给 dynamic_rnn
,因为 dynamic_rnn
不采用张量列表;它需要一个张量,其中时间轴是维度 0(如果 time_major == True
)或维度 1(如果 time_major == False
)。
实际上,X
似乎只有二维,因为 inputs
是一维张量的列表(如错误消息所示)。所以您应该将 unstack
行替换为:
inputs = tf.expand_dims(X, axis=2)
这将添加 dynamic_rnn