All Downloads are FREE. Search and download functionalities are using the official Maven repository.

deeplearning4jUiAssets.js.train.overview.js Maven / Gradle / Ivy

The newest version!
/*
 *  ******************************************************************************
 *  *
 *  *
 *  * This program and the accompanying materials are made available under the
 *  * terms of the Apache License, Version 2.0 which is available at
 *  * https://www.apache.org/licenses/LICENSE-2.0.
 *  *
 *  *  See the NOTICE file distributed with this work for additional
 *  *  information regarding copyright ownership.
 *  * Unless required by applicable law or agreed to in writing, software
 *  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 *  * License for the specific language governing permissions and limitations
 *  * under the License.
 *  *
 *  * SPDX-License-Identifier: Apache-2.0
 *  *****************************************************************************
 */

var selectedChart = "stdevActivations";
function selectStdevChart(fieldName) {
    selectedChart = fieldName;
    lastUpdateTime = -1;    //Reset update time to force reload

    //Tab highlighting logic
    if (selectedChart == "stdevActivations") {
        $("#stdevActivations").attr("class", "active");
        $("#stdevGradients").removeAttr("class");
        $("#stdevUpdates").removeAttr("class");
    }
    else if (selectedChart == "stdevGradients") {
        $("#stdevActivations").removeAttr("class");
        $("#stdevGradients").attr("class", "active");
        $("#stdevUpdates").removeAttr("class");
    }
    else {
        $("#stdevActivations").removeAttr("class");
        $("#stdevGradients").removeAttr("class");
        $("#stdevUpdates").attr("class", "active");
    }

    renderOverviewPage(true);
}

/* ---------- Render page ---------- */
var lastUpdateTime = -1;
var lastUpdateSession = "";
function renderOverviewPage(forceupdate) {
    updateSessionWorkerSelect();

    if(forceupdate || !lastUpdateSession || lastUpdateSession == "" || lastUpdateSession != currSession){
        executeOverviewUpdate();
    } else {
        //Check last update time first - see if data has actually changed...
        $.ajax({
            url: "/train/sessions/lastUpdate/" + currSession,
            async: true,
            error: function (query, status, error) {
                console.log("Error getting data: " + error);
            },
            success: function (data) {
                if(data > lastUpdateTime){
                    executeOverviewUpdate();
                }
            }
        });
    }
}

function executeOverviewUpdate(){
    getSessionSettings(function(){
        var overviewUrl = multiSession ? "/train/" + currSession + "/overview/data" : "/train/overview/data";
        $.ajax({
            url: overviewUrl,
            async: true,
            error: function (query, status, error) {
                console.log("Error getting data: " + error);
            },
            success: function (data) {
                lastUpdateSession = currSession;
                lastUpdateTime = data["updateTimestamp"];
                renderScoreVsIterChart(data);
                renderModelPerformanceTable(data);
                renderUpdatesRatio(data);
                renderStdevChart(data);
            }
        });
    });

}

