我刚刚开始学习张量流。我正在为部分语音标记构建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]
这样的长度向量创建的,其中每个元素都是句子的长度。
您能告诉我创建和增加损失的正确方法吗?