From 583804b16ef74c70b833dc03ca129c30fe14143e Mon Sep 17 00:00:00 2001 From: Luke Yeager Date: Thu, 23 Apr 2015 17:55:25 -0700 Subject: [PATCH] New "Large Graph" page for models Gives a roundabout solution to #71 --- digits/model/images/classification/views.py | 11 ++++++ digits/model/tasks/train.py | 18 +++++++-- .../images/classification/large_graph.html | 39 +++++++++++++++++++ .../models/images/classification/show.html | 6 +++ 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 digits/templates/models/images/classification/large_graph.html diff --git a/digits/model/images/classification/views.py b/digits/model/images/classification/views.py index cf457a660..5e71af80a 100644 --- a/digits/model/images/classification/views.py +++ b/digits/model/images/classification/views.py @@ -156,6 +156,17 @@ def show(job): """ return render_template('models/images/classification/show.html', job=job) +@app.route(NAMESPACE + '/large_graph', methods=['GET']) +def image_classification_model_large_graph(): + """ + Show the loss/accuracy graph, but bigger + """ + job = scheduler.get_job(request.args['job_id']) + if not job: + abort(404) + + return render_template('models/images/classification/large_graph.html', job=job) + @app.route(NAMESPACE + '/classify_one', methods=['POST']) def image_classification_model_classify_one(): """ diff --git a/digits/model/tasks/train.py b/digits/model/tasks/train.py index 536d75c38..72d4a0aea 100644 --- a/digits/model/tasks/train.py +++ b/digits/model/tasks/train.py @@ -316,6 +316,9 @@ def get_labels(self): def lr_graph_data(self): """ Returns learning rate data formatted for a C3.js graph + + Keyword arguments: + """ if not self.train_outputs or 'epoch' not in self.train_outputs or 'learning_rate' not in self.train_outputs: return None @@ -421,9 +424,12 @@ def accuracy_graph_data(self): else: return data - def combined_graph_data(self): + def combined_graph_data(self, cull=True): """ Returns all train/val outputs in data for one C3.js graph + + Keyword arguments: + cull -- if True, cut down the number of data points returned to a reasonable size """ data = { 'columns': [], @@ -434,7 +440,10 @@ def combined_graph_data(self): if self.train_outputs and 'epoch' in self.train_outputs: added_column = False - stride = max(len(self.train_outputs['epoch'].data)/100,1) + if cull: + stride = max(len(self.train_outputs['epoch'].data)/100,1) + else: + stride = 1 for name, output in self.train_outputs.iteritems(): if name not in ['epoch', 'learning_rate']: col_id = '%s-train' % name @@ -451,7 +460,10 @@ def combined_graph_data(self): if self.val_outputs and 'epoch' in self.val_outputs: added_column = False - stride = max(len(self.val_outputs['epoch'].data)/100,1) + if cull: + stride = max(len(self.val_outputs['epoch'].data)/100,1) + else: + stride = 1 for name, output in self.val_outputs.iteritems(): if name not in ['epoch']: col_id = '%s-val' % name diff --git a/digits/templates/models/images/classification/large_graph.html b/digits/templates/models/images/classification/large_graph.html new file mode 100644 index 000000000..32492744a --- /dev/null +++ b/digits/templates/models/images/classification/large_graph.html @@ -0,0 +1,39 @@ +{# Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. #} + +{% extends "layout.html" %} + +{% block title %} +{{job.name()}} - Large graph +{% endblock %} + +{% block head %} + +{% endblock %} + +{% block nav %} +
  • {{job.job_type()}}
  • +{% endblock %} + +{% block content %} + +{% set task = job.train_task() %} + +
    +
    +
    + {% set combined_graph_data = job.train_task().combined_graph_data(cull=False) %} + {% if combined_graph_data %} +
    + + {% else %} + No data. + {% endif %} + +
    +
    +
    + +{% endblock %} + diff --git a/digits/templates/models/images/classification/show.html b/digits/templates/models/images/classification/show.html index ef6224b85..46ecaa7be 100644 --- a/digits/templates/models/images/classification/show.html +++ b/digits/templates/models/images/classification/show.html @@ -44,6 +44,12 @@

    Dataset

    +

    {% set combined_graph_data = job.train_task().combined_graph_data() %}