message: [TF] Improve LogSoftMax performance
  In Eigen, eval should be called immediately before a
  broadcast. Otherwise, broadcast's lazy evaluation causes the
  broadcasted expression to be evaluated many times. Moving the eval
  changes the number of calls to log from batch_size * num_classes to
  batch_size.
diff: @@ -64,8 +64,7 @@ struct SoftmaxEigenImpl {
  one_by_class.set(1, num_classes);
  #endif
  // shifted_logits = logits - max(logits along classes);
  - auto shifted_logits = (logits -
  - logits.maximum(along_class)
  + auto shifted_logits = (logits - logits.maximum(along_class)
  .eval()
  .reshape(batch_by_one)
  .broadcast(one_by_class));
  @@ -74,12 +73,11 @@ struct SoftmaxEigenImpl {
  // softmax = logits - max(logits along classes);
  softmax.device(d) = shifted_logits;
  // softmax = softmax - log(sum(exp(softmax along classes)));
  - softmax.device(d) = (softmax -
  - softmax.exp()
  + softmax.device(d) = (softmax - softmax.exp()
  .sum(along_class)
  + .log()
  .eval()
  .reshape(batch_by_one)
  - .log()
  .broadcast(one_by_class));
  } else {
  // NOTE(touts): If you modify this implementation please run
  @@ -88,8 +86,7 @@ struct SoftmaxEigenImpl {
  // softmax = exp(logits - max(logits along classes));
  softmax.device(d) = shifted_logits.exp();
  // softmax = softmax * (1 / sum(softmax along classes));
  - softmax.device(d) = (softmax *
  - softmax.sum(along_class)
  + softmax.device(d) = (softmax * softmax.sum(along_class)
  .inverse()
  .eval()
  .reshape(batch_by_one)
  