如何将RNN序列模型的损失添加到损失收集中

时间:2019-04-28 04:54:49

标签: tensorflow recurrent-neural-network sequence-modeling

我刚刚开始学习张量流。我正在为部分语音标记构建RNN序列模型。为标签中的每个术语分配标签,例如“去/去V / PP学校/ N”输入数据

x = [[index_term0, index_term1, index_term2, index_term3, 0, 0],[index_term4,index_term0, 0, 0, 0)]...]

形状为(batch_size, max_length),并且每个index_term都是术语目标y的整数点。

y = [[index_tag0, index_tag1, index_tag2, index_tag3, 0, 0],[index_tag4,index_tag0, 0, 0, 0)]...]

形状为(batch_size, max_length),每个index_tag是标记的整数点。

获取模型的logit之后,我需要获取它的损失并将损失添加到损失收集中,但我不确定该怎么做。

以下代码是我的尝试,请让我知道如何解决它。

import tensorflow as tf
embedding = tf.get_variable('embeddings', [self.num_terms, 10])
x_embeddings = tf.nn.embedding_lookup(embedding, self.x)

cell = tf.keras.layers.SimpleRNNCell(self.num_tags)
layer = tf.keras.layers.RNN(cell, return_sequences=True)
self.logits = layer(x_embeddings)

#attempt1
loss = tf.contrib.seq2seq.sequence_loss(logits = self.logits, 
targets = self.y, weights = mask)
tf.losses.add_loss(loss, loss_collection=tf.GraphKeys.REGULARIZATION_LOSSES)

#attempt2
self.logits = self.logits*mask

y_onehot = tf.placeholder(tf.float32, [None, max_length, num_tags])
sigmoid = tf.nn.sigmoid(self.logits)
cross_entropy = -y_onehot * tf.log(sigmoid + 1e-6) - (1-y_onehot) * tf.log(1 - sigmoid + 1e-6)
cross_entropy = tf.reduce_sum(cross_entropy, axis=2)
csum_cross_entropy = tf.math.cumsum(cross_entropy, axis=1)
loss = tf.reduce_sum(csum_cross_entropy * mask)
tf.losses.add_loss(loss, loss_collection=tf.GraphKeys.REGULARIZATION_LOSSES)

掩码是张量,张量是长度可变的掩码,例如[[1, 1, 0, 0], [1, 1, 1, 0], [1, 1, 1, 1]],它是根据[2, 3, 4]这样的长度向量创建的,其中每个元素都是句子的长度。

您能告诉我创建和增加损失的正确方法吗?

0 个答案:

没有答案