@tensorflow/tfjs-core
Version:
Hardware-accelerated JavaScript library for machine intelligence
479 lines • 21.3 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
var doc_1 = require("../doc");
var environment_1 = require("../environment");
var util = require("../util");
var operation_1 = require("./operation");
var ops = require("./ops");
var ops_1 = require("./ops");
var selu_util = require("./selu_util");
var UnaryOps = (function () {
function UnaryOps() {
}
UnaryOps.neg = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'neg');
var grad = function (dy) {
return { x: function () { return dy.neg(); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.neg(x); }, { x: x }, grad);
};
UnaryOps.ceil = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'ceil');
var grad = function (dy) {
return { x: function () { return ops.zerosLike(dy); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.ceil(x); }, { x: x }, grad);
};
UnaryOps.floor = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'floor');
var grad = function (dy) {
return { x: function () { return ops.zerosLike(dy); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.floor(x); }, { x: x }, grad);
};
UnaryOps.sign = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'sign');
var grad = function (dy) {
return { x: function () { return ops.zerosLike(dy); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.sign(x); }, { x: x }, grad);
};
UnaryOps.round = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'round');
var grad = function (dy) {
return { x: function () { return ops.zerosLike(dy); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.round(x); }, { x: x }, grad);
};
UnaryOps.exp = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'exp');
var bck = function (dy, saved) {
var y = saved[0];
return { x: function () { return dy.mulStrict(y); } };
};
return environment_1.ENV.engine.runKernel(function (backend, save) { return save(backend.exp(x)); }, { x: x }, bck);
};
UnaryOps.expm1 = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'expm1');
var grad = function (dy) {
return { x: function () { return dy.mulStrict(x.exp()); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.expm1(x); }, { x: x }, grad);
};
UnaryOps.log = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'log');
var grad = function (dy) {
return { x: function () { return dy.divStrict(x.toFloat()); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.log(x); }, { x: x }, grad);
};
UnaryOps.log1p = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'log1p');
var grad = function (dy) {
return { x: function () { return dy.divStrict(x.add(ops.scalar(1))); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.log1p(x); }, { x: x }, grad);
};
UnaryOps.sqrt = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'sqrt');
var grad = function (dy) {
return { x: function () { return dy.divStrict(x.toFloat().sqrt().mul(ops.scalar(2))); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.sqrt(x); }, { x: x }, grad);
};
UnaryOps.rsqrt = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'rsqrt');
var grad = function (dy) {
return {
x: function () { return dy.divStrict(x.pow(ops.scalar(1.5)).mul(ops.scalar(2))).neg(); }
};
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.rsqrt(x); }, { x: x }, grad);
};
UnaryOps.square = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'square');
var grad = function (dy) {
return { x: function () { return dy.mulStrict(x.toFloat().mul(ops.scalar(2))); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.square(x); }, { x: x }, grad);
};
UnaryOps.reciprocal = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'reciprocal');
var grad = function (dy) {
return { x: function () { return dy.divStrict(x.square().neg()); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.reciprocal(x); }, { x: x }, grad);
};
UnaryOps.abs = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'abs');
var grad = function (dy) {
return { x: function () { return dy.mulStrict(x.toFloat().step(-1)); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.abs(x); }, { x: x }, grad);
};
UnaryOps.clipByValue = function (x, clipValueMin, clipValueMax) {
util.assertArgumentsAreTensors({ x: x }, 'clipByValue');
util.assert((clipValueMin <= clipValueMax), "Error in clip: min (" + clipValueMin + ") must be " +
("less than or equal to max (" + clipValueMax + ")."));
var grad = function (dy) {
return {
x: function () { return dy.where(x.greater(ops.scalar(clipValueMin))
.logicalAnd(x.less(ops.scalar(clipValueMax))), ops_1.zerosLike(dy)); },
};
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.clip(x, clipValueMin, clipValueMax); }, { x: x }, grad);
};
UnaryOps.relu = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'relu');
if (x.dtype === 'bool') {
return x.toInt();
}
var grad = function (dy) {
var stepRes = x.step();
return { x: function () { return dy.mulStrict(stepRes.toFloat()); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.relu(x); }, { x: x }, grad);
};
UnaryOps.elu = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'elu');
var grad = function (dy, saved) {
var y = saved[0];
return {
x: function () {
return environment_1.ENV.engine.runKernel(function (backend) { return backend.eluDer(dy, y); }, { dy: dy, y: y });
}
};
};
return environment_1.ENV.engine.runKernel(function (backend, save) { return save(backend.elu(x)); }, { x: x }, grad);
};
UnaryOps.selu = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'selu');
var grad = function (dy) {
return {
x: function () {
var mask = x.greater(ops.scalar(0));
var scaleAlpha = ops.scalar(selu_util.SELU_SCALEALPHA);
var scale = ops.scalar(selu_util.SELU_SCALE);
var greaterThanZeroDer = dy.mul(scale);
var lessEqualZeroDer = dy.mul(scaleAlpha).mul(x.toFloat().exp());
return ops.where(mask, greaterThanZeroDer, lessEqualZeroDer);
}
};
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.selu(x); }, { x: x }, grad);
};
UnaryOps.leakyRelu = function (x, alpha) {
if (alpha === void 0) { alpha = 0.2; }
util.assertArgumentsAreTensors({ x: x }, 'leakyRelu');
return ops.maximum(ops.scalar(alpha).mul(x), x);
};
UnaryOps.prelu = function (x, alpha) {
util.assertArgumentsAreTensors({ x: x, alpha: alpha }, 'prelu');
var zero = ops.scalar(0);
return ops.maximum(zero, x).add(alpha.mul(ops.minimum(zero, x)));
};
UnaryOps.sigmoid = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'sigmoid');
var grad = function (dy, saved) {
var y = saved[0];
return { x: function () { return dy.mulStrict(y.mul(ops.scalar(1).sub(y))); } };
};
return environment_1.ENV.engine.runKernel(function (backend, save) { return save(backend.sigmoid(x)); }, { x: x }, grad);
};
UnaryOps.logSigmoid = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'logSigmoid');
var grad = function (dy) {
return { x: function () { return dy.mulStrict(x.neg().sigmoid()); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.softplus(x.neg()).neg(); }, { x: x }, grad);
};
UnaryOps.softplus = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'softplus');
var grad = function (dy) {
return { x: function () { return dy.mulStrict(x.sigmoid()); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.softplus(x); }, { x: x }, grad);
};
UnaryOps.sin = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'sin');
var grad = function (dy) {
return { x: function () { return x.toFloat().cos().mulStrict(dy); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.sin(x); }, { x: x }, grad);
};
UnaryOps.cos = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'cos');
var grad = function (dy) {
return { x: function () { return x.toFloat().sin().neg().mulStrict(dy); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.cos(x); }, { x: x }, grad);
};
UnaryOps.tan = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'tan');
var grad = function (dy) {
return { x: function () { return dy.divStrict(x.cos().square()); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.tan(x); }, { x: x }, grad);
};
UnaryOps.asin = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'asin');
var grad = function (dy) {
return {
x: function () {
return dy.divStrict(UnaryOps.sqrt(ops.scalar(1).sub(x.toFloat().square())));
}
};
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.asin(x); }, { x: x }, grad);
};
UnaryOps.acos = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'acos');
var grad = function (dy) {
return {
x: function () {
return dy.divStrict(UnaryOps.sqrt(ops.scalar(1).sub(x.toFloat().square())))
.neg();
}
};
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.acos(x); }, { x: x }, grad);
};
UnaryOps.atan = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'atan');
var grad = function (dy) {
return { x: function () { return dy.divStrict(ops.scalar(1).add(x.toFloat().square())); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.atan(x); }, { x: x }, grad);
};
UnaryOps.sinh = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'sinh');
var grad = function (dy) {
return { x: function () { return x.toFloat().cosh().mulStrict(dy); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.sinh(x); }, { x: x }, grad);
};
UnaryOps.cosh = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'cosh');
var grad = function (dy) {
return { x: function () { return x.toFloat().sinh().mulStrict(dy); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.cosh(x); }, { x: x }, grad);
};
UnaryOps.tanh = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'tanh');
var grad = function (dy, saved) {
var y = saved[0];
return { x: function () { return ops.scalar(1).sub(y.square()).mulStrict(dy); } };
};
return environment_1.ENV.engine.runKernel(function (backend, save) { return save(backend.tanh(x)); }, { x: x }, grad);
};
UnaryOps.asinh = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'asinh');
var grad = function (dy) {
return {
x: function () {
return dy.divStrict(UnaryOps.sqrt(ops.scalar(1).add(x.toFloat().square())));
}
};
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.asinh(x); }, { x: x }, grad);
};
UnaryOps.acosh = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'acosh');
var grad = function (dy) {
return {
x: function () {
return dy.divStrict(UnaryOps.sqrt(x.toFloat().square().sub(ops.scalar(1))));
}
};
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.acosh(x); }, { x: x }, grad);
};
UnaryOps.atanh = function (x) {
util.assertArgumentsAreTensors({ x: x }, 'atanh');
var grad = function (dy) {
return { x: function () { return dy.divStrict(ops.scalar(1).sub(x.toFloat().square())); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.atanh(x); }, { x: x }, grad);
};
UnaryOps.erf = function (x) {
util.assert(x.dtype === 'int32' || x.dtype === 'float32', 'Input dtype must be `int32` or `float32`.');
if (x.dtype === 'int32') {
x = x.toFloat();
}
var grad = function (dy) {
return {
x: function () {
return dy.mulStrict(ops.scalar(2 / Math.sqrt(Math.PI))
.mul(x.square().neg().exp()));
}
};
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.erf(x); }, { x: x }, grad);
};
UnaryOps.step = function (x, alpha) {
if (alpha === void 0) { alpha = 0.0; }
util.assertArgumentsAreTensors({ x: x }, 'step');
var grad = function (dy) {
return { x: function () { return ops.zerosLike(dy); } };
};
return environment_1.ENV.engine.runKernel(function (backend) { return backend.step(x, alpha); }, { x: x }, grad);
};
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "neg", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "ceil", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "floor", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "sign", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "round", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "exp", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "expm1", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "log", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "log1p", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "sqrt", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "rsqrt", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "square", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "reciprocal", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "abs", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "clipByValue", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "relu", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "elu", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "selu", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "leakyRelu", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "prelu", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "sigmoid", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "logSigmoid", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "softplus", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "sin", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "cos", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "tan", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "asin", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "acos", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "atan", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "sinh", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "cosh", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "tanh", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "asinh", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "acosh", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "atanh", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "erf", null);
__decorate([
doc_1.doc({ heading: 'Operations', subheading: 'Basic math' }),
operation_1.operation
], UnaryOps, "step", null);
return UnaryOps;
}());
exports.UnaryOps = UnaryOps;
//# sourceMappingURL=unary_ops.js.map