如何在Tensorflow中计算logits矩阵?

时间:2017-06-19 23:03:02

标签: python tensorflow lstm

我有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()

0 个答案:

没有答案