Tensors are the core datastructure of TensorFlow.js They are a generalization of vectors and matrices to potentially higher dimensions.
We have utility functions for common cases like Scalar, 1D, 2D, 3D and 4D tensors, as well a number of functions to initialize tensors in ways useful for machine learning.
Creates a tf.Tensor with the provided values, shape and dtype.
// Pass an array of values to create a vector.
tf.tensor([1, 2, 3, 4]).print();
// Pass a nested array of values to make a matrix or a higher
// dimensional tensor.
tf.tensor([[1, 2], [3, 4]]).print();
// Pass a flat array and specify a shape yourself.
tf.tensor([1, 2, 3, 4], [2, 2]).print();
values
.
Optional
Creates rank-0 tf.Tensor (scalar) with the provided value and dtype.
The same functionality can be achieved with tf.tensor(), but in general we recommend using tf.scalar() as it makes the code more readable.
tf.scalar(3.14).print();
Creates rank-1 tf.Tensor with the provided values, shape and dtype.
The same functionality can be achieved with tf.tensor(), but in general we recommend using tf.tensor1d() as it makes the code more readable.
tf.tensor1d([1, 2, 3]).print();
Creates rank-2 tf.Tensor with the provided values, shape and dtype.
The same functionality can be achieved with tf.tensor(), but in general we recommend using tf.tensor2d() as it makes the code more readable.
// Pass a nested array.
tf.tensor2d([[1, 2], [3, 4]]).print();
// Pass a flat array and specify a shape.
tf.tensor2d([1, 2, 3, 4], [2, 2]).print();
values
.
Optional
Creates rank-3 tf.Tensor with the provided values, shape and dtype.
The same functionality can be achieved with tf.tensor(), but in general we recommend using tf.tensor3d() as it makes the code more readable.
// Pass a nested array.
tf.tensor3d([[[1], [2]], [[3], [4]]]).print();
// Pass a flat array and specify a shape.
tf.tensor3d([1, 2, 3, 4], [2, 2, 1]).print();
values
.
Optional
Creates rank-4 tf.Tensor with the provided values, shape and dtype.
The same functionality can be achieved with tf.tensor(), but in general we recommend using tf.tensor4d() as it makes the code more readable.
// Pass a nested array.
tf.tensor4d([[[[1], [2]], [[3], [4]]]]).print();
// Pass a flat array and specify a shape.
tf.tensor4d([1, 2, 3, 4], [1, 2, 2, 1]).print();
values
.
Optional
Creates rank-5 tf.Tensor with the provided values, shape and dtype.
The same functionality can be achieved with tf.tensor(), but in general we recommend using tf.tensor5d() as it makes the code more readable.
// Pass a nested array.
tf.tensor5d([[[[[1], [2]], [[3], [4]]]]]).print();
// Pass a flat array and specify a shape.
tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]).print();
values
.
Optional
Creates an empty tf.TensorBuffer with the specified shape
and dtype
.
The values are stored in cpu as TypedArray. Fill the buffer using
buffer.set()
, or by modifying directly buffer.values
.
When done, call buffer.toTensor()
to get an immutable tf.Tensor with
those values.
// Create a buffer and set values at particular indices.
const buffer = tf.buffer([2, 2]);
buffer.set(3, 0, 0);
buffer.set(5, 1, 0);
// Convert the buffer back to a tensor.
buffer.toTensor().print();
Creates a new tensor with the same values and shape as the specified tensor.
const x = tf.tensor([1, 2]);
x.clone().print();
Create an identity matrix.
numRows
.
Optional
Creates a tf.Tensor filled with a scalar value.
tf.fill([2, 2], 4).print();
Creates a tf.Tensor from an image.
const image = new ImageData(1, 1);
image.data[0] = 100;
image.data[1] = 150;
image.data[2] = 200;
image.data[3] = 255;
tf.fromPixels(image).print();
Return an evenly spaced sequence of numbers over the given interval.
tf.linspace(0, 9, 10).print();
Creates a one-hot tf.Tensor. The locations represented by indices
take
value onValue
(defaults to 1), while all other locations take value
offValue
(defaults to 0).
tf.oneHot(tf.tensor1d([0, 1], 'int32'), 3).print();
int32
.
Creates a tf.Tensor with all elements set to 1.
tf.ones([2, 2]).print();
Creates a tf.Tensor with all elements set to 1 with the same shape as the given tensor.
const x = tf.tensor([1, 2]);
tf.onesLike(x).print();
Prints information about the tf.Tensor including its data.
const verbose = true;
tf.tensor2d([1, 2, 3, 4], [2, 2]).print(verbose);
Tensor
,
including dtype and size.
Optional
Creates a new tf.Tensor1D filled with the numbers in the range provided.
The tensor is a is half-open interval meaning it includes start, but excludes stop. Decrementing ranges and negative step values are also supported.
tf.range(0, 9, 2).print();
Creates rank-6 tf.Tensor with the provided values, shape and dtype.
The same functionality can be achieved with tf.tensor(), but in general we recommend using tf.tensor6d() as it makes the code more readable.
// Pass a nested array.
tf.tensor6d([[[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]]]).print();
// Pass a flat array and specify a shape.
tf.tensor6d([1, 2, 3, 4, 5, 6, 7, 8], [1, 1, 2, 2, 2, 1]).print();
values
.
Optional
Creates a tf.Tensor with values sampled from a truncated normal distribution.
tf.truncatedNormal([2, 2]).print();
The generated values follow a normal distribution with specified mean and standard deviation, except that values whose magnitude is more than 2 standard deviations from the mean are dropped and re-picked.
Creates a new variable with the provided initial value.
const x = tf.variable(tf.tensor([1, 2, 3]));
x.assign(tf.tensor([4, 5, 6]));
x.print();
Creates a tf.Tensor with all elements set to 0.
tf.zeros([2, 2]).print();
Creates a tf.Tensor with all elements set to 0 with the same shape as the given tensor.
const x = tf.tensor([1, 2]);
tf.zerosLike(x).print();
This section shows the main Tensor related classes in TensorFlow.js and the methods we expose on them.
A tf.Tensor object represents an immutable, multidimensional array of numbers that has a shape and a data type.
See tf.tensor() for details on how to create a tf.Tensor.
Converts a tf.Tensor to a tf.Tensor2D.
Converts a tf.Tensor to a tf.Tensor3D.
Converts a tf.Tensor to a tf.Tensor4D.
Casts a tf.Tensor to a specified dtype.
Returns a tf.TensorBuffer that holds the underlying data.
Asynchronously downloads the values from the tf.Tensor. Returns a promise of TypedArray that resolves when the computation has finished.
Synchronously downloads the values from the tf.Tensor. This blocks the UI thread until the values are ready, which can cause performance issues.
Prints the tf.Tensor. See tf.print() for details.
Reshapes the tensor into the provided shape. See tf.reshape() for more details.
Reshapes the tensor into the shape of the provided tensor.
Returns a tf.Tensor that has expanded rank, by inserting a dimension into the tensor's shape. See tf.expandDims() for details.
Returns the cumulative sum of the tf.Tensor along axis
.
Returns a tf.Tensor with dimensions of size 1 removed from the shape. See tf.squeeze() for more details.
A mutable tf.Tensor, useful for persisting state, e.g. for training.
A mutable object, similar to tf.Tensor, that allows users to set values at locations before converting to an immutable tf.Tensor.
See tf.buffer() for creating a tensor buffer.
Sets a value in the buffer at a given location.
Returns the value in the buffer at the provided location.
This section describes some common Tensor transformations for reshaping and type-casting.
Casts a tf.Tensor to a new dtype.
const x = tf.tensor1d([1.5, 2.5, 3]);
tf.cast(x, 'int32').print();
Returns a tf.Tensor that has expanded rank, by inserting a dimension into the tensor's shape.
const x = tf.tensor1d([1, 2, 3, 4]);
const axis = 1;
x.expandDims(axis).print();
1
. Defaults
to 0 (the first dimension).
Optional
Pads a tf.Tensor with a given value and paddings.
This operation currently only implements the CONSTANT
mode.
Also available are stricter rank-specific methods with the same signature
as this method that assert that paddings
is of given length.
tf.pad1d
tf.pad2d
tf.pad3d
tf.pad4d
const x = tf.tensor1d([1, 2, 3, 4]);
x.pad([[1, 2]]).print();
R
(the rank of the tensor), where
each element is a length-2 tuple of ints [padBefore, padAfter]
,
specifying how much to pad along each dimension of the tensor.
Reshapes a tf.Tensor to a given shape.
Given a input tensor, returns a new tensor with the same values as the
input tensor with shape shape
.
If one component of shape is the special value -1, the size of that dimension is computed so that the total size remains constant. In particular, a shape of [-1] flattens into 1-D. At most one component of shape can be -1.
If shape is 1-D or higher, then the operation returns a tensor with shape shape filled with the values of tensor. In this case, the number of elements implied by shape must be the same as the number of elements in tensor.
const x = tf.tensor1d([1, 2, 3, 4]);
x.reshape([2, 2]).print();
Removes dimensions of size 1 from the shape of a tf.Tensor.
const x = tf.tensor([1, 2, 3, 4], [1, 1, 4]);
x.squeeze().print();
TensorFlow.js provides several operations to slice or extract parts of a tensor, or join multiple tensors together.
Concatenates a list of tf.Tensors along a given axis.
The tensors ranks and types must match, and their sizes must match in all
dimensions except axis
.
Also available are stricter rank-specific methods that assert that
tensors
are of the given rank:
tf.concat1d
tf.concat2d
tf.concat3d
tf.concat4d
Except tf.concat1d
(which does not have axis param), all methods have
same signature as this method.
const a = tf.tensor1d([1, 2]);
const b = tf.tensor1d([3, 4]);
a.concat(b).print(); // or a.concat(b)
const a = tf.tensor1d([1, 2]);
const b = tf.tensor1d([3, 4]);
const c = tf.tensor1d([5, 6]);
tf.concat([a, b, c]).print();
const a = tf.tensor2d([[1, 2], [10, 20]]);
const b = tf.tensor2d([[3, 4], [30, 40]]);
const axis = 1;
tf.concat([a, b], axis).print();
Gather slices from tensor x
's axis axis
according to indices
.
const x = tf.tensor1d([1, 2, 3, 4]);
const indices = tf.tensor1d([1, 3, 3], 'int32');
x.gather(indices).print();
const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);
const indices = tf.tensor1d([1, 1, 0], 'int32');
x.gather(indices).print();
Reverses a tf.Tensor along a specified axis.
Also available are stricter rank-specific methods that assert that x
is
of the given rank:
tf.reverse1d
tf.reverse2d
tf.reverse3d
tf.reverse4d
Except tf.reverse1d
(which does not have axis param), all methods have
same signature as this method.
const x = tf.tensor1d([1, 2, 3, 4]);
x.reverse().print();
const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);
const axis = 1;
x.reverse(axis).print();
Extracts a slice from a tf.Tensor starting at coordinates begin
and is of size size
.
Also available are stricter rank-specific methods with the same signature
as this method that assert that x
is of the given rank:
tf.slice1d
tf.slice2d
tf.slice3d
tf.slice4d
const x = tf.tensor1d([1, 2, 3, 4]);
x.slice([1], [2]).print();
const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);
x.slice([1, 0], [1, 2]).print();
Splits a tf.Tensor into sub tensors.
If numOrSizeSplits
is a number, splits x
along dimension axis
into numOrSizeSplits
smaller tensors.
Requires that numOrSizeSplits
evenly divides x.shape[axis]
.
If numOrSizeSplits
is a number array, splits x
into
(numOrSizeSplits.length
pieces. The shape of the i
-th piece has the
same size as x
except along dimension axis
where the size is
numOrSizeSplits[i]
.
const x = tf.tensor2d([1, 2, 3, 4, 5, 6, 7, 8], [2, 4]);
const [a, b] = tf.split(x, 2, 1);
a.print();
b.print();
const [c, d, e] = tf.split(x, [1, 2, 1], 1);
c.print();
d.print();
e.print();
x.shape[axis]
; otherwise the sum of sizes must match x.shape[axis]
.
Stacks a list of rank-R
tf.Tensors into one rank-(R+1)
tf.Tensor.
const a = tf.tensor1d([1, 2]);
const b = tf.tensor1d([3, 4]);
const c = tf.tensor1d([5, 6]);
tf.stack([a, b, c]).print();
Construct an tensor by repeating it the number of times given by reps.
This operation creates a new tensor by replicating tf.input() reps
times. The output tensor's i'th dimension has input.shape[i] * reps[i]
elements, and the values of tf.input() are replicated
reps[i]
times along the i'th dimension. For example, tiling
[a, b, c, d]
by [2]
produces [a, b, c, d, a, b, c, d]
.
const a = tf.tensor1d([1, 2]);
a.tile([2]).print(); // or a.tile([2])
const a = tf.tensor2d([1, 2, 3, 4], [2, 2]);
a.tile([1, 2]).print(); // or a.tile([1, 2])
Unstacks a tf.Tensor of rank-R
into a list of rank-(R-1)
tf.Tensors.
const a = tf.tensor2d([1, 2, 3, 4], [2, 2]);
tf.unstack(a).forEach(tensor => tensor.print());
Creates a tf.Tensor with values drawn from a multinomial distribution.
const probs = tf.tensor([.75, .25]);
tf.multinomial(probs, 3).print();
[batchSize, numOutcomes]
. See the normalized
parameter.
logits
are normalized true
probabilities (sum to 1). Defaults to false.
Optional
Creates a tf.Tensor with values sampled from a normal distribution.
tf.randomNormal([2, 2]).print();
Creates a tf.Tensor with values sampled from a uniform distribution.
The generated values follow a uniform distribution in the range [minval, maxval). The lower bound minval is included in the range, while the upper bound maxval is excluded.
tf.randomUniform([2, 2]).print();
Models are one of the primary abstractions used in TensorFlow.js Layers. Models can be trained, evaluated, and used for prediction. A model's state (topology, and optionally, trained weights) can be restored from various formats.
Models are a collection of Layers, see Model Creation for details about how Layers can be connected.
There are two primary ways of creating models.
Creates a tf.Sequential model. A sequential model is any model where the outputs of one layer are the inputs to the next layer, i.e. the model topology is a simple 'stack' of layers, with no branching or skipping.
This means that the first layer passed to a Sequential model should have a
defined input shape. What that means is that it should have received an
inputShape
or batchInputShape
argument, or for some type of layers
(recurrent, Dense...) an inputDim
argument.
The key difference between tf.model() and tf.sequential() is that tf.sequential() is less generic, supporting only a linear stack of layers. tf.model() is more generic and supports an arbitrary graph (without cycles) of layers.
Examples:
const model = tf.sequential();
// First layer must have an input shape defined.
model.add(tf.layers.dense({units: 32, inputShape: [50]}));
// Afterwards, TF.js does automatic shape inference.
model.add(tf.layers.dense({units: 4}));
// Inspect the inferred shape of the model's output, which equals
// `[null, 4]`. The 1st dimension is the undetermined batch dimension; the
// 2nd is the output size of the model's last layer.
console.log(JSON.stringify(model.outputs[0].shape));
It is also possible to specify a batch size (with potentially undetermined
batch dimension, denoted by "null") for the first layer using the
batchInputShape
key. The following example is equivalent to the above:
const model = tf.sequential();
// First layer must have a defined input shape
model.add(tf.layers.dense({units: 32, batchInputShape: [null, 50]}));
// Afterwards, TF.js does automatic shape inference.
model.add(tf.layers.dense({units: 4}));
// Inspect the inferred shape of the model's output.
console.log(JSON.stringify(model.outputs[0].shape));
You can also use an Array
of already-constructed Layer
s to create
a tf.Sequential model:
const model = tf.sequential({
layers: [tf.layers.dense({units: 32, inputShape: [50]}),
tf.layers.dense({units: 4})]
});
console.log(JSON.stringify(model.outputs[0].shape));
A model is a data structure that consists of Layers
and defines inputs
and outputs.
The key difference between tf.model() and tf.sequential() is that tf.model() is more generic, supporting an arbitrary graph (without cycles) of layers. tf.sequential() is less generic and supports only a linear stack of layers.
When creating a tf.Model, specify its input(s) and output(s). Layers are used to wire input(s) to output(s).
For example, the following code snippet defines a model consisting of
two dense
layers, with 10 and 4 units, respectively.
// Define input, which has a size of 5 (not including batch dimension).
const input = tf.input({shape: [5]});
// First dense layer uses relu activation.
const denseLayer1 = tf.layers.dense({units: 10, activation: 'relu'});
// Second dense layer uses softmax activation.
const denseLayer2 = tf.layers.dense({units: 2, activation: 'softmax'});
// Obtain the output symbolic tensor by applying the layers on the input.
const output = denseLayer2.apply(denseLayer1.apply(input));
// Create the model based on the inputs.
const model = tf.model({inputs: input, outputs: output});
// The model can be used for training, evaluation and prediction.
// For example, the following line runs prediction with the model on
// some fake data.
model.predict(tf.ones([2, 5])).print();
See also: tf.sequential(), tf.loadModel().
Used to instantiate an input to a model as a tf.SymbolicTensor.
Users should call the tf.input() factory function for consistency with other generator functions.
Example:
// Defines a simple logistic regression model with 32 dimensional input
// and 3 dimensional output.
const x = tf.input({shape: [32]});
const y = tf.layers.dense({units: 3, activation: 'softmax'}).apply(x);
const model = tf.model({inputs: x, outputs: y});
model.predict(tf.ones([2, 32])).print();
Note: tf.input() is only necessary when using tf.model(). When using
tf.sequential(), specify inputShape
for the first layer or use inputLayer
as the first layer.
shape=[32]
indicates that the expected input will be batches of 32-dimensional
vectors.
Optional
batchShape=[10, 32]
indicates that the expected input will be batches of
10 32-dimensional vectors. batchShape=[null, 32]
indicates batches of an
arbitrary number of 32-dimensional vectors.
Optional
Load a model, including its topology and optionally weights. See the Tutorial named "How to import a Keras Model" for usage examples.
Example 1: Save tf.model()'s topology and weights to browser local storage; then load it back.
const model = tf.sequential(
{layers: [tf.layers.dense({units: 1, inputShape: [3]})]});
console.log('Prediction from original model:');
model.predict(tf.ones([1, 3])).print();
const saveResults = await model.save('localstorage://my-model-1');
const loadedModel = await tf.loadModel('localstorage://my-model-1');
console.log('Prediction from loaded model:');
loadedModel.predict(tf.ones([1, 3])).print();
Example 2. Saving tf.model()'s topology and weights to browser IndexedDB; then load it back.
const model = tf.sequential(
{layers: [tf.layers.dense({units: 1, inputShape: [3]})]});
console.log('Prediction from original model:');
model.predict(tf.ones([1, 3])).print();
const saveResults = await model.save('indexeddb://my-model-1');
const loadedModel = await tf.loadModel('indexeddb://my-model-1');
console.log('Prediction from loaded model:');
loadedModel.predict(tf.ones([1, 3])).print();
Example 3. Load a model from user-selected files from HTML file input elements.
// Note: this code snippet will not work without the HTML elements in the
// page
const jsonUpload = document.getElementById('json-upload');
const weightsUpload = document.getElementById('weights-upload');
const model = await tf.loadModel(
tf.io.browserFiles([jsonUpload.files[0], weightsUpload.files[0]]));
Example 4. Load a model from an HTTP server.
const model = await
tf.loadModel('https://storage.googleapis.com/tfjs-models/tfjs/iris_v1/model.json')
ModelAndWeightsConfig
JSON describing
the model in the canonical TensorFlow.js format. This path will be
interpreted as a relative HTTP path, to which fetch
will be used to
request the model topology and weight manifest JSON.
The content of the JSON file is assumed to be a JSON object with the
following fields and values:keras.Model.to_json()
keras.models.save_model()
.save_model()
for more details.
It is also assumed that model weights can be accessed from relative
paths described by the paths
fields in weights manifest.tf.io.IOHandler
object that loads model artifacts with its load
method.Copy a model from one URL to another.
This function supports:
tf.io.copyModel('localstorage://model-1', 'localstorage://model-2')
tf.io.copyModel('localstorage://model-1', 'indexeddb://model-1')
// First create and save a model.
const model = tf.sequential();
model.add(tf.layers.dense(
{units: 1, inputShape: [10], activation: 'sigmoid'}));
await model.save('localstorage://demo/management/model1');
// Then list existing models.
console.log(JSON.stringify(await tf.io.listModels()));
// Copy the model, from Local Storage to IndexedDB.
await tf.io.copyModel(
'localstorage://demo/management/model1',
'indexeddb://demo/management/model1');
// List models again.
console.log(JSON.stringify(await tf.io.listModels()));
// Remove both models.
await tf.io.removeModel('localstorage://demo/management/model1');
await tf.io.removeModel('indexeddb://demo/management/model1');
List all models stored in registered storage mediums.
For a web browser environment, the registered mediums are Local Storage and IndexedDB.
// First create and save a model.
const model = tf.sequential();
model.add(tf.layers.dense(
{units: 1, inputShape: [10], activation: 'sigmoid'}));
await model.save('localstorage://demo/management/model1');
// Then list existing models.
console.log(JSON.stringify(await tf.io.listModels()));
// Delete the model.
await tf.io.removeModel('localstorage://demo/management/model1');
// List models again.
console.log(JSON.stringify(await tf.io.listModels()));
Move a model from one URL to another.
This function supports:
tf.io.moveModel('localstorage://model-1', 'localstorage://model-2')
tf.io.moveModel('localstorage://model-1', 'indexeddb://model-1')
// First create and save a model.
const model = tf.sequential();
model.add(tf.layers.dense(
{units: 1, inputShape: [10], activation: 'sigmoid'}));
await model.save('localstorage://demo/management/model1');
// Then list existing models.
console.log(JSON.stringify(await tf.io.listModels()));
// Move the model, from Local Storage to IndexedDB.
await tf.io.moveModel(
'localstorage://demo/management/model1',
'indexeddb://demo/management/model1');
// List models again.
console.log(JSON.stringify(await tf.io.listModels()));
// Remove the moved model.
await tf.io.removeModel('indexeddb://demo/management/model1');
Remove a model specified by URL from a reigstered storage medium.
// First create and save a model.
const model = tf.sequential();
model.add(tf.layers.dense(
{units: 1, inputShape: [10], activation: 'sigmoid'}));
await model.save('localstorage://demo/management/model1');
// Then list existing models.
console.log(JSON.stringify(await tf.io.listModels()));
// Delete the model.
await tf.io.removeModel('localstorage://demo/management/model1');
// List models again.
console.log(JSON.stringify(await tf.io.listModels()));
A tf.Model is a directed, acyclic graph of Layer
s plus methods for
training, evaluation, prediction and saving.
tf.Model is the basic unit of training, inference and evaluation in TensorFlow.js. To create a tf.Model, use tf.model().
See also: tf.Sequential, tf.loadModel().
Print a text summary of the model's layers.
The summary includes
const input1 = tf.input({shape: [10]});
const input2 = tf.input({shape: [20]});
const dense1 = tf.layers.dense({units: 4}).apply(input1);
const dense2 = tf.layers.dense({units: 8}).apply(input2);
const concat = tf.layers.concatenate().apply([dense1, dense2]);
const output =
tf.layers.dense({units: 3, activation: 'softmax'}).apply(concat);
const model = tf.model({inputs: [input1, input2], outputs: output});
model.summary();
lineLength
(e.g., [0.5, 0.75, 1]
) or absolute number
of characters (e.g., [30, 50, 65]
). Each number corresponds to
right-most (i.e., ending) position of a column.
Optional
console.log
. For example, you can use x => {}
to mute the printed
messages in the console.
Optional
Configures and prepares the model for training and evaluation. Compiling
outfits the model with an optimizer, loss, and/or metrics. Calling fit
or evaluate
on an un-compiled model will throw an error.
ModelCompileConfig
specifying the loss, optimizer, and
metrics to be used for fitting and evaluating this model.
tf.train.Optimizer
or a string name for an Optimizer.
metrics=['accuracy']
.
To specify different metrics for different outputs of a multi-output
model, you could also pass a dictionary.
Optional
Returns the loss value & metrics values for the model in test mode.
Loss and metrics are specified during compile()
, which needs to happen
before calls to evaluate()
.
Computation is done in batches.
const model = tf.sequential({
layers: [tf.layers.dense({units: 1, inputShape: [10]})]
});
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});
const result = model.evaluate(
tf.ones([8, 10]), tf.ones([8, 1]), {batchSize: 4});
result.print();
Array
of tf.Tensors if the model has
multiple inputs.
Array
of tf.Tensors if the model
has multiple outputs.
ModelEvaluateConfig
, containing optional fields.
Optional
undefined
.
Optional
Generates output predictions for the input samples.
Computation is done in batches.
Note: the "step" mode of predict() is currently not supported. This is because the TensorFlow.js core backend is imperative only.
const model = tf.sequential({
layers: [tf.layers.dense({units: 1, inputShape: [10]})]
});
model.predict(tf.ones([8, 10]), {batchSize: 4}).print();
Array
of tf.Tensors if
the model has multiple inputs.
ModelPredictConfig
object containing optional fields.
Optional
Returns predictions for a single batch of samples.
const model = tf.sequential({
layers: [tf.layers.dense({units: 1, inputShape: [10]})]
});
model.predictOnBatch(tf.ones([8, 10])).print();
Trains the model for a fixed number of epochs (iterations on a dataset).
const model = tf.sequential({
layers: [tf.layers.dense({units: 1, inputShape: [10]})]
});
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});
for (let i = 1; i < 5 ; ++i) {
const h = await model.fit(tf.ones([8, 10]), tf.ones([8, 1]), {
batchSize: 4,
epochs: 3
});
console.log("Loss after Epoch " + i + " : " + h.history.loss[0]);
}
ModelFitConfig
, containing optional fields.
Optional
onTrainBegin
,
onTrainEnd
, onEpochBegin
, onEpochEnd
, onBatchBegin
, onBatchEnd
.
Optional
x
and y
data provided, before shuffling.
Optional
validationData
will override validationSplit
.
Optional
stepsPerEpoch
is not null
.
Optional
null
is
equal to the number of unique samples in your dataset divided by the
batch size, or 1 if that cannot be determined.
Optional
stepsPerEpoch
is specified. Total number of steps
(batches of samples) to validate before stopping.
Optional
Save the configuration and/or weights of the Model.
An IOHandler
is an object that has a save
method of the proper
signature defined. The save
method manages the storing or transmission
of serialized data ("artifacts") that represent the model's topology and
weights onto or via a specific medium, such as file downloads, local
storage, IndexedDB in the web browser and HTTP requests to a server.
TensorFlow.js provides IOHandler
implementations for a number of
frequently used saving mediums, such as tf.io.browserDownloads
and
tf.io.browserLocalStorage
. See tf.io
for more details.
This method also allows you to refer to certain types of IOHandler
s as
URL-like string shortcuts, such as 'localstorage://' and 'indexeddb://'.
Example 1: Save tf.model()'s topology and weights to browser local storage; then load it back.
const model = tf.sequential(
{layers: [tf.layers.dense({units: 1, inputShape: [3]})]});
console.log('Prediction from original model:');
model.predict(tf.ones([1, 3])).print();
const saveResults = await model.save('localstorage://my-model-1');
const loadedModel = await tf.loadModel('localstorage://my-model-1');
console.log('Prediction from loaded model:');
loadedModel.predict(tf.ones([1, 3])).print();
Example 2. Saving tf.model()'s topology and weights to browser IndexedDB; then load it back.
const model = tf.sequential(
{layers: [tf.layers.dense({units: 1, inputShape: [3]})]});
console.log('Prediction from original model:');
model.predict(tf.ones([1, 3])).print();
const saveResults = await model.save('indexeddb://my-model-1');
const loadedModel = await tf.loadModel('indexeddb://my-model-1');
console.log('Prediction from loaded model:');
loadedModel.predict(tf.ones([1, 3])).print();
Example 3. Saving tf.model()'s topology and weights as two files
(my-model-1.json
and my-model-1.weights.bin
) downloaded from browser.
const model = tf.sequential(
{layers: [tf.layers.dense({units: 1, inputShape: [3]})]});
const saveResults = await model.save('downloads://my-model-1');
Example 4. Send tf.model()'s topology and weights to an HTTP server.
See the documentation of tf.io.browserHTTPRequests
for more details
including specifying request parameters and implementation of the server.
const model = tf.sequential(
{layers: [tf.layers.dense({units: 1, inputShape: [3]})]});
const saveResults = await model.save('http://my-server/model/upload');
IOHandler
or a URL-like,
scheme-based string shortcut for IOHandler
.
Retrieves a layer based on either its name (unique) or index.
Indices are based on order of horizontal graph traversal (bottom-up).
If both name
and index
are specified, index
takes precedence.
A model with a stack of layers, feeding linearly from one to the next.
tf.sequential() is a factory function that creates an instance of tf.Sequential.
// Define a model for linear regression.
const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));
// Prepare the model for training: Specify the loss and the optimizer.
model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});
// Generate some synthetic data for training.
const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);
const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);
// Train the model using the data then do inference on a data point the
// model hasn't seen:
await model.fit(xs, ys);
model.predict(tf.tensor2d([5], [1, 1])).print();
Adds a layer instance on top of the layer stack.
const model = tf.sequential();
model.add(tf.layers.dense({units: 8, inputShape: [1]}));
model.add(tf.layers.dense({units: 4, activation: 'relu6'}));
model.add(tf.layers.dense({units: 1, activation: 'relu6'}));
// Note that the untrained model is random at this point.
model.predict(tf.randomNormal([10, 1])).print();
Print a text summary of the Sequential model's layers.
The summary includes
const model = tf.sequential();
model.add(
tf.layers.dense({units: 100, inputShape: [10], activation: 'relu'}));
model.add(tf.layers.dense({units: 1, activation: 'sigmoid'}));
model.summary();
lineLength
(e.g., [0.5, 0.75, 1]
) or absolute number
of characters (e.g., [30, 50, 65]
). Each number corresponds to
right-most (i.e., ending) position of a column.
Optional
console.log
. For example, you can use x => {}
to mute the printed
messages in the console.
Optional
Returns the loss value & metrics values for the model in test mode.
Loss and metrics are specified during compile()
, which needs to happen
before calls to evaluate()
.
Computation is done in batches.
const model = tf.sequential({
layers: [tf.layers.dense({units: 1, inputShape: [10]})]
});
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});
const result = model.evaluate(tf.ones([8, 10]), tf.ones([8, 1]), {
batchSize: 4,
});
result.print();
Array
of tf.Tensors if the model
has multiple inputs.
Array
of tf.Tensors if the model
has multiple outputs.
ModelEvaluateConfig
, containing optional fields.
Optional
undefined
.
Optional
Generates output predictions for the input samples.
Computation is done in batches.
Note: the "step" mode of predict() is currently not supported. This is because the TensorFow.js core backend is imperative only.
const model = tf.sequential({
layers: [tf.layers.dense({units: 1, inputShape: [10]})]
});
model.predict(tf.ones([2, 10])).print();
Array
of tf.Tensors if
the model has multiple inputs.
Trains the model for a fixed number of epochs (iterations on a dataset).
const model = tf.sequential({
layers: [tf.layers.dense({units: 1, inputShape: [10]})]
});
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});
const history = await model.fit(tf.ones([8, 10]), tf.ones([8, 1]), {
batchSize: 4,
epochs: 3
});
console.log(history.history.loss[0]);
ModelFitConfig
, containing optional fields.
Optional
onTrainBegin
,
onTrainEnd
, onEpochBegin
, onEpochEnd
, onBatchBegin
, onBatchEnd
.
Optional
x
and y
data provided, before shuffling.
Optional
validationData
will override validationSplit
.
Optional
stepsPerEpoch
is not null
.
Optional
null
is
equal to the number of unique samples in your dataset divided by the
batch size, or 1 if that cannot be determined.
Optional
stepsPerEpoch
is specified. Total number of steps
(batches of samples) to validate before stopping.
Optional
tf.SymbolicTensor is a placeholder for a Tensor without any concrete value.
They are most often encountered when building a graph of Layer
s for a
a tf.Model and the input data's shape, but not values are known.
Layers are the primary building block for constructing a Model. Each layer will typically perform some computation to transform its input to its output.
Layers will automatically take care of creating and initializing the various internal variables/weights they need to function.
Exponetial Linear Unit (ELU).
It follows:
f(x) = alpha * (exp(x) - 1.) for x < 0
,
f(x) = x for x >= 0
.
Input shape:
Arbitrary. Use the configuration inputShape
when using this layer as the
first layer in a model.
Output shape: Same shape as the input.
References:
>= 0
. Negative slope coefficient. Defaults to 1.0
.
Optional
Leaky version of a rectified linear unit.
It allows a small gradient when the unit is not active:
f(x) = alpha * x for x < 0.
f(x) = x for x >= 0.
Input shape:
Arbitrary. Use the configuration inputShape
when using this layer as the
first layer in a model.
Output shape: Same shape as the input.
>= 0
. Negative slope coefficient. Defaults to 0.3
.
Optional
Softmax activation layer.
Input shape:
Arbitrary. Use the configuration inputShape
when using this layer as the
first layer in a model.
Output shape: Same shape as the input.
-1
(i.e., the last axis).
Optional
Thresholded Rectified Linear Unit.
It follows:
f(x) = x for x > theta
,
f(x) = 0 otherwise
.
Input shape:
Arbitrary. Use the configuration inputShape
when using this layer as the
first layer in a model.
Output shape: Same shape as the input.
References:
Applies an activation function to an output.
This layer applies element-wise activation function. Other layers, notably
dense
can also apply activation functions. Use this isolated activation
function to extract the values before and after the
activation. For instance:
const input = tf.input({shape: [5]});
const denseLayer = tf.layers.dense({units: 1});
const activationLayer = tf.layers.activation({activation: 'relu6'});
// Obtain the output symbolic tensors by applying the layers in order.
const denseOutput = denseLayer.apply(input);
const activationOutput = activationLayer.apply(denseOutput);
// Create the model based on the inputs.
const model = tf.model({
inputs: input,
outputs: [denseOutput, activationOutput]
});
// Collect both outputs and print separately.
const [denseOut, activationOut] = model.predict(tf.randomNormal([6, 5]));
denseOut.print();
activationOut.print();
Creates a dense (fully connected) layer.
This layer implements the operation:
output = activation(dot(input, kernel) + bias)
activation
is the element-wise activation function
passed as the activation
argument.
kernel
is a weights matrix created by the layer.
bias
is a bias vector created by the layer (only applicable if useBias
is true
).
Input shape:
nD tf.Tensor with shape: (batchSize, ..., inputDim)
.
The most common situation would be
a 2D input with shape (batchSize, inputDim)
.
Output shape:
nD tensor with shape: (batchSize, ..., units)
.
For instance, for a 2D input with shape (batchSize, inputDim)
,
the output would have shape (batchSize, units)
.
Note: if the input to the layer has a rank greater than 2, then it is flattened prior to the initial dot product with the kernel.
If unspecified, no activation is applied.
Optional[inputDim]
.
Optional
Applies dropout to the input.
Dropout consists in randomly setting a fraction rate
of input units to 0 at
each update during training time, which helps prevent overfitting.
For instance, if your inputs have shape (batchSize, timesteps, features)
and you want the dropout mask to be the same for all timesteps, you can use
noise_shape=(batch_size, 1, features)
.
Maps positive integers (indices) into dense vectors of fixed size. eg. [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]
Input shape: 2D tensor with shape: [batchSize, sequenceLength]
.
Output shape: 3D tensor with shape: [batchSize, sequenceLength, outputDim]
.
embeddings
matrix.
Optional
embeddings
matrix.
Optional
embeddings
matrix.
Optional
If this is True
then all subsequent layers in the model need to support
masking or an exception will be raised. If maskZero is set to True
, as a
consequence, index 0 cannot be used in the vocabulary (inputDim should
equal size of vocabulary + 1).
This argument is required if you are going to connect flatten
then
dense
layers upstream (without it, the shape of the dense outputs cannot
be computed).
Flattens the input. Does not affect the batch size.
A Flatten
layer flattens each batch in its inputs to 1D (making the output
2D).
For example:
const input = tf.input({shape: [4, 3]});
const flattenLayer = tf.layers.flatten();
// Inspect the inferred output shape of the flatten layer, which
// equals `[null, 12]`. The 2nd dimension is 4 * 3, i.e., the result of the
// flattening. (The 1st dimension is the undermined batch size.)
console.log(JSON.stringify(flattenLayer.apply(input).shape));
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
is specified and batchInputShape
is not specifiedd,
batchSize
is used to construct the batchInputShape
: [batchSize, ...inputShape]
Optional
fit
.
Optional
Repeats the input n times in a new dimension.
const model = tf.sequential();
model.add(tf.layers.repeatVector({n: 4, inputShape: [2]}));
const x = tf.tensor2d([[10, 20]]);
// Use the model to do inference on a data point the model hasn't see
model.predict(x).print();
// output shape is now [batch, 2, 4]
Reshapes an input to a certain shape.
const input = tf.input({shape: [4, 3]});
const reshapeLayer = tf.layers.reshape({targetShape: [2, 6]});
// Inspect the inferred output shape of the Reshape layer, which
// equals `[null, 2, 6]`. (The 1st dimension is the undermined batch size.)
console.log(JSON.stringify(reshapeLayer.apply(input).shape));
Input shape:
Arbitrary: although all dimensions in the input shape must be fixed.
Use the ReshapeLayerConfig field input_shape
when using this layer
as the first layer in a model.
Output shape: [batchSize, targetShape[0], targetShape[1], ..., targetShape[targetShape.length - 1]].
1D convolution layer (e.g., temporal convolution).
This layer creates a convolution kernel that is convolved with the layer input over a single spatial (or temporal) dimension to produce a tensor of outputs.
If use_bias
is True, a bias vector is created and added to the outputs.
If activation
is not null
, it is applied to the outputs as well.
When using this layer as the first layer in a model, provide an
inputShape
argument Array
or null
.
For example, inputShape
would be:
[10, 128]
for sequences of 10 vectors of 128-dimensional vectors[null, 128]
for variable-length sequences of 128-dimensional vectors.2D convolution layer (e.g. spatial convolution over images).
This layer creates a convolution kernel that is convolved with the layer input to produce a tensor of outputs.
If useBias
is True, a bias vector is created and added to the outputs.
If activation
is not null
, it is applied to the outputs as well.
When using this layer as the first layer in a model,
provide the keyword argument inputShape
(Array of integers, does not include the sample axis),
e.g. inputShape=[128, 128, 3]
for 128x128 RGB pictures
in dataFormat='channelsLast'
.
Transposed convolutional layer (sometimes called Deconvolution).
The need for transposed convolutions generally arises from the desire to use a transformation going in the opposite direction of a normal convolution, i.e., from something that has the shape of the output of some convolution to something that has the shape of its input while maintaining a connectivity pattern that is compatible with said convolution.
When using this layer as the first layer in a model, provide the
configuration inputShape
(Array
of integers, does not include the
sample axis), e.g., inputShape: [128, 128, 3]
for 128x128 RGB pictures in
dataFormat: 'channelsLast'
.
Input shape:
4D tensor with shape:
[batch, channels, rows, cols]
if dataFormat
is 'channelsFirst'
.
or 4D tensor with shape
[batch, rows, cols, channels]
if dataFormat
is 'channelsLast
.
Output shape:
4D tensor with shape:
[batch, filters, newRows, newCols]
if dataFormat
is
'channelsFirst'
. or 4D tensor with shape:
[batch, newRows, newCols, filters]
if dataFormat
is 'channelsLast'
.
References:
Cropping layer for 2D input (e.g., image).
This layer can crop an input at the top, bottom, left and right side of an image tensor.
Input shape: 4D tensor with shape:
dataFormat
is "channelsLast"
:
[batch, rows, cols, channels]
data_format
is "channels_first"
:
[batch, channels, rows, cols]
.Output shape: 4D with shape:
dataFormat
is "channelsLast"
:
[batch, croppedRows, croppedCols, channels]
dataFormat
is "channelsFirst"
:
[batch, channels, croppedRows, croppedCols]
.Examples
const model = tf.sequential();
model.add(tf.layers.cropping2D({cropping:[[2, 2], [2, 2]],
inputShape: [128, 128, 3]}));
//now output shape is [batch, 124, 124, 3]
[symmetric_height_crop, symmetric_width_crop]
.[[top_crop, bottom_crop], [left_crop, right_crop]]
channels_last
corresponds to inputs with shape
(batch, ..., channels)
channels_first
corresponds to inputs with shape (batch, channels, ...)
.
Defaults to channels_last
.
Depthwise separable 2D convolution.
Depthwise Separable convolutions consists in performing just the first step
in a depthwise spatial convolution (which acts on each input channel
separately). The depthMultplier
argument controls how many output channels
are generated per input channel in the depthwise step.
filtersIn * depthMultiplier
.
Default: 1.
Optional
Depthwise separable 2D convolution.
Separable convolution consists of first performing
a depthwise spatial convolution
(which acts on each input channel separately)
followed by a pointwise convolution which mixes together the resulting
output channels. The depthMultiplier
argument controls how many
output channels are generated per input channel in the depthwise step.
Intuitively, separable convolutions can be understood as a way to factorize a convolution kernel into two smaller kernels, or as an extreme version of an Inception block.
Input shape:
4D tensor with shape:
[batch, channels, rows, cols]
if data_format='channelsFirst'
or 4D tensor with shape:
[batch, rows, cols, channels]
if data_format='channelsLast'.
Output shape:
4D tensor with shape:
[batch, filters, newRows, newCols]
if data_format='channelsFirst'
or 4D tensor with shape:
[batch, newRows, newCols, filters]
if data_format='channelsLast'.
rows
and cols
values might have changed due to padding.
filtersIn * depthMultiplier
. Default: 1.
Optional
Upsampling layer for 2D inputs.
Repeats the rows and columns of the data by size[0] and size[1] respectively.
Input shape:
4D tensor with shape:
- If dataFormat
is "channelsLast"
:
[batch, rows, cols, channels]
- If dataFormat
is "channelsFirst"
:
[batch, channels, rows, cols]
Output shape:
4D tensor with shape:
- If dataFormat
is "channelsLast"
:
[batch, upsampledRows, upsampledCols, channels]
- If dataFormat
is "channelsFirst"
:
[batch, channels, upsampledRows, upsampledCols]
Defaults to [2, 2]
.
"channelsLast"
corresponds to inputs with shape
[batch, ..., channels]
"channelsFirst"
corresponds to inputs with shape [batch, channels, ...]
.
Defaults to "channelsLast"
.
Layer that performs element-wise addition on an Array
of inputs.
It takes as input a list of tensors, all of the same shape, and returns a
single tensor (also of the same shape). The inputs are specified as an
Array
when the apply
method of the Add
layer instance is called. For
example:
const input1 = tf.input({shape: [2, 2]});
const input2 = tf.input({shape: [2, 2]});
const addLayer = tf.layers.add();
const sum = addLayer.apply([input1, input2]);
console.log(JSON.stringify(sum.shape));
// You get [null, 2, 2], with the first dimension as the undetermined batch
// dimension.
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
is specified and batchInputShape
is not specifiedd,
batchSize
is used to construct the batchInputShape
: [batchSize, ...inputShape]
Optional
fit
.
Optional
Layer that performs element-wise averaging on an Array
of inputs.
It takes as input a list of tensors, all of the same shape, and returns a single tensor (also of the same shape). For example:
const input1 = tf.input({shape: [2, 2]});
const input2 = tf.input({shape: [2, 2]});
const averageLayer = tf.layers.average();
const average = averageLayer.apply([input1, input2]);
console.log(JSON.stringify(average.shape));
// You get [null, 2, 2], with the first dimension as the undetermined batch
// dimension.
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
is specified and batchInputShape
is not specifiedd,
batchSize
is used to construct the batchInputShape
: [batchSize, ...inputShape]
Optional
fit
.
Optional
Layer that concatenates an Array
of inputs.
It takes a list of tensors, all of the same shape except for the concatenation axis, and returns a single tensor, the concatenation of all inputs. For example:
const input1 = tf.input({shape: [2, 2]});
const input2 = tf.input({shape: [2, 3]});
const concatLayer = tf.layers.concatenate();
const output = concatLayer.apply([input1, input2]);
console.log(JSON.stringify(output.shape));
// You get [null, 2, 5], with the first dimension as the undetermined batch
// dimension. The last dimension (5) is the result of concatenating the
// last dimensions of the inputs (2 and 3).
Layer that computes the element-wise maximum an Array
of inputs.
It takes as input a list of tensors, all of the same shape and returns a single tensor (also of the same shape). For example:
const input1 = tf.input({shape: [2, 2]});
const input2 = tf.input({shape: [2, 2]});
const maxLayer = tf.layers.maximum();
const max = maxLayer.apply([input1, input2]);
console.log(JSON.stringify(max.shape));
// You get [null, 2, 2], with the first dimension as the undetermined batch
// dimension.
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
is specified and batchInputShape
is not specifiedd,
batchSize
is used to construct the batchInputShape
: [batchSize, ...inputShape]
Optional
fit
.
Optional
Layer that computes the element-wise minimum of an Array
of inputs.
It takes as input a list of tensors, all of the same shape and returns a single tensor (also of the same shape). For example:
const input1 = tf.input({shape: [2, 2]});
const input2 = tf.input({shape: [2, 2]});
const minLayer = tf.layers.minimum();
const min = minLayer.apply([input1, input2]);
console.log(JSON.stringify(min.shape));
// You get [null, 2, 2], with the first dimension as the undetermined batch
// dimension.
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
is specified and batchInputShape
is not specifiedd,
batchSize
is used to construct the batchInputShape
: [batchSize, ...inputShape]
Optional
fit
.
Optional
Layer that multiplies (element-wise) an Array
of inputs.
It takes as input an Array of tensors, all of the same shape, and returns a single tensor (also of the same shape). For example:
const input1 = tf.input({shape: [2, 2]});
const input2 = tf.input({shape: [2, 2]});
const input3 = tf.input({shape: [2, 2]});
const multiplyLayer = tf.layers.multiply();
const product = multiplyLayer.apply([input1, input2, input3]);
console.log(product.shape);
// You get [null, 2, 2], with the first dimension as the undetermined batch
// dimension.
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
is specified and batchInputShape
is not specifiedd,
batchSize
is used to construct the batchInputShape
: [batchSize, ...inputShape]
Optional
fit
.
Optional
Batch normalization layer (Ioffe and Szegedy, 2014).
Normalize the activations of the previous layer at each batch, i.e. applies a transformation that maintains the mean activation close to 0 and the activation standard deviation close to 1.
Input shape:
Arbitrary. Use the keyword argument inputShape
(Array of integers, does
not include the sample axis) when calling the constructor of this class,
if this layer is used as a first layer in a model.
Output shape: Same shape as input.
References:
For instance, after a Conv2D
layer with data_format="channels_first"
,
set axis=1
in tf.batchNormalization().
true
, add offset of beta
to normalized tensor.
If false
, beta
is ignored.
Defaults to true
.
Optional
true
, multiply by gamma
.
If false
, gamma
is not used.
When the next layer is linear (also e.g. nn.relu
),
this can be disabled since the scaling will be done by the next layer.
Defaults to true
.
Optional
Average pooling operation for spatial data.
Input shape: [batchSize, inLength, channels]
Output shape: [batchSize, pooledLength, channels]
tf.avgPool1d
is an alias.
If null
, defaults to poolSize
.
Average pooling operation for spatial data.
Input shape:
dataFormat === CHANNEL_LAST
:
4D tensor with shape:
[batchSize, rows, cols, channels]
dataFormat === CHANNEL_FIRST
:
4D tensor with shape:
[batchSize, channels, rows, cols]
Output shape
dataFormat === CHANNEL_LAST
:
4D tensor with shape:
[batchSize, pooleRows, pooledCols, channels]
dataFormat === CHANNEL_FIRST
:
4D tensor with shape:
[batchSize, channels, pooleRows, pooledCols]
tf.avgPool2d
is an alias.
For example, [2, 2]
will halve the input in both spatial dimension.
If only one integer is specified, the same window length
will be used for both dimensions.
If null
, defaults to poolSize
.
Global average pooling operation for temporal data.
Input Shape: 3D tensor with shape: [batchSize, steps, features]
.
Output Shape:2D tensor with shape: [batchSize, features]
.
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
is specified and batchInputShape
is not specifiedd,
batchSize
is used to construct the batchInputShape
: [batchSize, ...inputShape]
Optional
fit
.
Optional
Global average pooling operation for spatial data.
Input shape:
dataFormat
is CHANNEL_LAST
:
4D tensor with shape: [batchSize, rows, cols, channels]
.dataFormat
is CHANNEL_FIRST
:
4D tensor with shape: [batchSize, channels, rows, cols]
.Output shape:
2D tensor with shape: [batchSize, channels]
.
CHANNEL_LAST
(default) or CHANNEL_FIRST
.
The ordering of the dimensions in the inputs. CHANNEL_LAST
corresponds
to inputs with shape [batch, height, width, channels[
while
CHANNEL_FIRST
corresponds to inputs with shape
[batch, channels, height, width]
.
Global max pooling operation for temporal data.
Input Shape: 3D tensor with shape: [batchSize, steps, features]
.
Output Shape:2D tensor with shape: [batchSize, features]
.
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
and batchInputShape
are defined,
batchInputShape
will be used. This argument is only applicable to input
layers (the first layer of a model).
Optional
inputShape
is specified and batchInputShape
is not specifiedd,
batchSize
is used to construct the batchInputShape
: [batchSize, ...inputShape]
Optional
fit
.
Optional
Global max pooling operation for spatial data.
Input shape:
dataFormat
is CHANNEL_LAST
:
4D tensor with shape: [batchSize, rows, cols, channels]
.dataFormat
is CHANNEL_FIRST
:
4D tensor with shape: [batchSize, channels, rows, cols]
.Output shape:
2D tensor with shape: [batchSize, channels]
.
CHANNEL_LAST
(default) or CHANNEL_FIRST
.
The ordering of the dimensions in the inputs. CHANNEL_LAST
corresponds
to inputs with shape [batch, height, width, channels[
while
CHANNEL_FIRST
corresponds to inputs with shape
[batch, channels, height, width]
.
Max pooling operation for temporal data.
Input shape: [batchSize, inLength, channels]
Output shape: [batchSize, pooledLength, channels]
If null
, defaults to poolSize
.
Max pooling operation for spatial data.
Input shape
dataFormat === CHANNEL_LAST
:
4D tensor with shape:
[batchSize, rows, cols, channels]
dataFormat === CHANNEL_FIRST
:
4D tensor with shape:
[batchSize, channels, rows, cols]
Output shape
dataFormat=CHANNEL_LAST
:
4D tensor with shape:
[batchSize, pooleRows, pooledCols, channels]
dataFormat=CHANNEL_FIRST
:
4D tensor with shape:
[batchSize, channels, pooleRows, pooledCols]
For example, [2, 2]
will halve the input in both spatial dimension.
If only one integer is specified, the same window length
will be used for both dimensions.
If null
, defaults to poolSize
.
Gated Recurrent Unit - Cho et al. 2014.
This is an RNN
layer consisting of one GRUCell
. However, unlike
the underlying GRUCell
, the apply
method of SimpleRNN
operates
on a sequence of inputs. The shape of the input (not including the first,
batch dimension) needs to be at least 2-D, with the first dimension being
time steps. For example:
const rnn = tf.layers.gru({units: 8, returnSequences: true});
// Create an input with 10 time steps.
const input = tf.input({shape: [10, 20]});
const output = rnn.apply(input);
console.log(JSON.stringify(output.shape));
// [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the
// same as the sequence length of [tf.input()](#input), due to `returnSequences`: `true`;
// 3rd dimension is the `GRUCell`'s number of units.
Defaults to hard sigmoid (hardSigomid
).
If null
, no activation is applied.
Mode 1 will structure its operations as a larger number of smaller dot products and additions.
Mode 2 will batch them into fewer, larger operations. These modes will have different performance profiles on different hardware and for different applications.
OptionalCell class for GRU
.
GRUCell
is distinct from the RNN
subclass GRU
in that its
apply
method takes the input data of only a single time step and returns
the cell's output at the time step, while GRU
takes the input data
over a number of time steps. For example:
const cell = tf.layers.gruCell({units: 2});
const input = tf.input({shape: [10]});
const output = cell.apply(input);
console.log(JSON.stringify(output.shape));
// [null, 10]: This is the cell's output at a single time step. The 1st
// dimension is the unknown batch size.
Instance(s) of GRUCell
can be used to construct RNN
layers. The
most typical use of this workflow is to combine a number of cells into a
stacked RNN cell (i.e., StackedRNNCell
internally) and use it to create an
RNN. For example:
const cells = [
tf.layers.gruCell({units: 4}),
tf.layers.gruCell({units: 8}),
];
const rnn = tf.layers.rnn({cell: cells, returnSequences: true});
// Create an input with 10 time steps and a length-20 vector at each step.
const input = tf.input({shape: [10, 20]});
const output = rnn.apply(input);
console.log(JSON.stringify(output.shape));
// [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the
// same as the sequence length of [tf.input()](#input), due to `returnSequences`: `true`;
// 3rd dimension is the last `gruCell`'s number of units.
To create an RNN
consisting of only one GRUCell
, use the
tf.layers.gru
.
Defaults to hard sigmoid (hardSigomid
).
If null
, no activation is applied.
Mode 1 will structure its operations as a larger number of smaller dot products and additions.
Mode 2 will batch them into fewer, larger operations. These modes will have different performance profiles on different hardware and for different applications.
OptionalLong-Short Term Memory layer - Hochreiter 1997.
This is an RNN
layer consisting of one LSTMCell
. However, unlike
the underlying LSTMCell
, the apply
method of LSTM
operates
on a sequence of inputs. The shape of the input (not including the first,
batch dimension) needs to be at least 2-D, with the first dimension being
time steps. For example:
const lstm = tf.layers.lstm({units: 8, returnSequences: true});
// Create an input with 10 time steps.
const input = tf.input({shape: [10, 20]});
const output = lstm.apply(input);
console.log(JSON.stringify(output.shape));
// [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the
// same as the sequence length of [tf.input()](#input), due to `returnSequences`: `true`;
// 3rd dimension is the `LSTMCell`'s number of units.
Defaults to hard sigmoid (hardSigomid
).
If null
, no activation is applied.
true
, add 1 to the bias of the forget gate at initialization.
Setting it to true
will also force biasInitializer = 'zeros'
.
This is recommended in
Jozefowicz et
al..
Optional
Cell class for LSTM
.
LSTMCell
is distinct from the RNN
subclass LSTM
in that its
apply
method takes the input data of only a single time step and returns
the cell's output at the time step, while LSTM
takes the input data
over a number of time steps. For example:
const cell = tf.layers.lstmCell({units: 2});
const input = tf.input({shape: [10]});
const output = cell.apply(input);
console.log(JSON.stringify(output.shape));
// [null, 10]: This is the cell's output at a single time step. The 1st
// dimension is the unknown batch size.
Instance(s) of LSTMCell
can be used to construct RNN
layers. The
most typical use of this workflow is to combine a number of cells into a
stacked RNN cell (i.e., StackedRNNCell
internally) and use it to create an
RNN. For example:
const cells = [
tf.layers.lstmCell({units: 4}),
tf.layers.lstmCell({units: 8}),
];
const rnn = tf.layers.rnn({cell: cells, returnSequences: true});
// Create an input with 10 time steps and a length-20 vector at each step.
const input = tf.input({shape: [10, 20]});
const output = rnn.apply(input);
console.log(JSON.stringify(output.shape));
// [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the
// same as the sequence length of [tf.input()](#input), due to `returnSequences`: `true`;
// 3rd dimension is the last `lstmCell`'s number of units.
To create an RNN
consisting of only one LSTMCell
, use the
tf.layers.lstm
.
Defaults to hard sigmoid (hardSigomid
).
If null
, no activation is applied.
true
, add 1 to the bias of the forget gate at initialization.
Setting it to true
will also force biasInitializer = 'zeros'
.
This is recommended in
Jozefowicz et
al..
Optional
Mode 1 will structure its operations as a larger number of smaller dot products and additions.
Mode 2 will batch them into fewer, larger operations. These modes will have different performance profiles on different hardware and for different applications.
OptionalBase class for recurrent layers.
Input shape:
3D tensor with shape [batchSize, timeSteps, inputDim]
.
Output shape:
returnState
, an Array of tensors (i.e., tf.Tensors). The first
tensor is the output. The remaining tensors are the states at the
last time step, each with shape [batchSize, units]
.returnSequences
, the output will have shape
[batchSize, timeSteps, units]
.[batchSize, units]
.Masking:
This layer supports masking for input data with a variable number
of timesteps. To introduce masks to your data,
use an embedding layer with the mask_zero
parameter
set to True
.
Notes on using statefulness in RNNs: You can set RNN layers to be 'stateful', which means that the states computed for the samples in one batch will be reused as initial states for the samples in the next batch. This assumes a one-to-one mapping between samples in different successive batches.
To enable statefulness:
- specify stateful: true
in the layer constructor.
- specify a fixed batch size for your model, by passing
if sequential model:
batchInputShape=[...]
to the first layer in your model.
else for functional model with 1 or more Input layers:
batchShape=[...]
to all the first layers in your model.
This is the expected shape of your inputs including the batch size.
It should be a tuple of integers, e.g. (32, 10, 100)
.
- specify shuffle=False
when calling fit().
To reset the states of your model, call .reset_states()
on either
a specific layer, or on your entire model.
Note on specifying the initial state of RNNs
You can specify the initial state of RNN layers symbolically by
calling them with the option initialState
. The value of
initialState
should be a tensor or list of tensors representing
the initial state of the RNN layer.
You can specify the initial state of RNN layers numerically by
calling resetStates
with the keyword argument states
. The value of
states
should be a numpy array or list of numpy arrays representing
the initial state of the RNN layer.
Note on passing external constants to RNNs
You can pass "external" constants to the cell using the constants
keyword argument of RNN.call
method. This requires that the cell.call
method accepts the same keyword argument constants
. Such constants
can be used to conditon the cell transformation on additional static inputs
(not changing over time), a.k.a an attention mechanism.
Fully-connected RNN where the output is to be fed back to input.
This is an RNN
layer consisting of one SimpleRNNCell
. However, unlike
the underlying SimpleRNNCell
, the apply
method of SimpleRNN
operates
on a sequence of inputs. The shape of the input (not including the first,
batch dimension) needs to be at least 2-D, with the first dimension being
time steps. For example:
const rnn = tf.layers.simpleRNN({units: 8, returnSequences: true});
// Create an input with 10 time steps.
const input = tf.input({shape: [10, 20]});
const output = rnn.apply(input);
console.log(JSON.stringify(output.shape));
// [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the
// same as the sequence length of [tf.input()](#input), due to `returnSequences`: `true`;
// 3rd dimension is the `SimpleRNNCell`'s number of units.
Defaults to hyperbolic tangent (tf.tanh())
If you pass null
, no activation will be applied.
kernel
weights matrix, used for the linear
transformation of the inputs.
Optional
recurrentKernel
weights matrix, used for
linear transformation of the recurrent state.
Optional
Cell class for SimpleRNN
.
SimpleRNNCell
is distinct from the RNN
subclass SimpleRNN
in that its
apply
method takes the input data of only a single time step and returns
the cell's output at the time step, while SimpleRNN
takes the input data
over a number of time steps. For example:
const cell = tf.layers.simpleRNNCell({units: 2});
const input = tf.input({shape: [10]});
const output = cell.apply(input);
console.log(JSON.stringify(output.shape));
// [null, 10]: This is the cell's output at a single time step. The 1st
// dimension is the unknown batch size.
Instance(s) of SimpleRNNCell
can be used to construct RNN
layers. The
most typical use of this workflow is to combine a number of cells into a
stacked RNN cell (i.e., StackedRNNCell
internally) and use it to create an
RNN. For example:
const cells = [
tf.layers.simpleRNNCell({units: 4}),
tf.layers.simpleRNNCell({units: 8}),
];
const rnn = tf.layers.rnn({cell: cells, returnSequences: true});
// Create an input with 10 time steps and a length-20 vector at each step.
const input = tf.input({shape: [10, 20]});
const output = rnn.apply(input);
console.log(JSON.stringify(output.shape));
// [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the
// same as the sequence length of [tf.input()](#input), due to `returnSequences`: `true`;
// 3rd dimension is the last `SimpleRNNCell`'s number of units.
To create an RNN
consisting of only one SimpleRNNCell
, use the
tf.layers.simpleRNN
.
null
, 'linear' activation will be applied.
Optional
kernel
weights matrix, used for the linear
transformation of the inputs.
Optional
recurrentKernel
weights matrix, used for
linear transformation of the recurrent state.
Optional
kernel
weights matrix.
Optional
recurrent_kernel
weights matrix.
Optional
kernel
weights matrix.
Optional
recurrentKernel
weights matrix.
Optional
Base class for recurrent layers.
Input shape:
3D tensor with shape [batchSize, timeSteps, inputDim]
.
Output shape:
returnState
, an Array of tensors (i.e., tf.Tensors). The first
tensor is the output. The remaining tensors are the states at the
last time step, each with shape [batchSize, units]
.returnSequences
, the output will have shape
[batchSize, timeSteps, units]
.[batchSize, units]
.Masking:
This layer supports masking for input data with a variable number
of timesteps. To introduce masks to your data,
use an embedding layer with the mask_zero
parameter
set to True
.
Notes on using statefulness in RNNs: You can set RNN layers to be 'stateful', which means that the states computed for the samples in one batch will be reused as initial states for the samples in the next batch. This assumes a one-to-one mapping between samples in different successive batches.
To enable statefulness:
- specify stateful: true
in the layer constructor.
- specify a fixed batch size for your model, by passing
if sequential model:
batchInputShape=[...]
to the first layer in your model.
else for functional model with 1 or more Input layers:
batchShape=[...]
to all the first layers in your model.
This is the expected shape of your inputs including the batch size.
It should be a tuple of integers, e.g. (32, 10, 100)
.
- specify shuffle=False
when calling fit().
To reset the states of your model, call .reset_states()
on either
a specific layer, or on your entire model.
Note on specifying the initial state of RNNs
You can specify the initial state of RNN layers symbolically by
calling them with the option initialState
. The value of
initialState
should be a tensor or list of tensors representing
the initial state of the RNN layer.
You can specify the initial state of RNN layers numerically by
calling resetStates
with the keyword argument states
. The value of
states
should be a numpy array or list of numpy arrays representing
the initial state of the RNN layer.
Note on passing external constants to RNNs
You can pass "external" constants to the cell using the constants
keyword argument of RNN.call
method. This requires that the cell.call
method accepts the same keyword argument constants
. Such constants
can be used to conditon the cell transformation on additional static inputs
(not changing over time), a.k.a an attention mechanism.
Array
of tf.RNNCell instances.
RNN
layer to be wrapped.
null
or undefined
, the output will not be combined, they will be
returned as an Array
.
Optional
This wrapper applies a layer to every temporal slice of an input.
The input should be at least 3D, and the dimension of the index 1
will be
considered to be the temporal dimension.
Consider a batch of 32 samples, where each sample is a sequence of 10 vectors
of 16 dimensions. The batch input shape of the layer is then [32, 10, 16]
, and the inputShape
, not including the sample dimension, is
[10, 16]
.
You can then use TimeDistributed
to apply a Dense
layer to each of the 10
timesteps, independently:
const model = tf.sequential();
model.add(tf.layers.timeDistributed({
layer: tf.layers.dense({units: 8}),
inputShape: [10, 16],
}));
// Now model.outputShape = [null, 10, 8].
// The output will then have shape `[32, 10, 8]`.
// In subsequent layers, there is no need for `inputShape`:
model.add(tf.layers.timeDistributed({layer: tf.layers.dense({units: 32})}));
console.log(JSON.stringify(model.outputs[0].shape));
// Now model.outputShape = [null, 10, 32].
The output will then have shape [32, 10, 32]
.
TimeDistributed
can be used with arbitrary layers, not just Dense
, for
instance a Conv2D
layer.
const model = tf.sequential();
model.add(tf.layers.timeDistributed({
layer: tf.layers.conv2d({filters: 64, kernelSize: [3, 3]}),
inputShape: [10, 299, 299, 3],
}));
console.log(JSON.stringify(model.outputs[0].shape));
A layer is a grouping of operations and weights that can be composed to create a tf.Model.
Layers are constructed by using the functions under the tf.layers namespace.
Builds or executes a `Layer's logic.
When called with tf.Tensor(s), execute the Layer
s computation and
return Tensor(s). For example:
const denseLayer = tf.layers.dense({
units: 1,
kernelInitializer: 'zeros',
useBias: false
});
// Invoke the layer's apply() method with a [tf.Tensor](#class:Tensor) (with concrete
// numeric values).
const input = tf.ones([2, 2]);
const output = denseLayer.apply(input);
// The output's value is expected to be [[0], [0]], due to the fact that
// the dense layer has a kernel initialized to all-zeros and does not have
// a bias.
output.print();
When called with tf.SymbolicTensor(s), this will prepare the layer for future execution. This entails internal book-keeping on shapes of expected Tensors, wiring layers together, and initializing weights.
Calling apply
with tf.SymbolicTensors are typically used during the
building of non-tf.Sequential models. For example:
const flattenLayer = tf.layers.flatten();
const denseLayer = tf.layers.dense({units: 1});
// Use tf.layers.input() to obtain a SymbolicTensor as input to apply().
const input = tf.input({shape: [2, 2]});
const output1 = flattenLayer.apply(input);
// output1.shape is [null, 4]. The first dimension is the undetermined
// batch size. The second dimension comes from flattening the [2, 2]
// shape.
console.log(JSON.stringify(output1.shape));
// The output SymbolicTensor of the flatten layer can be used to call
// the apply() of the dense layer:
const output2 = denseLayer.apply(output1);
// output2.shape is [null, 1]. The first dimension is the undetermined
// batch size. The second dimension matches the number of units of the
// dense layer.
console.log(JSON.stringify(output2.shape));
// The input and output and be used to construct a model that consists
// of the flatten and dense layers.
const model = tf.model({inputs: input, outputs: output2});
call()
.
Optional
An input layer is an entry point into a tf.Model.
InputLayer
is generated automatically for tf.Sequential models by specifying
the inputshape
or batchInputShape
for the first layer. It should not be
specified explicitly.
// Define a model which simply adds two inputs.
const inputA = tf.input({shape: [3]});
const inputB = tf.input({shape: [3]});
const sum = tf.layers.add().apply([inputA, inputB]);
const model = tf.model({inputs: [inputA, inputB], outputs: sum});
const batchSize = 2;
model.predict([tf.ones([batchSize, 3]), tf.ones([batchSize, 3])]).print();
Zero-padding layer for 2D input (e.g., image).
This layer can add rows and columns of zeros at the top, bottom, left and right side of an image tensor.
Input shape: 4D tensor with shape:
dataFormat
is "channelsLast"
:
[batch, rows, cols, channels]
data_format
is "channels_first"
:
[batch, channels, rows, cols]
.Output shape: 4D with shape:
dataFormat
is "channelsLast"
:
[batch, paddedRows, paddedCols, channels]
dataFormat
is "channelsFirst"
:
[batch, channels, paddedRows, paddedCols]
.Array
of 2 integers, or Array
of 2 Array
s, each of
which is an Array
of 2 integers.
of 2 integers, interpreted as two different symmetric values for height and width:
[symmetricHeightPad, symmetricWidthPad]`.Array
of 2 Array
s, interpreted as:
[[topPad, bottomPad], [leftPad, rightPad]]
.'channelsLast'
(default) and 'channelsFirst'
.
The ordering of the dimensions in the inputs.
channelsLast
corresponds to inputs with shape
[batch, height, width, channels]
while channelsFirst
corresponds to inputs with shape
[batch, channels, height, width]
.
To perform mathematical computation on Tensors, we use operations. Tensors are immutable, so all operations always return new Tensors and never modify input Tensors.
Adds two tf.Tensors element-wise, A + B. Supports broadcasting.
We also expose addStrict
which has the same signature as this op and
asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 2, 3, 4]);
const b = tf.tensor1d([10, 20, 30, 40]);
a.add(b).print(); // or tf.add(a, b)
// Broadcast add a with b.
const a = tf.scalar(5);
const b = tf.tensor1d([10, 20, 30, 40]);
a.add(b).print(); // or tf.add(a, b)
a
.
Subtracts two tf.Tensors element-wise, A - B. Supports broadcasting.
We also expose subStrict
which has the same signature as this op and
asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([10, 20, 30, 40]);
const b = tf.tensor1d([1, 2, 3, 4]);
a.sub(b).print(); // or tf.sub(a, b)
// Broadcast subtract a with b.
const a = tf.tensor1d([10, 20, 30, 40]);
const b = tf.scalar(5);
a.sub(b).print(); // or tf.sub(a, b)
a
.
Multiplies two tf.Tensors element-wise, A * B. Supports broadcasting.
We also expose mulStrict
which has the same signature as this op and
asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 2, 3, 4]);
const b = tf.tensor1d([2, 3, 4, 5]);
a.mul(b).print(); // or tf.mul(a, b)
// Broadcast mul a with b.
const a = tf.tensor1d([1, 2, 3, 4]);
const b = tf.scalar(5);
a.mul(b).print(); // or tf.mul(a, b)
a
.
Divides two tf.Tensors element-wise, A / B. Supports broadcasting.
We also expose divStrict
which has the same signature as this op and
asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 4, 9, 16]);
const b = tf.tensor1d([1, 2, 3, 4]);
a.div(b).print(); // or tf.div(a, b)
// Broadcast div a with b.
const a = tf.tensor1d([2, 4, 6, 8]);
const b = tf.scalar(2);
a.div(b).print(); // or tf.div(a, b)
a
.
Divides two tf.Tensors element-wise, A / B. Supports broadcasting. The result is rounded with floor function.
const a = tf.tensor1d([1, 4, 9, 16]);
const b = tf.tensor1d([1, 2, 3, 4]);
a.floorDiv(b).print(); // or tf.div(a, b)
// Broadcast div a with b.
const a = tf.tensor1d([2, 4, 6, 8]);
const b = tf.scalar(2);
a.floorDiv(b).print(); // or tf.floorDiv(a, b)
a
.
Returns the max of a and b (a > b ? a : b
) element-wise.
Supports broadcasting.
We also expose maximumStrict
which has the same signature as this op and
asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 4, 3, 16]);
const b = tf.tensor1d([1, 2, 9, 4]);
a.maximum(b).print(); // or tf.maximum(a, b)
// Broadcast maximum a with b.
const a = tf.tensor1d([2, 4, 6, 8]);
const b = tf.scalar(5);
a.maximum(b).print(); // or tf.maximum(a, b)
a
.
Returns the min of a and b (a < b ? a : b
) element-wise.
Supports broadcasting.
We also expose minimumStrict
which has the same signature as this op and
asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 4, 3, 16]);
const b = tf.tensor1d([1, 2, 9, 4]);
a.minimum(b).print(); // or tf.minimum(a, b)
// Broadcast minimum a with b.
const a = tf.tensor1d([2, 4, 6, 8]);
const b = tf.scalar(5);
a.minimum(b).print(); // or tf.minimum(a, b)
a
.
Returns the mod of a and b element-wise.
floor(x / y) * y + mod(x, y) = x
Supports broadcasting.
We also expose modStrict
which has the same signature as this op and
asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 4, 3, 16]);
const b = tf.tensor1d([1, 2, 9, 4]);
a.mod(b).print(); // or tf.mod(a, b)
// Broadcast a mod b.
const a = tf.tensor1d([2, 4, 6, 8]);
const b = tf.scalar(5);
a.mod(b).print(); // or tf.mod(a, b)
a
.
Computes the power of one tf.Tensor to another. Supports broadcasting.
Given a tf.Tensor x and a tf.Tensor y, this operation computes x^y for
corresponding elements in x and y. The result's dtype will be the upcasted
type of the base
and tf.exp() dtypes.
const a = tf.tensor([[2, 3], [4, 5]])
const b = tf.tensor([[1, 2], [3, 0]]).toInt();
a.pow(b).print(); // or tf.pow(a, b)
const a = tf.tensor([[1, 2], [3, 4]])
const b = tf.tensor(2).toInt();
a.pow(b).print(); // or tf.pow(a, b)
We also expose powStrict
which has the same signature as this op and
asserts that base
and tf.exp() are the same shape (does not broadcast).
Returns (a - b) * (a - b) element-wise. Supports broadcasting.
We also expose squaredDifferenceStrict
which has the same signature as
this op and asserts that a
and b
are the same shape (does not
broadcast).
const a = tf.tensor1d([1, 4, 3, 16]);
const b = tf.tensor1d([1, 2, 9, 4]);
a.squaredDifference(b).print(); // or tf.squaredDifference(a, b)
// Broadcast squared difference a with b.
const a = tf.tensor1d([2, 4, 6, 8]);
const b = tf.scalar(5);
a.squaredDifference(b).print(); // or tf.squaredDifference(a, b)
a
.
Computes absolute value element-wise: abs(x)
const x = tf.tensor1d([-1, 2, -3, 4]);
x.abs().print(); // or tf.abs(x)
Computes acos of the input tf.Tensor element-wise: acos(x)
const x = tf.tensor1d([0, 1, -1, .7]);
x.acos().print(); // or tf.acos(x)
Computes the inverse hyperbolic cos of the input tf.Tensor element-wise:
acosh(x)
const x = tf.tensor1d([10, 1, 3, 5.7]);
x.acosh().print(); // or tf.acosh(x)
Computes asin of the input tf.Tensor element-wise: asin(x)
const x = tf.tensor1d([0, 1, -1, .7]);
x.asin().print(); // or tf.asin(x)
Computes inverse hyperbolic sin of the input tf.Tensor element-wise:
asinh(x)
const x = tf.tensor1d([0, 1, -1, .7]);
x.asinh().print(); // or tf.asinh(x)
Computes atan of the input tf.Tensor element-wise: atan(x)
const x = tf.tensor1d([0, 1, -1, .7]);
x.atan().print(); // or tf.atan(x)
Computes inverse hyperbolic tan of the input tf.Tensor element-wise:
atanh(x)
const x = tf.tensor1d([0, .1, -.1, .7]);
x.atanh().print(); // or tf.atanh(x)
Computes ceiling of input tf.Tensor element-wise: ceil(x)
const x = tf.tensor1d([.6, 1.1, -3.3]);
x.ceil().print(); // or tf.ceil(x)
Clips values element-wise. max(min(x, clipValueMax), clipValueMin)
const x = tf.tensor1d([-1, 2, -3, 4]);
x.clipByValue(-2, 3).print(); // or tf.clipByValue(x, -2, 3)
Computes cos of the input tf.Tensor element-wise: cos(x)
const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);
x.cos().print(); // or tf.cos(x)
Computes hyperbolic cos of the input tf.Tensor element-wise: cosh(x)
const x = tf.tensor1d([0, 1, -1, .7]);
x.cosh().print(); // or tf.cosh(x)
Computes exponential linear element-wise, x > 0 ? e ^ x - 1 : 0
const x = tf.tensor1d([-1, 1, -3, 2]);
x.elu().print(); // or tf.elu(x)
Computes gause error function of the input tf.Tensor element-wise:
erf(x)
const x = tf.tensor1d([0, .1, -.1, .7]);
x.erf().print(); // or tf.erf(x);
Computes exponential of the input tf.Tensor element-wise. e ^ x
const x = tf.tensor1d([1, 2, -3]);
x.exp().print(); // or tf.exp(x)
Computes exponential of the input tf.Tensor minus one element-wise.
e ^ x - 1
const x = tf.tensor1d([1, 2, -3]);
x.expm1().print(); // or tf.expm1(x)
Computes floor of input tf.Tensor element-wise: floor(x)
.
const x = tf.tensor1d([.6, 1.1, -3.3]);
x.floor().print(); // or tf.floor(x)
Computes leaky rectified linear element-wise.
See http://web.stanford.edu/~awni/papers/relu_hybrid_icml2013_final.pdf
const x = tf.tensor1d([-1, 2, -3, 4]);
x.leakyRelu(0.1).print(); // or tf.leakyRelu(x, 0.1)
Computes natural logarithm of the input tf.Tensor element-wise: ln(x)
const x = tf.tensor1d([1, 2, Math.E]);
x.log().print(); // or tf.log(x)
Computes natural logarithm of the input tf.Tensor plus one
element-wise: ln(1 + x)
const x = tf.tensor1d([1, 2, Math.E - 1]);
x.log1p().print(); // or tf.log1p(x)
Computes log sigmoid of the input tf.Tensor element-wise:
logSigmoid(x)
. For numerical stability, we use -tf.softplus(-x)
.
const x = tf.tensor1d([0, 1, -1, .7]);
x.logSigmoid().print(); // or tf.logSigmoid(x)
Computes -1 * x
element-wise.
const x = tf.tensor2d([1, 2, -2, 0], [2, 2]);
x.neg().print(); // or tf.neg(x)
Computes leaky rectified linear element-wise with parametric alphas.
x < 0 ? alpha * x : f(x) = x
const x = tf.tensor1d([-1, 2, -3, 4]);
const alpha = tf.scalar(0.1);
x.prelu(alpha).print(); // or tf.prelu(x, alpha)
Computes reciprocal of x element-wise: 1 / x
const x = tf.tensor1d([0, 1, 2]);
x.reciprocal().print(); // or tf.reciprocal(x)
Computes rectified linear element-wise: max(x, 0)
const x = tf.tensor1d([-1, 2, -3, 4]);
x.relu().print(); // or tf.relu(x)
bool
, the output dtype will be
`int32'.
Computes round of input tf.Tensor element-wise: round(x)
.
It implements banker's rounding.
const x = tf.tensor1d([.6, 1.1, -3.3]);
x.round().print(); // or tf.round(x)
Computes reciprocal of square root of the input tf.Tensor element-wise:
y = 1 / sqrt(x)
const x = tf.tensor1d([1, 2, 4, -1]);
x.rsqrt().print(); // or tf.rsqrt(x)
Computes scaled exponential linear element-wise.
x < 0 ? scale * alpha * (exp(x) - 1) : x
const x = tf.tensor1d([-1, 2, -3, 4]);
x.selu().print(); // or tf.selu(x)
Computes sigmoid element-wise, 1 / (1 + exp(-x))
const x = tf.tensor1d([0, -1, 2, -3]);
x.sigmoid().print(); // or tf.sigmoid(x)
Returns an element-wise indication of the sign of a number.
const x = tf.tensor1d([.6, 1.1, -3.3, NaN, 0]);
x.sign().print(); // or tf.sign(x)
Computes sin of the input Tensor element-wise: sin(x)
const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);
x.sin().print(); // or tf.sin(x)
Computes hyperbolic sin of the input tf.Tensor element-wise: sinh(x)
const x = tf.tensor1d([0, 1, -1, .7]);
x.sinh().print(); // or tf.sinh(x)
Computes softplus of the input tf.Tensor element-wise: log(exp(x) + 1)
const x = tf.tensor1d([0, 1, -1, .7]);
x.softplus().print(); // or tf.softplus(x)
Computes square root of the input tf.Tensor element-wise: y = sqrt(x)
const x = tf.tensor1d([1, 2, 4, -1]);
x.sqrt().print(); // or tf.sqrt(x)
Computes square of x
element-wise: x ^ 2
const x = tf.tensor1d([1, 2, Math.sqrt(2), -1]);
x.square().print(); // or tf.square(x)
Computes step of the input tf.Tensor element-wise: x > 0 ? 1 : alpha * x
const x = tf.tensor1d([0, 2, -1, -3]);
x.step(.5).print(); // or tf.step(x, .5)
Computes tan of the input tf.Tensor element-wise, tan(x)
const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);
x.tan().print(); // or tf.tan(x)
Computes hyperbolic tangent of the input tf.Tensor element-wise: tanh(x)
const x = tf.tensor1d([0, 1, -1, 70]);
x.tanh().print(); // or tf.tanh(x)
Computes the dot product of two matrices and/or vectors, t1 and t2.
const a = tf.tensor1d([1, 2]);
const b = tf.tensor2d([[1, 2], [3, 4]]);
const c = tf.tensor2d([[1, 2, 3], [4, 5, 6]]);
a.dot(b).print(); // or tf.dot(a, b)
b.dot(a).print();
b.dot(c).print();
Computes the dot product of two matrices, A * B. These must be matrices.
const a = tf.tensor2d([1, 2], [1, 2]);
const b = tf.tensor2d([1, 2, 3, 4], [2, 2]);
a.matMul(b).print(); // or tf.matMul(a, b)
a
is transposed before multiplication.
Optional
b
is transposed before multiplication.
Optional
Computes the norm of scalar, vectors, and matrices. This function can compute several different vector norms (the 1-norm, the Euclidean or 2-norm, the inf-norm, and in general the p-norm for p > 0) and matrix norms (Frobenius, 1-norm, and inf-norm).
const x = tf.tensor1d([1, 2, 3, 4]);
x.norm().print(); // or tf.norm(x)
ord | norm for matrices | norm for vectors |
---|---|---|
'euclidean' | Frobenius norm | 2-norm |
'fro' | Frobenius norm | |
Infinity | max(sum(abs(x), axis=1)) | max(abs(x)) |
-Infinity | min(sum(abs(x), axis=1)) | min(abs(x)) |
1 | max(sum(abs(x), axis=0)) | sum(abs(x)) |
2 | sum(abs(x)^2)^1/2* |
Computes the outer product of two vectors, v1 and v2.
const a = tf.tensor1d([1, 2, 3]);
const b = tf.tensor1d([3, 4, 5]);
tf.outerProduct(a, b).print();
Transposes the tf.Tensor. Permutes the dimensions according to perm
.
The returned tf.Tensor's dimension i
will correspond to the input
dimension perm[i]
. If perm
is not given, it is set to [n-1...0]
,
where n
is the rank of the input tf.Tensor. Hence by default, this
operation performs a regular matrix transpose on 2-D input tf.Tensors.
const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [2, 3]);
a.transpose().print(); // or tf.transpose(a)
Computes the 2D average pooling of an image.
[batch, height, width, inChannels]
. If rank 3, batch of 1 is assumed.
[filterHeight, filterWidth]
.
[strideHeight, strideWidth]
.
same
and stride 1: output will be of same size as input,
regardless of filter size.valid
: output will be smaller than input if filter is larger
than 1x1.Computes a 1D convolution over the input x.
[batch, width, inChannels]
. If rank 2, batch of 1 is assumed.
[filterWidth, inDepth, outDepth]
.
same
and stride 1: output will be of same size as input,
regardless of filter size.valid
: output will be smaller than input if filter is larger
than 1x1.1
. If it is greater than 1, then
stride must be 1
.
Optional
Computes a 2D convolution over the input x.
[batch, height, width, inChannels]
. If rank 3, batch of 1 is
assumed.
[filterHeight, filterWidth, inDepth, outDepth]
.
[strideHeight, strideWidth]
.
same
and stride 1: output will be of same size as input,
regardless of filter size.valid
: output will be smaller than input if filter is larger
than 1x1.[dilationHeight, dilationWidth]
in which we sample input values across the height and width dimensions
in atrous convolution. Defaults to [1, 1]
. If dilations
is a single
number, then dilationHeight == dilationWidth
. If it is greater than
1, then all values of strides
must be 1.
Optional
Computes the transposed 2D convolution of an image, also known as a deconvolution.
[batch, height, width, inDepth]
. If rank 3, batch of 1 is assumed.
[filterHeight, filterWidth, outDepth, inDepth]
.
inDepth
must match inDepth
in x
.
[batch, height, width, outDepth]
. If rank 3, batch of 1 is assumed.
[strideHeight, strideWidth]
.
Depthwise 2D convolution.
Given a 4D tf.input() array and a filter
array of shape
[filterHeight, filterWidth, inChannels, channelMultiplier]
containing
inChannels
convolutional filters of depth 1, this op applies a
different filter to each input channel (expanding from 1 channel to
channelMultiplier
channels for each), then concatenates the results
together. The output has inChannels * channelMultiplier
channels.
See https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d for more details.
[batch, height, width, inChannels]
. If rank 3, batch of 1 is
assumed.
[filterHeight, filterWidth, inChannels, channelMultiplier]
.
[strideHeight, strideWidth]
. If strides is a single number, then strideHeight == strideWidth
.
same
and stride 1: output will be of same size as input,
regardless of filter size.valid
: output will be smaller than input if filter is larger
than 1x1.[dilationHeight, dilationWidth]
in which we sample input values across the height and width dimensions
in atrous convolution. Defaults to [1, 1]
. If rate
is a single
number, then dilationHeight == dilationWidth
. If it is greater than
1, then all values of strides
must be 1.
Optional
Computes the 2D max pooling of an image.
[batch, height, width, inChannels]
. If rank 3, batch of 1 is assumed.
[filterHeight, filterWidth]
.
[strideHeight, strideWidth]
.
same
and stride 1: output will be of same size as input,
regardless of filter size.valid
: output will be smaller than input if filter is larger
than 1x1.2-D convolution with separable filters.
Performs a depthwise convolution that acts separately on channels followed by a pointwise convolution that mixes channels. Note that this is separability between dimensions [1, 2] and 3, not spatial separability between dimensions 1 and 2.
See https://www.tensorflow.org/api_docs/python/tf/nn/separable_conv2d for more details.
[batch, height, width, inChannels]
. If rank 3, batch of 1 is
assumed.
[filterHeight, filterWidth, inChannels, channelMultiplier]
. This is
the filter used in the first step.
[1, 1, inChannels * channelMultiplier, outChannels]
. This is
the filter used in the second step.
[strideHeight, strideWidth]
. If strides is a single number, then strideHeight == strideWidth
.
same
and stride 1: output will be of same size as input,
regardless of filter size.valid
: output will be smaller than input if filter is larger
than 1x1.Computes the logical and of elements across dimensions of a tf.Tensor.
Reduces the input along the dimensions given in axes
. Unless keepDims
is true, the rank of the tf.Tensor is reduced by 1 for each entry in axes
.
If keepDims
is true, the reduced dimensions are retained with length 1.
If axes
has no entries, all dimensions are reduced, and an tf.Tensor with
a single element is returned.
const x = tf.tensor1d([1, 1, 1]);
x.all().print(); // or tf.all(x)
const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool');
const axis = 1;
x.all(axis).print(); // or tf.all(x, axis)
Computes the logical or of elements across dimensions of a tf.Tensor.
Reduces the input along the dimensions given in axes
. Unless keepDims
is true, the rank of the tf.Tensor is reduced by 1 for each entry in axes
.
If keepDims
is true, the reduced dimensions are retained with length 1.
If axes
has no entries, all dimensions are reduced, and an tf.Tensor with
a single element is returned.
const x = tf.tensor1d([1, 1, 1]);
x.any().print(); // or tf.any(x)
const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool');
const axis = 1;
x.any(axis).print(); // or tf.any(x, axis)
Returns the indices of the maximum values along an axis
.
The result has the same shape as tf.input() with the dimension along axis
removed.
const x = tf.tensor1d([1, 2, 3]);
x.argMax().print(); // or tf.argMax(x)
const x = tf.tensor2d([1, 2, 4, 3], [2, 2]);
const axis = 1;
x.argMax(axis).print(); // or tf.argMax(x, axis)
Returns the indices of the minimum values along an axis
.
The result has the same shape as tf.input() with the dimension along axis
removed.
const x = tf.tensor1d([1, 2, 3]);
x.argMin().print(); // or tf.argMin(x)
const x = tf.tensor2d([1, 2, 4, 3], [2, 2]);
const axis = 1;
x.argMin(axis).print(); // or tf.argMin(x, axis)
Computes the log(sum(exp(elements across the reduction dimensions)).
Reduces the input along the dimensions given in axis
. Unless keepDims
is true, the rank of the array is reduced by 1 for each entry in axis
.
If keepDims
is true, the reduced dimensions are retained with length 1.
If axis
has no entries, all dimensions are reduced, and an array with a
single element is returned.
const x = tf.tensor1d([1, 2, 3]);
x.logSumExp().print(); // or tf.logSumExp(x)
const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);
const axis = 1;
x.logSumExp(axis).print(); // or tf.logSumExp(a, axis)
Computes the maximum of elements across dimensions of a tf.Tensor.
Reduces the input along the dimensions given in axes
. Unless keepDims
is true, the rank of the tf.Tensor is reduced by 1 for each entry in axes
.
If keepDims
is true, the reduced dimensions are retained with length 1.
If axes
has no entries, all dimensions are reduced, and an tf.Tensor with
a single element is returned.
const x = tf.tensor1d([1, 2, 3]);
x.max().print(); // or tf.max(x)
const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);
const axis = 1;
x.max(axis).print(); // or tf.max(x, axis)
Computes the mean of elements across dimensions of a tf.Tensor.
Reduces x
along the dimensions given in axis
. Unless keepDims
is
true, the rank of the tf.Tensor is reduced by 1 for each entry in axis
.
If keepDims
is true, the reduced dimensions are retained with length 1.
If axis
has no entries, all dimensions are reduced, and a tf.Tensor with
a single element is returned.
const x = tf.tensor1d([1, 2, 3]);
x.mean().print(); // or tf.mean(a)
const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);
const axis = 1;
x.mean(axis).print(); // or tf.mean(x, axis)
Computes the minimum value from the input.
Reduces the input along the dimensions given in axes
. Unless keepDims
is true, the rank of the array is reduced by 1 for each entry in axes
.
If keepDims
is true, the reduced dimensions are retained with length 1.
If axes
has no entries, all dimensions are reduced, and an array with a
single element is returned.
const x = tf.tensor1d([1, 2, 3]);
x.min().print(); // or tf.min(x)
const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);
const axis = 1;
x.min(axis).print(); // or tf.min(x, axis)
Computes the sum of elements across dimensions of a tf.Tensor.
Reduces the input along the dimensions given in axes
. Unless keepDims
is true, the rank of the tf.Tensor is reduced by 1 for each entry in axes
.
If keepDims
is true, the reduced dimensions are retained with length 1.
If axes has no entries, all dimensions are reduced, and a tf.Tensor with a
single element is returned.
const x = tf.tensor1d([1, 2, 3]);
x.sum().print(); // or tf.sum(x)
const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);
const axis = 1;
x.sum(axis).print(); // or tf.sum(x, axis)
bool
it will be converted to int32
and the output dtype will be int32
.
Batch normalization.
As described in http://arxiv.org/abs/1502.03167.
Mean, variance, scale, and offset can be of two shapes:
Also available are stricter rank-specific methods with the same signature as this method that assert that parameters passed are of given rank
tf.batchNormalization2d
tf.batchNormalization3d
tf.batchNormalization4d
Normalizes the activation of a local neighborhood across or within channels.
Calculates the mean and variance of x
. The mean and variance are
calculated by aggregating the contents of x
across axes
. If x
is
1-D and axes = [0]
this is just the mean and variance of a vector.
Computes the softmax normalized vector given the logits.
const a = tf.tensor1d([1, 2, 3]);
a.softmax().print(); // or tf.softmax(a)
const a = tf.tensor2d([2, 4, 6, 1, 2, 3], [2, 3]);
a.softmax().print(); // or tf.softmax(a)
-1
which indicates the last dimension.
Optional
Bilinear resize a batch of 3D images to a new shape.
[batch, height, width, inChannels]
. If rank 3, batch of 1 is assumed.
[newHeight, newWidth]
to resize the
images to. Each channel is resized individually.
(new_height - 1) / (height - 1)
, which exactly aligns the 4
corners of images and resized images. If false, rescale by
new_height / height
. Treat similarly the width dimension.
Optional
NearestNeighbor resize a batch of 3D images to a new shape.
[batch, height, width, inChannels]
. If rank 3, batch of 1 is assumed.
[newHeight, newWidth]
to resize the
images to. Each channel is resized individually.
(new_height - 1) / (height - 1)
, which exactly aligns the 4
corners of images and resized images. If false, rescale by
new_height / height
. Treat similarly the width dimension.
Optional
Computes the next state and output of a BasicLSTMCell.
Returns [newC, newH]
.
Derived from tf.contrib.rnn.BasicLSTMCell.
Computes the next states and outputs of a stack of LSTMCells.
Each cell output is used as input to the next cell.
Returns [cellState, cellOutput]
.
Derived from tf.contrib.rn.MultiRNNCell.
Returns the truth value of (a == b) element-wise. Supports broadcasting.
We also expose equalStrict
which has the same signature as this op
and asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 2, 3]);
const b = tf.tensor1d([2, 2, 2]);
a.equal(b).print();
a
.
Returns the truth value of (a > b) element-wise. Supports broadcasting.
We also expose greaterStrict
which has the same signature as this
op and asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 2, 3]);
const b = tf.tensor1d([2, 2, 2]);
a.greater(b).print();
a
.
Returns the truth value of (a >= b) element-wise. Supports broadcasting.
We also expose greaterEqualStrict
which has the same signature as this
op and asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 2, 3]);
const b = tf.tensor1d([2, 2, 2]);
a.greaterEqual(b).print();
a
.
Returns the truth value of (a < b) element-wise. Supports broadcasting.
We also expose lessStrict
which has the same signature as this op and
asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 2, 3]);
const b = tf.tensor1d([2, 2, 2]);
a.less(b).print();
a
.
Returns the truth value of (a <= b) element-wise. Supports broadcasting.
We also expose lessEqualStrict
which has the same signature as this op
and asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 2, 3]);
const b = tf.tensor1d([2, 2, 2]);
a.lessEqual(b).print();
a
.
Returns the truth value of a AND b element-wise. Supports broadcasting.
const a = tf.tensor1d([false, false, true, true], 'bool');
const b = tf.tensor1d([false, true, false, true], 'bool');
a.logicalAnd(b).print();
Returns the truth value of NOT x
element-wise.
const a = tf.tensor1d([false, true], 'bool');
a.logicalNot().print();
Returns the truth value of a OR b
element-wise. Supports broadcasting.
const a = tf.tensor1d([false, false, true, true], 'bool');
const b = tf.tensor1d([false, true, false, true], 'bool');
a.logicalOr(b).print();
Returns the truth value of a XOR b
element-wise. Supports broadcasting.
const a = tf.tensor1d([false, false, true, true], 'bool');
const b = tf.tensor1d([false, true, false, true], 'bool');
a.logicalXor(b).print();
Returns the truth value of (a != b) element-wise. Supports broadcasting.
We also expose notEqualStrict
which has the same signature as this op and
asserts that a
and b
are the same shape (does not broadcast).
const a = tf.tensor1d([1, 2, 3]);
const b = tf.tensor1d([0, 2, 3]);
a.notEqual(b).print();
a
.
Returns the elements, either a
or b
depending on the condition
.
If the condition is true, select from a
, otherwise select from b
.
const cond = tf.tensor1d([false, false, true], 'bool');
const a = tf.tensor1d([1 , 2, 3]);
const b = tf.tensor1d([-1, -2, -3]);
a.where(cond, b).print();
condition
is rank 1, a
may have a higher rank but
its first dimension must match the size of condition
.
a
.
Computes the cumulative sum of a tf.Tensor along axis
.
const x = tf.tensor([1, 2, 3, 4]);
x.cumsum().print();
const x = tf.tensor([[1, 2], [3, 4]]);
x.cumsum().print();
Gram-Schmidt orthogonalization.
xs
.
In each case, all the vectors must have the same length and the length
must be greater than or equal to the number of vectors.Compute QR decomposition of m-by-n matrix using Householder transformation.
Implementation based on [http://www.cs.cornell.edu/~bindel/class/cs6210-f09/lec18.pdf] (http://www.cs.cornell.edu/~bindel/class/cs6210-f09/lec18.pdf)
Compute the moving average of a variable.
Without zeroDebias, the moving average operation is defined by:
v += delta
where
delta = (1 - decay) * (x - v)
With zeroDebias (default), the delta
term is scaled to debias the
effect of the (assumed) zero-initialization of v
.
delta /= (1 - decay ^ step)
For more details on the zero-debiasing algorithm, see: https://arxiv.org/abs/1412.6980
Note that this function is completely stateless and does not keep track of step count. The step count needs to be maintained by the caller and passed in as tf.step().
v
.
true
).
Optional
Computes the sum along segments of a tf.Tensor.
const x = tf.tensor1d([1, 2, 3, 4]);
const segmentIds = tf.tensor1d([1, 2, 0, 1], 'int32');
const numSegments = 3;
x.unsortedSegmentSum(segmentIds, numSegments).print()
//or tf.unsortedSegmentSum(x, segmentIds, numSegments)
x
's
dimension along the axis
. Maps each element of x
to a segment.
segmentIds
Computes sigmoid cross entropy given logits.
Extracts a strided slice of a tensor.
Roughly speaking, this op extracts a slice of size (end-begin)/stride from the given input_ tensor. Starting at the location specified by begin the slice continues by adding stride to the index until all dimensions are not less than end. Note that a stride can be negative, which causes a reverse slice.
t = tf.tensor3d([1, 1, 1 ,2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6],
[3, 2, 3]);
t.stridedSlice([1, 0, 0], [2, 1, 3], [1, 1, 1]).print() // [[[3, 3, 3]]]
t.stridedSlice([1, 0, 0], [2, 2, 3], [1, 1, 1]).print() // [[[3, 3, 3],
// [4, 4, 4]]]
t.stridedSlice([1, -1, 0], [2, -3, 3], [1, -1, 1]).print() // [[[4, 4, 4],
// [3, 3, 3]]]
We also provide an API to do perform training, and compute gradients. We compute gradients eagerly, users provide a function that is a combination of operations and we automatically differentiate that function's output with respect to its inputs.
For those familiar with TensorFlow, the API we expose exactly mirrors the TensorFlow Eager API.
Provided f(x)
, returns another function g(x, dy?)
, which gives the
gradient of f(x)
with respect to x
.
If dy
is provided, the gradient of f(x).mul(dy).sum()
with respect to
x
is computed instead. f(x)
must take a single tensor x
and return a
single tensor y
. If f()
takes multiple inputs, use tf.grads() instead.
// f(x) = x ^ 2
const f = x => x.square();
// f'(x) = 2x
const g = tf.grad(f);
const x = tf.tensor1d([2, 3]);
g(x).print();
// f(x) = x ^ 3
const f = x => x.pow(tf.scalar(3, 'int32'));
// f'(x) = 3x ^ 2
const g = tf.grad(f);
// f''(x) = 6x
const gg = tf.grad(g);
const x = tf.tensor1d([2, 3]);
gg(x).print();
Provided f(x1, x2,...)
, returns another function g([x1, x2,...], dy?)
,
which gives an array of gradients of f()
with respect to each input
[x1
,x2
,...].
If dy
is passed when calling g()
, the gradient of
f(x1,...).mul(dy).sum()
with respect to each input is computed instead.
The provided f
must take one or more tensors and return a single tensor
y
. If f()
takes a single input, we recommend using tf.grad() instead.
// f(a, b) = a * b
const f = (a, b) => a.mul(b);
// df / da = b, df / db = a
const g = tf.grads(f);
const a = tf.tensor1d([2, 3]);
const b = tf.tensor1d([-2, -3]);
const [da, db] = g([a, b]);
console.log('da');
da.print();
console.log('db');
db.print();
Overrides the gradient computation of a function f
.
Takes a function
f(...inputs) => {value: Tensor, gradFunc: dy => Tensor[]}
and returns
another function g(...inputs)
which takes the same inputs as f
. When
called, g
returns f().value
. In backward mode, custom gradients with
respect to each input of f
are computed using f().gradFunc
.
const customOp = tf.customGrad(x => {
// Override gradient of our custom x ^ 2 op to be dy * abs(x);
return {value: x.square(), gradFunc: dy => [dy.mul(x.abs())]};
});
const x = tf.tensor1d([-1, -2, 3]);
const dx = tf.grad(x => customOp(x));
console.log(`f(x):`);
customOp(x).print();
console.log(`f'(x):`);
dx(x).print();
{value: Tensor, gradFunc: (dy) => Tensor[]}
, where gradFunc
returns
the custom gradients of f
with respect to its inputs.
Like tf.grad(), but also returns the value of f()
. Useful when f()
returns a metric you want to show.
The result is a rich object with the following properties:
f(x)
w.r.t x
(result of tf.grad()).f(x)
.// f(x) = x ^ 2
const f = x => x.square();
// f'(x) = 2x
const g = tf.valueAndGrad(f);
const x = tf.tensor1d([2, 3]);
const {value, grad} = g(x);
console.log('value');
value.print();
console.log('grad');
grad.print();
Like tf.grads(), but returns also the value of f()
. Useful when f()
returns a metric you want to show.
The result is a rich object with the following properties:
f()
w.r.t each input (result of tf.grads()).f(x)
.// f(a, b) = a * b
const f = (a, b) => a.mul(b);
// df/da = b, df/db = a
const g = tf.valueAndGrads(f);
const a = tf.tensor1d([2, 3]);
const b = tf.tensor1d([-2, -3]);
const {value, grads} = g([a, b]);
const [da, db] = grads;
console.log('value');
value.print();
console.log('da');
da.print();
console.log('db');
db.print();
Computes and returns the gradient of f(x) with respect to the list of
trainable variables provided by varList
. If no list is provided, it
defaults to all trainable variables.
const a = tf.variable(tf.tensor1d([3, 4]));
const b = tf.variable(tf.tensor1d([5, 6]));
const x = tf.tensor1d([1, 2]);
// f(a, b) = a * x ^ 2 + b * x
const f = () => a.mul(x.square()).add(b.mul(x)).sum();
// df/da = x ^ 2, df/db = x
const {value, grads} = tf.variableGrads(f);
Object.keys(grads).forEach(varName => grads[varName].print());
Constructs a tf.SGDOptimizer that uses stochastic gradient descent.
// Fit a quadratic function by learning the coefficients a, b, c.
const xs = tf.tensor1d([0, 1, 2, 3]);
const ys = tf.tensor1d([1.1, 5.9, 16.8, 33.9]);
const a = tf.scalar(Math.random()).variable();
const b = tf.scalar(Math.random()).variable();
const c = tf.scalar(Math.random()).variable();
// y = a * x^2 + b * x + c.
const f = x => a.mul(x.square()).add(b.mul(x)).add(c);
const loss = (pred, label) => pred.sub(label).square().mean();
const learningRate = 0.01;
const optimizer = tf.train.sgd(learningRate);
// Train the model.
for (let i = 0; i < 10; i++) {
optimizer.minimize(() => loss(f(xs), ys));
}
// Make predictions.
console.log(
`a: ${a.dataSync()}, b: ${b.dataSync()}, c: ${c.dataSync()}`);
const preds = f(xs).dataSync();
preds.forEach((pred, i) => {
console.log(`x: ${i}, pred: ${pred}`);
});
Constructs a tf.MomentumOptimizer that uses momentum gradient descent.
Constructs a tf.AdagradOptimizer that uses the Adagrad algorithm. See http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf or http://ruder.io/optimizing-gradient-descent/index.html#adagrad
Constructs a tf.AdadeltaOptimizer that uses the Adadelta algorithm. See https://arxiv.org/abs/1212.5701
Constructs a AdamOptimizer
that uses the Adam algorithm.
See https://arxiv.org/abs/1412.6980
Constructs a AdamaxOptimizer
that uses the Adamax algorithm.
See https://arxiv.org/abs/1412.6980
Constructs a tf.RMSPropOptimizer that uses RMSProp gradient descent. This implementation uses plain momentum and is not centered version of RMSProp.
See http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf
Computes the absolute difference loss between two tensors.
labels
, and must be broadcastable to labels
(i.e., all dimensions
must be either 1
, or the same as the corresponding losses
dimension).
Optional
Reduction
Optional
Computes the weighted loss between two tensors.
[batch_size, d1, ... dN]
.
losses
, and must be broadcastable to losses
(i.e., all
dimensions must be either 1
, or the same as the corresponding
losses
dimension).
Optional
Computes the cosine distance loss between two tensors.
labels
, and must be broadcastable to labels
(i.e., all dimensions
must be either 1
, or the same as the corresponding losses
dimension).
Optional
Reduction
Optional
Computes the Hinge loss between two tensors.
labels
, and must be broadcastable to labels
(i.e., all dimensions
must be either 1
, or the same as the corresponding losses
dimension).
Optional
Reduction
Optional
Computes the huber loss between two tensors.
labels
, and must be broadcastable to labels
(i.e., all dimensions
must be either 1
, or the same as the corresponding losses
dimension).
Optional
Reduction
.
Optional
Computes the log loss between two tensors.
labels
, and must be broadcastable to labels
(i.e., all dimensions
must be either 1
, or the same as the corresponding losses
dimension).
Optional
Reduction
Optional
Computes the mean squared error between two tensors.
labels
, and must be broadcastable to labels
(i.e., all dimensions
must be either 1
, or the same as the corresponding losses
dimension).
Optional
Reduction
Optional
Computes softmax cross entropy between logits and labels.
Measures the probability error in discrete classification tasks in which the classes are mutually exclusive (each entry is in exactly one class). For example, each CIFAR-10 image is labeled with one and only one label: an image can be a dog or a truck, but not both.
NOTE
: While the classes are mutually exclusive, their probabilities need
not be. All that is required is that each row of labels is a valid
probability distribution. If they are not, the computation of the gradient
will be incorrect.
WARNING
: This op expects unscaled logits, since it performs a softmax on
logits internally for efficiency. Do not call this op with the output of
softmax, as it will produce incorrect results.
logits and labels must have the same shape, e.g. [batch_size, num_classes] and the same dtype.
-1
which indicates the last dimension.
Optional
Executes f()
and minimizes the scalar output of f()
by computing
gradients of y with respect to the list of trainable variables provided by
varList
. If no list is provided, it defaults to all trainable variables.
f()
.
Optional
Executes the provided function fn
and after it is executed, cleans up all
intermediate tensors allocated by fn
except those returned by fn
.
f
must not return a Promise (async functions not allowed).
The returned result can be a complex object, however tidy only walks the
top-level properties (depth 1) of that object to search for tensors, or
lists of tensors that need to be tracked in the parent scope.
Using this method helps avoid memory leaks. In general, wrap calls to operations in tf.tidy() for automatic memory cleanup.
When in safe mode, you must enclose all tf.Tensor creation and ops inside a tf.tidy() to prevent memory leaks.
// y = 2 ^ 2 + 1
const y = tf.tidy(() => {
// a, b, and one will be cleaned up when the tidy ends.
const one = tf.scalar(1);
const a = tf.scalar(2);
const b = a.square();
console.log('numTensors (in tidy): ' + tf.memory().numTensors);
// The value returned inside the tidy function will return
// through the tidy, in this case to the variable y.
return b.add(one);
});
console.log('numTensors (outside tidy): ' + tf.memory().numTensors);
y.print();
Disposes any tf.Tensors found within the provided object.
Tensor[]
or {key: Tensor, ...}
. If the
object is not a tf.Tensor or does not contain Tensors
, nothing
happens. In general it is safe to pass any object here, except that
Promise
s are not supported.
Keeps a tf.Tensor generated inside a tf.tidy() from being disposed automatically.
let b;
const y = tf.tidy(() => {
const one = tf.scalar(1);
const a = tf.scalar(2);
// b will not be cleaned up by the tidy. a and one will be cleaned up
// when the tidy ends.
b = tf.keep(a.square());
console.log('numTensors (in tidy): ' + tf.memory().numTensors);
// The value returned inside the tidy function will return
// through the tidy, in this case to the variable y.
return b.add(one);
});
console.log('numTensors (outside tidy): ' + tf.memory().numTensors);
console.log('y:');
y.print();
console.log('b:');
b.print();
Returns memory info at the current time in the program. The result is an object with the following properties:
numBytes
: Number of bytes allocated (undisposed) at this time.numTensors
: Number of unique tensors allocated.numDataBuffers
: Number of unique data buffers allocated
(undisposed) at this time, which is ≤ the number of tensors
(e.g. a.reshape(newShape)
makes a new Tensor that shares the same
data buffer with a
).unreliable
: Optional
boolean
:
tidy()
, or
lacking a call to tensor.dispose()
.Executes f()
and returns a promise that resolves with timing
information.
The result is an object with the following properties:
wallMs
: Wall execution time.kernelMs
: Kernel execution time, ignoring data transfer.WebGL
The following additional properties exist:
uploadWaitMs
: CPU blocking time on texture uploads.downloadWaitMs
: CPU blocking time on texture downloads (readPixels).const x = tf.randomNormal([20, 20]);
const time = await tf.time(() => x.matMul(x));
console.log(`kernelMs: ${time.kernelMs}, wallTimeMs: ${time.wallMs}`);
Returns a promise that resolve when a requestAnimationFrame has completed.
This is simply a sugar method so that users can do the following:
await tf.nextFrame();
TensorFlow.js can run mathematical operations on different backends. Currently, we support WebGL and JavaScript CPU. By default, we choose the 'best' backend available, but allow users to customize their backend.
Sets the backend (cpu, webgl, etc) responsible for creating tensors and executing operations on those tensors.
Note this disposes the current backend, if any, as well as any tensors associated with it. A new backend is initialized, even if it is of the same type as the previous one.
'webgl'|'cpu'
in
the browser, and 'tensorflow'
under node.js (requires tfjs-node).
tidy()
which
will automatically clean up intermediate tensors.
Optional
Returns the current backend (cpu, webgl, etc). The backend is responsible for creating tensors and executing operations on those tensors.
Constraints are added to attributes of a Layer (such as weights, kernels, or biases) at construction time to clamp, or otherwise enforce an allowed range, of values for different components of the Layer.
MaxNorm weight constraint.
Constrains the weights incident to each hidden unit to have a norm less than or equal to a desired value.
References - Dropout: A Simple Way to Prevent Neural Networks from Overfitting Srivastava, Hinton, et al. 2014
For instance, in a Dense
layer the weight matrix
has shape [inputDim, outputDim]
,
set axis
to 0
to constrain each weight vector
of length [inputDim,]
.
In a Conv2D
layer with dataFormat="channels_last"
,
the weight tensor has shape
[rows, cols, inputDepth, outputDepth]
,
set axis
to [0, 1, 2]
to constrain the weights of each filter tensor of size
[rows, cols, inputDepth]
.
Dense
layer the weight matrix
has shape [inputDim, outputDim]
,
set axis
to 0
to constrain each weight vector
of length [inputDim,]
.
In a Conv2D
layer with dataFormat="channels_last"
,
the weight tensor has shape
[rows, cols, inputDepth, outputDepth]
,
set axis
to [0, 1, 2]
to constrain the weights of each filter tensor of size
[rows, cols, inputDepth]
.
Optional
(1 - rate) * norm + rate * norm.clip(minValue, maxValue)
.
Effectively, this means that rate=1.0 stands for strict
enforcement of the constraint, while rate<1.0 means that
weights will be rescaled at each step to slowly move
towards a value inside the desired interval.
Optional
Constains the weight to be non-negative.
Constrains the weights incident to each hidden unit to have unit norm.
For instance, in a Dense
layer the weight matrix
has shape [inputDim, outputDim]
,
set axis
to 0
to constrain each weight vector
of length [inputDim,]
.
In a Conv2D
layer with dataFormat="channels_last"
,
the weight tensor has shape
[rows, cols, inputDepth, outputDepth], set
axisto
[0, 1, 2]to constrain the weights of each filter tensor of size
[rows, cols, inputDepth]`.
Base class for functions that impose constraints on weight values
Initializers are used in Layers to establish the starting the values of weights, biases, kernels, etc.
Initializer that generates values initialized to some constant.
Glorot normal initializer, also called Xavier normal initializer.
It draws samples from a truncated normal distribution centered on 0
with stddev = sqrt(2 / (fan_in + fan_out))
where fan_in
is the number of input units in the weight tensor
and fan_out
is the number of output units in the weight tensor.
Reference: Glorot & Bengio, AISTATS 2010 http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf
Glorot uniform initializer, also called Xavier uniform initializer.
It draws samples from a uniform distribution within [-limit, limit]
where limit
is sqrt(6 / (fan_in + fan_out))
where fan_in
is the number of input units in the weight tensor
and fan_out
is the number of output units in the weight tensor
Reference: Glorot & Bengio, AISTATS 2010 http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf.
He normal initializer.
It draws samples from a truncated normal distribution centered on 0
with stddev = sqrt(2 / fanIn)
where fanIn
is the number of input units in the weight tensor.
Reference: He et al., http://arxiv.org/abs/1502.01852
Initializer that generates the identity matrix. Only use for square 2D matrices.
LeCun normal initializer.
It draws samples from a truncated normal distribution centered on 0
with stddev = sqrt(1 / fanIn)
where fanIn
is the number of input units in the weight tensor.
References: Self-Normalizing Neural Networks Efficient Backprop
Initializer that generates tensors initialized to 1.
Initializer that generates a random orthogonal matrix.
Reference: Saxe et al., http://arxiv.org/abs/1312.6120
Initializer that generates random values initialized to a normal distribution.
Initializer that generates random values initialized to a uniform distribution.
Values will be distributed uniformly between the configured minval and maxval.
Initializer that generates random values initialized to a truncated normal. distribution.
These values are similar to values from a RandomNormal
except that values
more than two standard deviations from the mean are discarded and re-drawn.
This is the recommended initializer for neural network weights and filters.
Initializer capable of adapting its scale to the shape of weights.
With distribution=NORMAL, samples are drawn from a truncated normal
distribution centered on zero, with stddev = sqrt(scale / n)
where n is:
limit = sqrt(3 * scale / n)
.Initializer that generates tensors initialized to 0.
Regularizers can be attached to various components of a Layer to add a 'scoring' function to help drive weights, or other trainable values, away from excessively large values. They're typically used to promote a notion that a 'simpler' model is better than a complicated model, assuming equal performance.
Regularizer for L1 and L2 regularization.
Adds a term to the loss to penalize large weights: loss += sum(l1 * abs(x)) + sum(l2 * x^2)
Regularizer for L1 and L2 regularization.
Adds a term to the loss to penalize large weights: loss += sum(l1 * abs(x)) + sum(l2 * x^2)
Regularizer for L1 and L2 regularization.
Adds a term to the loss to penalize large weights: loss += sum(l1 * abs(x)) + sum(l2 * x^2)
Regularizer for L1 and L2 regularization.
Adds a term to the loss to penalize large weights: loss += sum(l1 * abs(x)) + sum(l2 * x^2)
Draws a tf.Tensor of pixel values to a byte array or optionally a canvas.
When the dtype of the input is 'float32', we assume values in the range [0-1]. Otherwise, when input is 'int32', we assume values in the range [0-255].
Returns a promise that resolves when the canvas has been drawn to.