Я только начал изучать тензор потока.Я строю модель последовательности RNN для части речевого тегирования.назначить тег каждому термину в предложении, например, входные данные "go / V to / PP school / 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
является целочисленной точкой для тега.
После того, как я получу логиты моделиМне нужно получить потерю и добавить потерю в коллекцию потерь, и я не уверен, как это сделать.
Следующие коды являются моими попытками, пожалуйста, дайте мне знать, как это исправить.
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]
, где каждый элемент - длина предложения.
Не могли бы вы сказать мне правильный способ создания и добавления потерь, пожалуйста?