From fdc36b57ab810d2c2b538efebb2395d1b08aa339 Mon Sep 17 00:00:00 2001 From: akench Date: Tue, 23 Jan 2018 21:11:52 -0500 Subject: [PATCH 1/4] exponential moving average for accuracy per label --- .gitignore | 1 + helpers.py | 31 +++++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index a9b1854..01c36c7 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ ./protos/pipeline_pb2.py ./protos/train_pb2.py ./protos/eval_pb2.py +mnist_data/* diff --git a/helpers.py b/helpers.py index 1558d5f..652d474 100644 --- a/helpers.py +++ b/helpers.py @@ -13,10 +13,13 @@ def _xentropy_loss_op(logit,label,name): return: mean cross entropy """ - return tf.reduce_mean( - tf.nn.sparse_softmax_cross_entropy_with_logits( - logits=logit, - labels=label),name=name) + with tf.name_scope("LOSS"): + loss = tf.reduce_mean( + tf.nn.sparse_softmax_cross_entropy_with_logits( + logits=logit, + labels=label),name=name) + tf.summary.scalar("LOSS", loss) + return loss def _eval_op(logits,label,name): """ @@ -24,11 +27,15 @@ def _eval_op(logits,label,name): Args: logits -> output units of network rank 0 label -> matching labels rank 0 + name -> name scope of evaluation op return: mean accuracy op """ with tf.name_scope(name): - return tf.reduce_mean(tf.cast(tf.nn.in_top_k(logits,label,1),tf.float32)) + accuracy = tf.reduce_mean(tf.cast(tf.nn.in_top_k(logits,label,1),tf.float32)) + + tf.summary.scalar("ACCURACY", accuracy) + return accuracy class Helper: @@ -94,8 +101,10 @@ def get_acc(predictions, batched_tensors: output of get_inputs Returns: accs_dict : dict mapping labels to accuracy operations + scalar_updates : any updates for keeping stats """ accs_dict = {} + scalar_updates = [] labels = {label: tensor for label, tensor in batched_tensors.items() if label != "input"} @@ -105,7 +114,15 @@ def get_acc(predictions, name=label) accs_dict[label] = acc - return accs_dict + acc_avg = tf.train.ExponentialMovingAverage(0.9, name='moving_avg') + acc_avg_op = acc_avg.apply([acc]) + + tf.summary.scalar('acc_for_' + str(label), acc_avg.average(acc)) + scalar_updates.append(acc_avg_op) + + + + return accs_dict, scalar_updates @staticmethod def get_loss(predictions, @@ -143,4 +160,6 @@ def get_loss(predictions, tf.summary.scalar(loss.op.name,loss_avg.average(loss)) scalar_updates = [loss_avg_op] + #TODO log the loss per label, right now we have the total loss + return loss, scalar_updates From 590f83e5e7d1502b802e2664698d176e6582a1d7 Mon Sep 17 00:00:00 2001 From: akench Date: Tue, 23 Jan 2018 21:11:52 -0500 Subject: [PATCH 2/4] helpers: exponential moving average for accuracy per label --- .gitignore | 1 + helpers.py | 31 +++++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index a9b1854..01c36c7 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ ./protos/pipeline_pb2.py ./protos/train_pb2.py ./protos/eval_pb2.py +mnist_data/* diff --git a/helpers.py b/helpers.py index 1558d5f..652d474 100644 --- a/helpers.py +++ b/helpers.py @@ -13,10 +13,13 @@ def _xentropy_loss_op(logit,label,name): return: mean cross entropy """ - return tf.reduce_mean( - tf.nn.sparse_softmax_cross_entropy_with_logits( - logits=logit, - labels=label),name=name) + with tf.name_scope("LOSS"): + loss = tf.reduce_mean( + tf.nn.sparse_softmax_cross_entropy_with_logits( + logits=logit, + labels=label),name=name) + tf.summary.scalar("LOSS", loss) + return loss def _eval_op(logits,label,name): """ @@ -24,11 +27,15 @@ def _eval_op(logits,label,name): Args: logits -> output units of network rank 0 label -> matching labels rank 0 + name -> name scope of evaluation op return: mean accuracy op """ with tf.name_scope(name): - return tf.reduce_mean(tf.cast(tf.nn.in_top_k(logits,label,1),tf.float32)) + accuracy = tf.reduce_mean(tf.cast(tf.nn.in_top_k(logits,label,1),tf.float32)) + + tf.summary.scalar("ACCURACY", accuracy) + return accuracy class Helper: @@ -94,8 +101,10 @@ def get_acc(predictions, batched_tensors: output of get_inputs Returns: accs_dict : dict mapping labels to accuracy operations + scalar_updates : any updates for keeping stats """ accs_dict = {} + scalar_updates = [] labels = {label: tensor for label, tensor in batched_tensors.items() if label != "input"} @@ -105,7 +114,15 @@ def get_acc(predictions, name=label) accs_dict[label] = acc - return accs_dict + acc_avg = tf.train.ExponentialMovingAverage(0.9, name='moving_avg') + acc_avg_op = acc_avg.apply([acc]) + + tf.summary.scalar('acc_for_' + str(label), acc_avg.average(acc)) + scalar_updates.append(acc_avg_op) + + + + return accs_dict, scalar_updates @staticmethod def get_loss(predictions, @@ -143,4 +160,6 @@ def get_loss(predictions, tf.summary.scalar(loss.op.name,loss_avg.average(loss)) scalar_updates = [loss_avg_op] + #TODO log the loss per label, right now we have the total loss + return loss, scalar_updates From 24fc07b62c1357cbf10015e6da9f1157f3fe0ffd Mon Sep 17 00:00:00 2001 From: akench Date: Tue, 23 Jan 2018 21:17:19 -0500 Subject: [PATCH 3/4] helpers: added loss info per label --- helpers.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/helpers.py b/helpers.py index 652d474..145eab7 100644 --- a/helpers.py +++ b/helpers.py @@ -134,9 +134,10 @@ def get_loss(predictions, batched_tensors: output of get_inputs Returns: loss: the combined loss for all labels - scalar_updates : any updates for keeping stats + scalar_updates : any updates for keeping stats **last item in list is the total loss """ losses = [] + scalar_updates = [] labels = {label: tensor for label, tensor in batched_tensors.items() if label != "input"} @@ -147,6 +148,14 @@ def get_loss(predictions, tf.losses.add_loss(loss, tf.GraphKeys.LOSSES) losses.append(loss) + + loss_avg = tf.train.ExponentialMovingAverage(0.9, name='moving_avg') + loss_avg_op = loss_avg.apply([loss]) + tf.summary.scalar('loss_for_' + str(label), loss_avg.average(loss)) + scalar_updates.append(loss_avg_op) + + + '''does the total loss summary stuff''' loss = tf.reduce_sum(losses, name = "total_loss") @@ -158,8 +167,6 @@ def get_loss(predictions, #log loss and shadow variables for avg loss #tf.summary.scalar(loss.op.name+' (raw)',loss) tf.summary.scalar(loss.op.name,loss_avg.average(loss)) - scalar_updates = [loss_avg_op] - - #TODO log the loss per label, right now we have the total loss + scalar_updates.append(loss_avg_op) return loss, scalar_updates From f08689bd05048dab0eb4a16581e9ea1ef2e703ba Mon Sep 17 00:00:00 2001 From: akench Date: Tue, 23 Jan 2018 21:27:04 -0500 Subject: [PATCH 4/4] helpers: sum acuracy added --- helpers.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/helpers.py b/helpers.py index 145eab7..21198e6 100644 --- a/helpers.py +++ b/helpers.py @@ -121,6 +121,17 @@ def get_acc(predictions, scalar_updates.append(acc_avg_op) + '''does the total acc summary stuff''' + sum_acc = 0.0 + for k, v in accs_dict.items(): + sum_acc += v + + acc_avg = tf.train.ExponentialMovingAverage(0.9,name='moving_avg') + acc_avg_op = acc_avg.apply([sum_acc]) + + tf.summary.scalar('SUM_ACC',acc_avg.average(sum_acc)) + scalar_updates.append(acc_avg_op) + return accs_dict, scalar_updates