El source_code sequence_Loss > tiene tres parámetros que se requieren; los enumeran como salidas, objetivos y pesos.

Los resultados y los objetivos se explican por sí mismos, pero quiero comprender mejor qué es el parámetro weight.

La otra cosa que encuentro confusa es que establece que targets debería ser el mismo length que las salidas, ¿qué quieren decir exactamente con la longitud de un tensor? Especialmente si es un tensor tridimensional.

5
TheM00s3 14 dic. 2016 a las 06:55

2 respuestas

La mejor respuesta

Usamos esto en una clase y nuestro profesor dijo que simplemente podríamos pasarle los de la forma correcta (el comentario dice "lista de tensores flotantes de tamaño de lote 1D de la misma longitud que logits"). Eso no ayuda con lo que significan, pero tal vez lo ayude a ejecutar su código. Trabajó para mi.

Este código debería funcionar: [tf.ones(batch_size, tf.float32) for _ in logits].

Editar: desde el código TF:

for logit, target, weight in zip(logits, targets, weights):
      if softmax_loss_function is None:
        # TODO(irving,ebrevdo): This reshape is needed because
        # sequence_loss_by_example is called with scalars sometimes, which
        # violates our general scalar strictness policy.
        target = array_ops.reshape(target, [-1])
        crossent = nn_ops.sparse_softmax_cross_entropy_with_logits(
            logit, target)
      else:
        crossent = softmax_loss_function(logit, target)
      log_perp_list.append(crossent * weight)

Los pesos que se pasan se multiplican por la pérdida de ese logit en particular. Así que supongo que si quieres tomar una predicción en particular muy en serio, puedes aumentar el peso por encima de 1.

1
chris 14 dic. 2016 a las 18:19

Piense en los pesos como una máscara aplicada al tensor de entrada. En algunas aplicaciones de PNL, a menudo tenemos una longitud de oración diferente para cada oración. Para poner en paralelo / agrupar múltiples oraciones de instancia en un minibatch para alimentar una red neuronal, las personas usan una matriz de máscara para indicar qué elemento en el tensor de entrada es realmente una entrada válida. Por ejemplo, el peso puede ser un np.ones([batch, max_length]), lo que significa que todos los elementos de entrada son legítimos.

También podemos usar una matriz de la misma forma que las etiquetas como np.asarray([[1,1,1,0],[1,1,0,0],[1,1,1,1]]) (asumimos que la forma de las etiquetas es 3x4), entonces la Entropía cruzada de la primera fila y última columna se enmascarará como 0.

También puede usar el peso para calcular la acumulación ponderada de entropía cruzada.

3
Jon 11 oct. 2017 a las 15:20