我有LSTM模型,在输入时每步获得一个88维向量。向量中的每个元素可以是{0,1,2}类。输出被编码为单热,因此这意味着在每个步骤中我在输出处具有大小为3x88的矩阵。我想计算交叉熵损失。这是我的模特:
x = tf.placeholder(tf.float32, (None, None, INPUT_SIZE))
y = tf.placeholder(tf.float32, (None, None, None, OUTPUT_SIZE))
def LSTM(x_):
cell = tf.contrib.rnn.LSTMCell(RNN_HIDDEN, state_is_tuple=True)
cell = tf.contrib.rnn.DropoutWrapper(cell, output_keep_prob=0.5)
cell = tf.contrib.rnn.MultiRNNCell([cell] * num_layers, state_is_tuple=True)
batch_size = tf.shape(x_)[0]
initial_state = cell.zero_state(batch_size, tf.float32)
rnn_outputs, rnn_states = tf.nn.dynamic_rnn(cell,
x_,
initial_state=initial_state,
time_major=False)
final_projection = lambda lx: layers.linear(lx, num_outputs=OUTPUT_SIZE,
activation_fn=None)
predicted_outputs = tf.map_fn(final_projection, rnn_outputs)
return predicted_outputs
我的网络的示例输入和输出是here。在此示例中,对于输入,批处理的大小为1,有3个时间步长,数据维度为88.输出相同,只是将数据转换为单热矢量。因此,批量大小为1(第一维),有3个时间步(第二维),有3个类(第三维),数据维数为88.
我不知道如何处理rnn_outputs
以及如何使predicted_outputs
具有适当的形状,以便我可以致电softmax_cross_entropy_with_logits(logits=pred, labels=batch_y_oh)
。
现在的代码,给我以下错误:
InvalidArgumentError (see above for traceback): logits and labels must be same size: logits_size=[3,88] labels_size=[9,88]
甚至可以像这样计算交叉熵,通过直接将其输入到TF的函数,或者我必须编写自己的函数,因为基本上,损失将是88个交叉熵的总和(我想迭代过来列并为每列调用softmax_cross_entropy_with_logits()
?