@tensorflow/tfjs-node
Advanced tools
Comparing version 1.0.3 to 1.1.0
@@ -56,2 +56,3 @@ "use strict"; | ||
var tf = require("@tensorflow/tfjs"); | ||
// tslint:disable-next-line:max-line-length | ||
var callbacks_1 = require("./callbacks"); | ||
@@ -71,2 +72,11 @@ describe('progbarLogger', function () { | ||
}()); | ||
var originalStderrColumns; | ||
beforeEach(function () { | ||
// In some CI environments, process.stderr.columns has a null value. | ||
originalStderrColumns = process.stderr.columns; | ||
process.stderr.columns = 100; | ||
}); | ||
afterEach(function () { | ||
process.stderr.columns = originalStderrColumns; | ||
}); | ||
it('Model.fit with loss, no metric, no validation, verobse = 1', function () { return __awaiter(_this, void 0, void 0, function () { | ||
@@ -329,2 +339,30 @@ var fakeProgbars, consoleMessages, model, numSamples, epochs, batchSize, xs, ys, _i, fakeProgbars_1, fakeProgbar, tickConfigs, i; | ||
}); | ||
describe('getSuccinctNumberDisplay', function () { | ||
it('Not finite', function () { | ||
expect(callbacks_1.getSuccinctNumberDisplay(Infinity)).toEqual('Infinity'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(-Infinity)).toEqual('-Infinity'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(NaN)).toEqual('NaN'); | ||
}); | ||
it('zero', function () { | ||
expect(callbacks_1.getSuccinctNumberDisplay(0)).toEqual('0.00'); | ||
}); | ||
it('Finite and positive', function () { | ||
expect(callbacks_1.getSuccinctNumberDisplay(300)).toEqual('300.00'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(30)).toEqual('30.00'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(1)).toEqual('1.00'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(1e-2)).toEqual('0.0100'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(1e-3)).toEqual('1.00e-3'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(4e-3)).toEqual('4.00e-3'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(1e-6)).toEqual('1.00e-6'); | ||
}); | ||
it('Finite and negative', function () { | ||
expect(callbacks_1.getSuccinctNumberDisplay(-300)).toEqual('-300.00'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(-30)).toEqual('-30.00'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(-1)).toEqual('-1.00'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(-1e-2)).toEqual('-0.0100'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(-1e-3)).toEqual('-1.00e-3'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(-4e-3)).toEqual('-4.00e-3'); | ||
expect(callbacks_1.getSuccinctNumberDisplay(-1e-6)).toEqual('-1.00e-6'); | ||
}); | ||
}); | ||
describe('getDisplayDecimalPlaces', function () { | ||
@@ -331,0 +369,0 @@ it('Not finite', function () { |
@@ -32,2 +32,4 @@ /** | ||
private batchesInLatestEpoch; | ||
private terminalWidth; | ||
private readonly RENDER_THROTTLE_MS; | ||
/** | ||
@@ -41,2 +43,12 @@ * Construtor of LoggingCallback. | ||
/** | ||
* Get a succint string representation of a number. | ||
* | ||
* Uses decimal notation if the number isn't too small. | ||
* Otherwise, use engineering notation. | ||
* | ||
* @param x Input number. | ||
* @return Succinct string representing `x`. | ||
*/ | ||
export declare function getSuccinctNumberDisplay(x: number): string; | ||
/** | ||
* Determine the number of decimal places to display. | ||
@@ -43,0 +55,0 @@ * |
@@ -113,2 +113,3 @@ "use strict"; | ||
this.batchesInLatestEpoch = 0; | ||
this.terminalWidth = process.stderr.columns; | ||
return [2 /*return*/]; | ||
@@ -118,3 +119,3 @@ }); | ||
onBatchEnd: function (batch, logs) { return __awaiter(_this, void 0, void 0, function () { | ||
var tickTokens; | ||
var maxMetricsStringLength, tickTokens; | ||
return __generator(this, function (_a) { | ||
@@ -125,6 +126,12 @@ switch (_a.label) { | ||
if (batch === 0) { | ||
this.progressBar = new exports.progressBarHelper.ProgressBar('eta=:eta :bar :placeholderForLossesAndMetrics', { total: this.numTrainBatchesPerEpoch + 1, head: ">" }); | ||
this.progressBar = new exports.progressBarHelper.ProgressBar('eta=:eta :bar :placeholderForLossesAndMetrics', { | ||
width: Math.floor(0.5 * this.terminalWidth), | ||
total: this.numTrainBatchesPerEpoch + 1, | ||
head: ">", | ||
renderThrottle: this.RENDER_THROTTLE_MS | ||
}); | ||
} | ||
maxMetricsStringLength = Math.floor(this.terminalWidth * 0.5 - 12); | ||
tickTokens = { | ||
placeholderForLossesAndMetrics: this.formatLogsAsMetricsContent(logs) | ||
placeholderForLossesAndMetrics: this.formatLogsAsMetricsContent(logs, maxMetricsStringLength) | ||
}; | ||
@@ -177,5 +184,6 @@ if (this.numTrainBatchesPerEpoch === 0) { | ||
}) || this; | ||
_this.RENDER_THROTTLE_MS = 50; | ||
return _this; | ||
} | ||
ProgbarLogger.prototype.formatLogsAsMetricsContent = function (logs) { | ||
ProgbarLogger.prototype.formatLogsAsMetricsContent = function (logs, maxMetricsLength) { | ||
var metricsContent = ''; | ||
@@ -187,6 +195,10 @@ var keys = Object.keys(logs).sort(); | ||
var value = logs[key]; | ||
var decimalPlaces = getDisplayDecimalPlaces(value); | ||
metricsContent += key + "=" + value.toFixed(decimalPlaces) + " "; | ||
metricsContent += key + "=" + getSuccinctNumberDisplay(value) + " "; | ||
} | ||
} | ||
if (maxMetricsLength != null && metricsContent.length > maxMetricsLength) { | ||
// Cut off metrics strings that are too long to avoid new lines being | ||
// constantly created. | ||
metricsContent = metricsContent.slice(0, maxMetricsLength - 3) + '...'; | ||
} | ||
return metricsContent; | ||
@@ -200,3 +212,20 @@ }; | ||
exports.ProgbarLogger = ProgbarLogger; | ||
var BASE_NUM_DIGITS = 2; | ||
var MAX_NUM_DECIMAL_PLACES = 4; | ||
/** | ||
* Get a succint string representation of a number. | ||
* | ||
* Uses decimal notation if the number isn't too small. | ||
* Otherwise, use engineering notation. | ||
* | ||
* @param x Input number. | ||
* @return Succinct string representing `x`. | ||
*/ | ||
function getSuccinctNumberDisplay(x) { | ||
var decimalPlaces = getDisplayDecimalPlaces(x); | ||
return decimalPlaces > MAX_NUM_DECIMAL_PLACES ? | ||
x.toExponential(BASE_NUM_DIGITS) : x.toFixed(decimalPlaces); | ||
} | ||
exports.getSuccinctNumberDisplay = getSuccinctNumberDisplay; | ||
/** | ||
* Determine the number of decimal places to display. | ||
@@ -208,3 +237,2 @@ * | ||
function getDisplayDecimalPlaces(x) { | ||
var BASE_NUM_DIGITS = 2; | ||
if (!Number.isFinite(x) || x === 0 || x > 1 || x < -1) { | ||
@@ -211,0 +239,0 @@ return BASE_NUM_DIGITS; |
@@ -36,3 +36,2 @@ "use strict"; | ||
var nodeIo = require("./io/index"); | ||
var node_http_1 = require("./io/node_http"); | ||
var nodejs_kernel_backend_1 = require("./nodejs_kernel_backend"); | ||
@@ -49,8 +48,8 @@ var nodeVersion = require("./version"); | ||
var pjson = require('../package.json'); | ||
tf.ENV.registerBackend('tensorflow', function () { | ||
tf.registerBackend('tensorflow', function () { | ||
return new nodejs_kernel_backend_1.NodeJSKernelBackend(bindings('tfjs_binding.node'), pjson.name); | ||
}, 3 /* priority */); | ||
// If registration succeeded, set the backend. | ||
if (tf.ENV.findBackend('tensorflow') != null) { | ||
tf.setBackend('tensorflow'); | ||
var success = tf.setBackend('tensorflow'); | ||
if (!success) { | ||
throw new Error("Could not initialize TensorFlow backend."); | ||
} | ||
@@ -60,4 +59,2 @@ // Register the model saving and loading handlers for the 'file://' URL scheme. | ||
tf.io.registerSaveRouter(file_system_1.nodeFileSystemRouter); | ||
tf.io.registerLoadRouter(node_http_1.nodeHTTPRequestRouter); | ||
// TODO(cais): Make HTTP-based save work from Node.js. | ||
var callbacks_1 = require("./callbacks"); | ||
@@ -64,0 +61,0 @@ // Register the ProgbarLogger for Model.fit() at verbosity level 1. |
@@ -55,5 +55,7 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var tfc = require("@tensorflow/tfjs-core"); | ||
var tfl = require("@tensorflow/tfjs-layers"); | ||
var tfn = require("../index"); | ||
var node_http_1 = require("./node_http"); | ||
// We still need node-fetch so that we can mock the core tfc.util.fetch call and | ||
// return a valid response. | ||
// tslint:disable-next-line:no-require-imports | ||
@@ -99,4 +101,3 @@ var fetch = require('node-fetch'); | ||
var setupFakeWeightFiles = function (fileBufferMap) { | ||
spyOn(node_http_1.fetchWrapper, 'fetch') | ||
.and.callFake(function (path, init) { | ||
spyOn(tfc.util, 'fetch').and.callFake(function (path, init) { | ||
return new Promise(function (resolve, reject) { | ||
@@ -103,0 +104,0 @@ var contentType = ''; |
@@ -18,5 +18,2 @@ /** | ||
import { io } from '@tensorflow/tfjs-core'; | ||
export declare const fetchWrapper: { | ||
fetch: any; | ||
}; | ||
/** | ||
@@ -23,0 +20,0 @@ * Factory function for HTTP IO Handler in Node.js. |
@@ -20,6 +20,2 @@ "use strict"; | ||
var tfjs_core_1 = require("@tensorflow/tfjs-core"); | ||
// tslint:disable-next-line:no-require-imports | ||
var fetch = require('node-fetch'); | ||
// For testing: Enables jasmine `spyOn()` with `fetch`. | ||
exports.fetchWrapper = { fetch: fetch }; | ||
/** | ||
@@ -34,3 +30,3 @@ * Factory function for HTTP IO Handler in Node.js. | ||
function nodeHTTPRequest(path, requestInit, weightPathPrefix) { | ||
return tfjs_core_1.io.browserHTTPRequest(path, { requestInit: requestInit, weightPathPrefix: weightPathPrefix, fetchFunc: exports.fetchWrapper.fetch }); | ||
return tfjs_core_1.io.browserHTTPRequest(path, { requestInit: requestInit, weightPathPrefix: weightPathPrefix }); | ||
} | ||
@@ -37,0 +33,0 @@ exports.nodeHTTPRequest = nodeHTTPRequest; |
@@ -54,3 +54,3 @@ "use strict"; | ||
// installed. | ||
if (tf.ENV.backend.isGPUPackage) { | ||
if (tf.backend().isGPUPackage) { | ||
var input = tf.ones([1, 2, 2, 2, 1]); | ||
@@ -57,0 +57,0 @@ var filter = tf.ones([1, 1, 1, 1, 1]); |
@@ -33,3 +33,3 @@ /** | ||
private executeSingleInput; | ||
floatPrecision(): number; | ||
floatPrecision(): 16 | 32; | ||
/** | ||
@@ -36,0 +36,0 @@ * Executes a TensorFlow Eager Op that provides one output Tensor. |
@@ -25,3 +25,3 @@ "use strict"; | ||
if (gBackend === null) { | ||
gBackend = tfc.ENV.findBackend('tensorflow'); | ||
gBackend = tfc.findBackend('tensorflow'); | ||
} | ||
@@ -28,0 +28,0 @@ return gBackend; |
@@ -30,3 +30,3 @@ "use strict"; | ||
}); | ||
jasmine_util.setTestEnvs([{ name: 'test-tensorflow', factory: function () { return op_utils_1.nodeBackend(); }, features: {} }]); | ||
jasmine_util.setTestEnvs([{ name: 'test-tensorflow', backendName: 'tensorflow', flags: {} }]); | ||
var IGNORE_LIST = [ | ||
@@ -33,0 +33,0 @@ // Always ignore version tests: |
/** @license See the LICENSE file. */ | ||
declare const version = "1.0.3"; | ||
declare const version = "1.1.0"; | ||
export { version }; |
@@ -5,3 +5,3 @@ "use strict"; | ||
// This code is auto-generated, do not modify this file! | ||
var version = '1.0.3'; | ||
var version = '1.1.0'; | ||
exports.version = version; |
{ | ||
"name": "@tensorflow/tfjs-node", | ||
"version": "1.0.3", | ||
"version": "1.1.0", | ||
"main": "dist/index.js", | ||
@@ -26,3 +26,5 @@ "types": "dist/index.d.ts", | ||
"publish-local": "yarn prep && yalc push", | ||
"test": "ts-node src/run_tests.ts" | ||
"test": "ts-node src/run_tests.ts", | ||
"test-ci": "./scripts/test-ci.sh", | ||
"test-ts-integration": "./scripts/test-ts-integration.sh" | ||
}, | ||
@@ -37,2 +39,3 @@ "devDependencies": { | ||
"jasmine": "~3.1.0", | ||
"node-fetch": "^2.3.0", | ||
"nyc": "^13.3.0", | ||
@@ -47,7 +50,6 @@ "shelljs": "^0.8.3", | ||
"dependencies": { | ||
"@tensorflow/tfjs": "~1.0.3", | ||
"@tensorflow/tfjs": "~1.1.0", | ||
"adm-zip": "^0.4.11", | ||
"bindings": "~1.3.0", | ||
"https-proxy-agent": "^2.2.1", | ||
"node-fetch": "^2.3.0", | ||
"progress": "^2.0.0", | ||
@@ -54,0 +56,0 @@ "rimraf": "^2.6.2", |
@@ -1,5 +0,1 @@ | ||
<a id="travis-badge" href="https://travis-ci.org/tensorflow/tfjs-node" alt="Build Status"> | ||
<img src="https://travis-ci.org/tensorflow/tfjs-node.svg?branch=master" /> | ||
</a> | ||
# TensorFlow backend for TensorFlow.js via Node.js | ||
@@ -6,0 +2,0 @@ |
@@ -43,2 +43,6 @@ /** | ||
private terminalWidth: number; | ||
private readonly RENDER_THROTTLE_MS = 50; | ||
/** | ||
@@ -68,2 +72,3 @@ * Construtor of LoggingCallback. | ||
this.batchesInLatestEpoch = 0; | ||
this.terminalWidth = process.stderr.columns; | ||
}, | ||
@@ -74,7 +79,14 @@ onBatchEnd: async (batch: number, logs?: Logs) => { | ||
this.progressBar = new progressBarHelper.ProgressBar( | ||
'eta=:eta :bar :placeholderForLossesAndMetrics', | ||
{total: this.numTrainBatchesPerEpoch + 1, head: `>`}); | ||
'eta=:eta :bar :placeholderForLossesAndMetrics', { | ||
width: Math.floor(0.5 * this.terminalWidth), | ||
total: this.numTrainBatchesPerEpoch + 1, | ||
head: `>`, | ||
renderThrottle: this.RENDER_THROTTLE_MS | ||
}); | ||
} | ||
const maxMetricsStringLength = | ||
Math.floor(this.terminalWidth * 0.5 - 12); | ||
const tickTokens = { | ||
placeholderForLossesAndMetrics: this.formatLogsAsMetricsContent(logs) | ||
placeholderForLossesAndMetrics: | ||
this.formatLogsAsMetricsContent(logs, maxMetricsStringLength) | ||
}; | ||
@@ -115,3 +127,4 @@ if (this.numTrainBatchesPerEpoch === 0) { | ||
private formatLogsAsMetricsContent(logs: Logs): string { | ||
private formatLogsAsMetricsContent( | ||
logs: Logs, maxMetricsLength?: number): string { | ||
let metricsContent = ''; | ||
@@ -122,6 +135,11 @@ const keys = Object.keys(logs).sort(); | ||
const value = logs[key]; | ||
const decimalPlaces = getDisplayDecimalPlaces(value); | ||
metricsContent += `${key}=${value.toFixed(decimalPlaces)} `; | ||
metricsContent += `${key}=${getSuccinctNumberDisplay(value)} `; | ||
} | ||
} | ||
if (maxMetricsLength != null && metricsContent.length > maxMetricsLength) { | ||
// Cut off metrics strings that are too long to avoid new lines being | ||
// constantly created. | ||
metricsContent = metricsContent.slice(0, maxMetricsLength - 3) + '...'; | ||
} | ||
return metricsContent; | ||
@@ -135,3 +153,21 @@ } | ||
const BASE_NUM_DIGITS = 2; | ||
const MAX_NUM_DECIMAL_PLACES = 4; | ||
/** | ||
* Get a succint string representation of a number. | ||
* | ||
* Uses decimal notation if the number isn't too small. | ||
* Otherwise, use engineering notation. | ||
* | ||
* @param x Input number. | ||
* @return Succinct string representing `x`. | ||
*/ | ||
export function getSuccinctNumberDisplay(x: number): string { | ||
const decimalPlaces = getDisplayDecimalPlaces(x); | ||
return decimalPlaces > MAX_NUM_DECIMAL_PLACES ? | ||
x.toExponential(BASE_NUM_DIGITS) : x.toFixed(decimalPlaces); | ||
} | ||
/** | ||
* Determine the number of decimal places to display. | ||
@@ -143,3 +179,2 @@ * | ||
export function getDisplayDecimalPlaces(x: number): number { | ||
const BASE_NUM_DIGITS = 2; | ||
if (!Number.isFinite(x) || x === 0 || x > 1 || x < -1) { | ||
@@ -146,0 +181,0 @@ return BASE_NUM_DIGITS; |
@@ -22,3 +22,2 @@ /** | ||
import * as nodeIo from './io/index'; | ||
import {nodeHTTPRequestRouter} from './io/node_http'; | ||
import {NodeJSKernelBackend} from './nodejs_kernel_backend'; | ||
@@ -47,3 +46,3 @@ import * as nodeVersion from './version'; | ||
tf.ENV.registerBackend('tensorflow', () => { | ||
tf.registerBackend('tensorflow', () => { | ||
return new NodeJSKernelBackend( | ||
@@ -53,5 +52,5 @@ bindings('tfjs_binding.node') as TFJSBinding, pjson.name); | ||
// If registration succeeded, set the backend. | ||
if (tf.ENV.findBackend('tensorflow') != null) { | ||
tf.setBackend('tensorflow'); | ||
const success = tf.setBackend('tensorflow'); | ||
if (!success) { | ||
throw new Error(`Could not initialize TensorFlow backend.`); | ||
} | ||
@@ -62,4 +61,2 @@ | ||
tf.io.registerSaveRouter(nodeFileSystemRouter); | ||
tf.io.registerLoadRouter(nodeHTTPRequestRouter); | ||
// TODO(cais): Make HTTP-based save work from Node.js. | ||
@@ -66,0 +63,0 @@ import {ProgbarLogger} from './callbacks'; |
@@ -20,8 +20,2 @@ /** | ||
// tslint:disable-next-line:no-require-imports | ||
const fetch = require('node-fetch'); | ||
// For testing: Enables jasmine `spyOn()` with `fetch`. | ||
export const fetchWrapper = {fetch}; | ||
/** | ||
@@ -38,5 +32,3 @@ * Factory function for HTTP IO Handler in Node.js. | ||
weightPathPrefix?: string): io.IOHandler { | ||
return io.browserHTTPRequest( | ||
path as string, | ||
{requestInit, weightPathPrefix, fetchFunc: fetchWrapper.fetch}); | ||
return io.browserHTTPRequest(path as string, {requestInit, weightPathPrefix}); | ||
} | ||
@@ -43,0 +35,0 @@ |
@@ -156,3 +156,3 @@ /** | ||
floatPrecision(): number { | ||
floatPrecision(): 16|32 { | ||
return 32; | ||
@@ -159,0 +159,0 @@ } |
@@ -29,3 +29,3 @@ /** | ||
if (gBackend === null) { | ||
gBackend = (tfc.ENV.findBackend('tensorflow') as NodeJSKernelBackend); | ||
gBackend = (tfc.findBackend('tensorflow') as NodeJSKernelBackend); | ||
} | ||
@@ -32,0 +32,0 @@ return gBackend; |
@@ -34,3 +34,3 @@ /** | ||
jasmine_util.setTestEnvs( | ||
[{name: 'test-tensorflow', factory: () => nodeBackend(), features: {}}]); | ||
[{name: 'test-tensorflow', backendName: 'tensorflow', flags: {}}]); | ||
@@ -37,0 +37,0 @@ const IGNORE_LIST: string[] = [ |
/** @license See the LICENSE file. */ | ||
// This code is auto-generated, do not modify this file! | ||
const version = '1.0.3'; | ||
const version = '1.1.0'; | ||
export {version}; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Unidentified License
License(Experimental) Something that seems like a license was found, but its contents could not be matched with a known license.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Unidentified License
License(Experimental) Something that seems like a license was found, but its contents could not be matched with a known license.
Found 1 instance in 1 package
1145731
7
8890
5
15
115
89
+ Added@rollup/rollup-android-arm-eabi@4.28.1(transitive)
+ Added@rollup/rollup-android-arm64@4.28.1(transitive)
+ Added@rollup/rollup-darwin-arm64@4.28.1(transitive)
+ Added@rollup/rollup-darwin-x64@4.28.1(transitive)
+ Added@rollup/rollup-freebsd-arm64@4.28.1(transitive)
+ Added@rollup/rollup-freebsd-x64@4.28.1(transitive)
+ Added@rollup/rollup-linux-arm-gnueabihf@4.28.1(transitive)
+ Added@rollup/rollup-linux-arm-musleabihf@4.28.1(transitive)
+ Added@rollup/rollup-linux-arm64-gnu@4.28.1(transitive)
+ Added@rollup/rollup-linux-arm64-musl@4.28.1(transitive)
+ Added@rollup/rollup-linux-loongarch64-gnu@4.28.1(transitive)
+ Added@rollup/rollup-linux-powerpc64le-gnu@4.28.1(transitive)
+ Added@rollup/rollup-linux-riscv64-gnu@4.28.1(transitive)
+ Added@rollup/rollup-linux-s390x-gnu@4.28.1(transitive)
+ Added@rollup/rollup-linux-x64-gnu@4.28.1(transitive)
+ Added@rollup/rollup-linux-x64-musl@4.28.1(transitive)
+ Added@rollup/rollup-win32-arm64-msvc@4.28.1(transitive)
+ Added@rollup/rollup-win32-ia32-msvc@4.28.1(transitive)
+ Added@rollup/rollup-win32-x64-msvc@4.28.1(transitive)
+ Added@tensorflow/tfjs@1.1.2(transitive)
+ Added@tensorflow/tfjs-converter@1.1.2(transitive)
+ Added@tensorflow/tfjs-core@1.1.2(transitive)
+ Added@tensorflow/tfjs-data@1.1.2(transitive)
+ Added@tensorflow/tfjs-layers@1.1.2(transitive)
+ Added@types/estree@1.0.6(transitive)
+ Addedfsevents@2.3.3(transitive)
+ Addedis-wsl@1.1.0(transitive)
+ Addedopn@5.5.0(transitive)
+ Addedrollup@4.28.1(transitive)
+ Addedrollup-plugin-visualizer@1.1.1(transitive)
+ Addedsource-map@0.7.4(transitive)
+ Addedtypeface-oswald@0.0.54(transitive)
- Removednode-fetch@^2.3.0
- Removed@tensorflow/tfjs@1.0.4(transitive)
- Removed@tensorflow/tfjs-converter@1.0.4(transitive)
- Removed@tensorflow/tfjs-core@1.0.4(transitive)
- Removed@tensorflow/tfjs-data@1.0.4(transitive)
- Removed@tensorflow/tfjs-layers@1.0.4(transitive)
- Removednode-fetch@2.7.0(transitive)
- Removedtr46@0.0.3(transitive)
- Removedwebidl-conversions@3.0.1(transitive)
- Removedwhatwg-url@5.0.0(transitive)
Updated@tensorflow/tfjs@~1.1.0