/* ---------- Score vs. Iteration Chart ---------- */
function renderScoreVsIterChart(data) {
    var scoresArr = data["scores"];
    var scoresIter = data["scoresIter"];

    var maxScore = Math.max.apply(Math, scoresArr);
    var chartMin = Math.min.apply(Math, scoresArr);
    if(chartMin > 0){
        chartMin = 0.0;
    }

    var scoreChart = $("#scoreiterchart");
    scoreChart.unbind(); // prevent over-subscribing

    if (scoreChart.length) {
        var scoreData = [];

        for (var i = 0; i < scoresArr.length; i++) {
            scoreData.push([scoresIter[i], scoresArr[i]]);
        }

        var plotData = [{data: scoreData, label: "score"}];

        // calculate a EMA line to summarize training progress
        if(scoresIter.length > 10) {
            var bestFitLine = EMACalc(scoresArr, 10);
            var bestFitData = [];
            for (var i = 0; i < bestFitLine.length; i++) {
                bestFitData.push([scoresIter[i], bestFitLine[i]]);
            }
            plotData.push({data: bestFitData, label: "summary"});
        }

        // plot the chart
        var plotOptions = {
            series: {
                lines: {
                    show: true,
                    lineWidth: 2
                }
            },
            grid: {
                hoverable: true,
                clickable: true,
                tickColor: "#dddddd",
                borderWidth: 0
            },
            yaxis: {min: chartMin, max: maxScore},
            colors: ["#FA5833","rgba(65,182,240,0.3)","#000000"],
            selection: {
                mode: "x"
            }
        };
        var plot = $.plot(scoreChart, plotData, plotOptions);

        // when selected, calculate best fit line
        scoreChart.bind("plotselected", function (event, ranges) {
            var indices = [];
            var fromIdx = parseInt(ranges.xaxis.from);
            var toIdx = parseInt(ranges.xaxis.to);
            var scoresCopy = scoresArr.slice();

            for (var i = fromIdx; i <= toIdx; i++) {
               indices.push(i);
            }

            var bestFitLine = findLineByLeastSquares(indices, scoresCopy.slice(fromIdx,toIdx+1));
            var bestFitData = [];
            for (var i = 0; i < bestFitLine[0].length; i++) {
                bestFitData.push([bestFitLine[0][i], bestFitLine[1][i]]);
            }
            plotData.push({data: bestFitData, label: "selection"});

            plot.setData(plotData);
            plot.draw();
        });

        scoreChart.bind("plotunselected", function (event) {
            plotData = plotData.slice(0,2);
            plot.setData(plotData);
            plot.draw();
        });

        function showTooltip(x, y, contents) {
            $('
' + contents + '
').css({ position: 'absolute', display: 'none', top: y + 8, left: x + 10, border: '1px solid #fdd', padding: '2px', 'background-color': '#dfeffc', opacity: 0.80 }).appendTo("#scoreiterchart").fadeIn(200); } var previousPoint = null; scoreChart.bind("plothover", function (event, pos, item) { if (typeof pos.x == 'undefined') return; var xPos = pos.x.toFixed(0); $("#x").text(xPos < 0 || xPos == "-0" ? "" : xPos); $("#y").text(pos.y.toFixed(5)); if (item) { if (previousPoint != item.dataIndex) { previousPoint = item.dataIndex; $("#tooltip").remove(); var x = item.datapoint[0].toFixed(0); var y = item.datapoint[1].toFixed(5); showTooltip(item.pageX - scoreChart.offset().left, item.pageY - scoreChart.offset().top, "(" + x + ", " + y + ")"); } } else { $("#tooltip").remove(); previousPoint = null; } }); } } /* ---------- Model Performance Table ---------- */ function renderModelPerformanceTable(data) { /* Model */ var modelType = data["model"][0][1]; var nLayers = data["model"][1][1]; var nParams = data["model"][2][1]; /* Performance */ var startTime = data["perf"][0][1]; var totalRuntime = data["perf"][1][1]; var lastUpdate = data["perf"][2][1]; var totalParamUpdates = data["perf"][3][1]; var updatesPerSec = data["perf"][4][1]; var examplesPerSec = data["perf"][5][1]; /* Inject Model Information */ $("#modelType").html(modelType); $("#nLayers").html(nLayers); $("#nParams").html(nParams); /* Inject Performance Information */ $("#startTime").html(startTime); $("#totalRuntime").html(totalRuntime); $("#lastUpdate").html(lastUpdate); $("#totalParamUpdates").html(totalParamUpdates); $("#updatesPerSec").html(updatesPerSec); $("#examplesPerSec").html(examplesPerSec); } /* ---------- Ratio of Updates to Parameters Chart ---------- */ function renderUpdatesRatio(data) { var ratios = data["updateRatios"]; var iter = data["scoresIter"]; var chart = $("#updateRatioChart"); if (chart.length) { var keys = Object.keys(ratios); var toPlot = []; var overallMax = -Number.MAX_VALUE; var overallMin = Number.MAX_VALUE; for (var i = 0; i < keys.length; i++) { var r = ratios[keys[i]]; var pairs = []; for (var j = 0; j < r.length; j++) { pairs.push([iter[j], Math.log10(r[j])]); } toPlot.push({data: pairs, label: keys[i]}); var thisMax = Math.max.apply(Math, r); var thisMin = Math.min.apply(Math, r); overallMax = Math.max(overallMax, thisMax); overallMin = Math.min(overallMin, thisMin); } if (overallMax == -Number.MAX_VALUE) overallMax = 1.0; if (overallMin == Number.MAX_VALUE) overallMin = 0.0; overallMax = Math.log10(overallMax); overallMin = Math.log10(overallMin); overallMin = Math.max(overallMin, -10); overallMax = Math.ceil(overallMax); overallMin = Math.floor(overallMin); var plot = $.plot(chart, toPlot, { series: { lines: { show: true, lineWidth: 2 } // points: {show: true}, // shadowSize: 2 }, grid: { hoverable: true, clickable: true, tickColor: "#dddddd", borderWidth: 0 }, yaxis: {min: overallMin, max: overallMax}, colors: ["#FA5833", "#2FABE9"] }); function showTooltip(x, y, contents) { $('
' + contents + '
').css({ position: 'absolute', display: 'none', top: y + 8, left: x + 10, border: '1px solid #fdd', padding: '2px', 'background-color': '#dfeffc', opacity: 0.80 }).appendTo("#updateRatioChart").fadeIn(200); } var previousPoint = null; chart.bind("plothover", function (event, pos, item) { if (typeof pos.x == 'undefined') return; var xPos = pos.x.toFixed(0); $("#xRatio").text(xPos < 0 || xPos == "-0" ? "" : xPos); $("#yLogRatio").text(pos.y.toFixed(5)); $("#yRatio").text(Math.pow(10, pos.y).toFixed(5)); if (item) { if (previousPoint != item.dataIndex) { previousPoint = item.dataIndex; $("#tooltipRatioChart").remove(); var x = item.datapoint[0].toFixed(0); var logy = item.datapoint[1].toFixed(5); var y = Math.pow(10, item.datapoint[1]).toFixed(5); showTooltip(item.pageX - chart.offset().left, item.pageY - chart.offset().top, "(" + x + ", logRatio=" + logy + ", ratio=" + y + ")"); } } else { $("#tooltipRatioChart").remove(); previousPoint = null; } }); } } /* ---------- Stdev Charts ---------- */ function renderStdevChart(data) { var selected = selectedChart; var chart = $("#stdevChart"); if (chart.length) { var stdevs = data[selected]; var iter = data["scoresIter"]; var keys = Object.keys(stdevs); var toPlot = []; var overallMax = -Number.MAX_VALUE; var overallMin = Number.MAX_VALUE; for (var i = 0; i < keys.length; i++) { var r = stdevs[keys[i]]; var pairs = []; for (var j = 0; j < r.length; j++) { pairs.push([iter[j], Math.log10(r[j])]); } toPlot.push({data: pairs, label: keys[i]}); var thisMax = Math.max.apply(Math, r); var thisMin = Math.min.apply(Math, r); overallMax = Math.max(overallMax, thisMax); overallMin = Math.min(overallMin, thisMin); } if (overallMax == -Number.MAX_VALUE) overallMax = 1.0; if (overallMin == Number.MAX_VALUE) overallMin = 0.0; overallMax = Math.log10(overallMax); overallMin = Math.log10(overallMin); overallMin = Math.max(overallMin, -10); overallMax = Math.ceil(overallMax); overallMin = Math.floor(overallMin); var plot = $.plot(chart, toPlot, { series: { lines: { show: true, lineWidth: 2 } }, grid: { hoverable: true, clickable: true, tickColor: "#dddddd", borderWidth: 0 }, yaxis: {min: overallMin, max: overallMax}, colors: ["#FA5833", "#2FABE9"] }); function showTooltip(x, y, contents) { $('
' + contents + '
').css({ position: 'absolute', display: 'none', top: y + 8, left: x + 10, border: '1px solid #fdd', padding: '2px', 'background-color': '#dfeffc', opacity: 0.80 }).appendTo("#stdevChart").fadeIn(200); } var previousPoint = null; chart.bind("plothover", function (event, pos, item) { if (typeof pos.x == 'undefined') return; var xPos = pos.x.toFixed(0); $("#xStdev").text(xPos < 0 || xPos == "-0" ? "" : xPos); $("#yLogStdev").text(pos.y.toFixed(5)); $("#yStdev").text(Math.pow(10, pos.y).toFixed(5)); //Tooltip if (item) { if (previousPoint != item.dataIndex) { previousPoint = item.dataIndex; $("#tooltipStdevChart").remove(); var x = item.datapoint[0].toFixed(0); var logy = item.datapoint[1].toFixed(5); var y = Math.pow(10, item.datapoint[1]).toFixed(5); showTooltip(item.pageX - chart.offset().left, item.pageY - chart.offset().top, item.series.label + " (" + x + ", logStdev=" + logy + ", stdev=" + y + ")"); } } else { $("#tooltipStdevChart").remove(); previousPoint = null; } }); } } /* --------------- linear least squares (best fit line) ---------- */ function findLineByLeastSquares(values_x, values_y) { var sum_x = 0; var sum_y = 0; var sum_xy = 0; var sum_xx = 0; var count = 0; /* * We'll use those variables for faster read/write access. */ var x = 0; var y = 0; var values_length = values_x.length; if (values_length != values_y.length) { throw new Error('The parameters values_x and values_y need to have same size!'); } /* * Nothing to do. */ if (values_length === 0) { return [ [], [] ]; } /* * Calculate the sum for each of the parts necessary. */ for (var v = 0; v < values_length; v++) { x = values_x[v]; y = values_y[v]; sum_x += x; sum_y += y; sum_xx += x*x; sum_xy += x*y; count++; } /* * Calculate m and b for the formular: * y = x * m + b */ var m = (count*sum_xy - sum_x*sum_y) / (count*sum_xx - sum_x*sum_x); var b = (sum_y/count) - (m*sum_x)/count; /* * We will make the x and y result line now */ var result_values_x = []; var result_values_y = []; for (var v = 0; v < values_length; v++) { x = values_x[v]; y = x * m + b; result_values_x.push(x); result_values_y.push(y); } return [result_values_x, result_values_y]; } /* --------------- exponential moving average (best fit line) ---------- */ function EMACalc(mArray,mRange) { var k = 2/(mRange + 1); // first item is just the same as the first item in the input emaArray = [mArray[0]]; // for the rest of the items, they are computed with the previous one for (var i = 1; i < mArray.length; i++) { emaArray.push(mArray[i] * k + emaArray[i - 1] * (1 - k)); } return emaArray; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy