我正在尝试将LSTM模型实现为Estimator的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)
不幸的是,它会抛出一个错误,指出&#34; ValueError:Dimension必须为1,但对于&#39; transpose&#39; (op:&#39; Transpose&#39;)输入形状:[1],[3]。&#34; 我认为我的问题是&#34;输入&#34;张量。在其描述中,输入变量应该是一个形式为[batch_size,max_time,...]的张量,但我不知道如何将其转换为上述结构,因为通过估算器,只有输入值X和目标值y被送到系统。所以我的问题是如何创建一个可以作为dynamic_rnn类的输入变量的张量。
非常感谢。
答案 0 :(得分:1)
我相信你不需要这一行:
inputs = tf.unstack(X, num=num_steps, axis=0)
您可以直接向X
提供dynamic_rnn
,因为dynamic_rnn
未列出张量列表;它需要一个张量,其中时间轴为维度0(如果time_major == True
)或维度1(如果time_major == False
)。
实际上,X
似乎只有2个维度,因为inputs
是1维张量列表(如错误消息所示)。所以你应该用unstack
替换为:
inputs = tf.expand_dims(X, axis=2)
这将添加dynamic_rnn