*94*

# Keras backends

Keras is a model-level library, offers high-level building blocks that are useful to develop deep learning models. Instead of supporting low-level operations such as tensor products, convolutions, etc. itself, it depends upon the backend engine that is well specialized and optimized tensor manipulation library. It doesn’t pick just one library of a tensor to implement Keras tied to that particular library. It handles the situation in a modular way by seamlessly plugging many distinct back-end engines to Keras.

Following are the three available backend implementations, which are as follows;

**TensorFlow:**This Google-developed framework for symbolic tensor manipulation is open-source.**Theano:**It is also an open-source framework for symbolic manipulation of a tensor is developed at Universite de Montreal by LISA Lab.**CNTK:**It is developed by Microsoft, which is also an open-source deep-learning toolkit.

## Switching from one backend to another

You will probably find the Keras configuration file at:

**$HOME/.keras/keras.json**

In case you face a problem finding it there, then you may create one!

#### Note: Especially for the Windows user, you have to replace $HOME with %USERPROFILE%.

Following is the default configuration;

Here, you just have to change the **backend** field to **“theano”**, **“tensorflow”** or **“cntk”,** and then Keras will make use of the modified configuration when you will run any Keras code.

Once you define the **KERAS_BACKEND** environment variable, it will override whatsoever defined inside your config file:

Possibly you can load many more backends in Keras then **“tensorflow”**, **“theano”** or **“cntk”** as it can easily make use of external backends. This can be done by changing **keras.json** and **“backend”** setting. Let’s suppose you have a Python module named as **my_module** to be used as an external backend; then, in that case, the **keras.json** file may undergo some changes, which is as follows;

In order to use an external backend, it must be validated and encompass functions like **placeholder**, **variable**, and **function**.

If the external backend is not valid then, it may generate an error which may contain all the missing entries.

## keras.json details

Following are the settings contained in the **keras.json** file:

The settings can be simply modified by editing **$HOME/.keras/keras.json**.

**image_data_format:**It can be defined as a string, either of “channels_last” or “channels_first”, specifying the convention data format followed by Keras. (It is returned by**backend.image_data_format()**).- For any two-dimensional data such as an image, the
**“channels_last”**will assume**(rows, cols, channels)**, whereas**“channels_first”**will assume**(channels, rows, cols)**. - For any three-dimensional data, the
**“channels_last”**will relate to**(conv_dim1, conv_dim2, conv_dim3, channels)**, whereas**“channels_first”**will relate to**(channels, conv_dim1, conv_dim2, conv_dim3)**. **epsilon:**It refers to a float, which is a fuzzy numeric constant utilized for avoiding the division by zero in some operations.**floatx:**It indicates a string of**“float16”**,**“float32”**, or**“float64”**. By default, it is float precision.**backend:**It refers to a string of “tensorflow”, “theano”, or “cntk”.

## Usage of abstract Keras backend for writing new code

With the help of abstract Keras backend API, you can make your written Keras module more compatible with both Theano (**th**) and TensorFlow (**tf**). Following is an intro to it;

The backend module can be import thru:

An input placeholder will be instantiated by the code given below, which is equal to **tf.placeholder()** or **th.tensor.matrix(), th.tensor.tensor3()**, etc.

A variable will be instantiated by incorporating the following code, which in return is equal to **tf.Variable()** or **th.shared()**.

Most of the tensor operations that you may require will be performed in a similar way as you will do in TensorFlow or Theano are as follows:

## Backend functions

**backend**

The backend function is used to revert back the current backend name.

**Returns**

It returns a string that relates to the current name of the backing being used.

**Example**

**symbolic**

It can be defined as a decorator, which is utilized in TensorFlow 2.0 for entering the Keras graph.

**Arguments**

**func:**It refers to a function that is used to decorate.

**Returns**

It returns a decorated function.

**eager**

It can be defined as a decorator, which is utilized in TensorFlow 2.0 for exiting the Keras graph.

**Arguments**

**func:**It refers to a function that is used to decorate.

**Returns**

It returns a decorated function.

**get_uid**

It provides a unique UID that gives a string prefix.

**Arguments**

**prefix:**It refers to a string.

**Returns**

This backend function returns an integer.

**Example**

This function is used for setting up the manual variable initialization flags. The flag is indicated as a Boolean that governs for a variable to be initialized or the user has to handle the initialization because they are self-instantiated by default.

**Arguments**

**value:**It refers to Python’s Boolean value.

**epsilon**

It is used to return the fuzz factor value, which is being utilized in the numeric expressions.

**Returns**

It returns a float.

**Example**

**reset_uids**

It is used to reset the graph identifiers.

**epsilon**

It outputs a fuzz factor value, which is utilized in the numeric expressions.

**Returns**

It returns a float value.

**Example**

**set_epsilon**

It is used to set the fuzz factor value, which is being used in the numeric expressions.

**Arguments**

**e:** It can be defined as a float value that represents the epsilon’s new value.

**Example**

**floatx**

It is used to output a string of float type, such as ‘float16’, ‘float32’, ‘float64’.

**Returns**

It returns a string of the current default float type.

**Example**

**set_floatx**

It is used to set the default float type value.

**Arguments**

**floatx:**It refers to a string of float type, such as ‘float16’, ‘float32’, or ‘float64’.

**Example**

**Raises**

**ValueError:**Whenever there is an invalid value, then ValueError will be generated.

**cast_to_floatx**

It is used for casting a Numpy array to the default Keras float type.

**Arguments**

**x:**It refers to the Numpy array.

**Returns**

It returns the same Numpy array that is being casted to its new type.

**Example**

**image_data_format**

It is used to returns the default image data format convention.

**Returns**

It returns a string either of ‘channels_first’ or ‘channels_last’

**Example**

**set_image_data_format**

This function is used for setting up the data format convention’s value.

**Arguments**

**data_format:**It can be defined as a string either of ‘channels_first’ or ‘channels_last’.

**Example**

**Raises**

**ValueError:**Whenever there is an invalid data_format value, then it will generate a ValueError.

**learning_phase**

It outputs the flag of a learning phase, which refers to a bool tensor (0 = test, 1 = train) to be passed as an input to any of the Keras function that utilizes a distinct behavior both at training and testing time.

**Returns**

It returns a scalar integer tensor or Python integer of the learning phase.

**set_learning_phase**

It is used to set a fixed value to the learning phase.

**Arguments**

**value:**It can be defined as an integer that represents the learning phase value to be either 0 or 1.

**Raises**

**ValueError:**It is raised if the value is neither 0 nor 1.

**clear_session**

It is used for resetting each and every state that is produced by Keras. The global state that is utilized for the implementation of the Functional model-building API as well as to uniquify auto-generated layer names is handled by Keras.

When multiple models are built in a loop, then an increasing amount of memory over a certain time period will be consumed by the global state, which you will wish to clear it.

It is used for destroying the current graph of Keras and creating a new one. It is very useful as it avoids clutter from old models/layers.

**Example1: calling clear_session() while creating models in a loop.**

**Example2: resetting the layer name generation counter.**

**is_sparse**

It is used to return whether a tensor is a sparse tensor.

**Arguments**

**tensor:**It refers to an instance of tensor.

**Returns**

It returns a Boolean.

**Example**

**to_dense**

It is used in conversion of a sparse tensor to a dense tensor and returns it.

**Arguments**

**tensor:**It refers to an instance of a tensor(potentially sparse).

**Returns**

It returns a dense tensor.

**Example**

**variable**

It helps in instantiating a variable and returning it.

**Arguments**

**value:**It can be defined as a numpy array that represents tensor’s initial value.**dtype:**It refers to the type of a Tensor.**name:**For a tensor it indicates a string name.**constraint:**It refers to an optional projection function that is implemented on the variable after updating an optimizer.

**Returns**

It returns an instance of a variable that comprising of a Keras metadata.

**Example**

**is_variable**

**constant**

It lead to the creation of a unique tensor.

**Arguments**

**value:**It refers to constant value or a list.**dtype:**It refers to the type of a Tensor.**name:**For a tensor it indicates a string name.**shape:**It can be defined as a dimensionality of the resulting tensor, which is an optional.

**Returns**

It also return a unique Tensor.

**is_keras_tensor**

It outputs whether **x** is a Keras tensor or not. A “Keras tensor” is a tensor that was returned by a Keras layer, (**Layer** class) or by **Input**.

**Arguments**

**x:**It refers to a candidate tensor.

**Returns**

It returns a Boolean that represents whether the argument is a Keras tensor or not.

**Raises**

It raises a ValueError if x is not a symbolic tensor.

**Example**

**is_tensor**

**placeholder**

It helps in instantiating a placeholder tensor and returning it.

**Arguments**

**shape:**It can be defined as a tuple integer, which may incorporate**None**entries helps in representing the placeholder’s Shape.**ndim:**It refers to the number of tensor’s axes, which specifies at least one of {**shape**,**ndim**}. The**shape**is used, if both are specified.**dtype:**It defines the type of Placeholder.**sparse:**It can be defined as a Boolean that represents whether or not the placeholder to have a sparse type.**name:**It is an optional argument that defines a string for the placeholder’s name.

**Returns**

It returns an instance of a Tensor by including a Keras metadata.

**Example**

**is_placeholder**

It returns if **x** is a placeholder or not.

**Arguments**

**x:**It can be defined as a candidate placeholder.

**Returns**

It returns a Boolean.

**shape**

It outputs the symbolic shape of a tensor or variable.

**Arguments**

**x:**It refers to a tensor or variable.

**Returns**

It returns a tensor of symbolic shape.

**Examples**

**int_shape**

It can be defined as a tuple of int or None entries that outputs the tensor or a variable’s shape.

**Arguments**

**x:**It refers to either a tensor or variable.

**Returns**

It either returns a tuple of integers or None entries.

**Example**

**Numpy implementation**

**ndim**

It refers to an integer that are returned as number of axes within a tensor.

**Arguments**

**x:**It can be either defined as a tensor or variable.

**Returns**

It outputs the number of axes as an integer value.

**Example**

**Numpy implementation**

**size**

It outputs the tensor size.

**Arguments**

**x:**It can either be defined as a tensor or variable.**name:**It is an optional keyword argument that represents the operation’s name.

**Returns**

It returns the tensor’s size.

**Example**

**dtype**

It can be defined as a string, which is returned as a dtype of a Keras tensor or variable.

**Arguments**

**x:**It can be either defined as a tensor or variable.

**Returns**

For x it returns its dtype.

**Example**

**Numpy implementation**

**eval**

It helps in evaluating tensor value.

**Arguments**

**x:**It can be defined as a tensor.

**Returns**

It outputs a Numpy array.

**Example**

**Numpy implementation**

**zeros**

It helps in instantiation of those variables that are all-zeros followed by returning it.

**Arguments**

**shape:**It can be defined as a tuple of integers that represents the returned Keras variable’s shape.**dtype:**It refers to a string that corresponds to the returned Keras variable’s data type.**name:**It refers to the string that represent the returned Keras variable’s name.

**Returns**

It returns a variable that includes the Keras metadata, which is filled with 0.0. It should be noted that if it is symbolic n shape, then a variable cannot be returned rather a dynamic-shaped tensor will be returned.

**Example**

**Numpy implementation**

**ones**

It helps in Instantiation of an all-ones variable followed by returning it.

**Arguments**

**shape:**It can be defined as a tuple of integers that represents the returned Keras variable’s shape.**dtype:**It refers to a string that corresponds to the returned Keras variable’s data type.**name:**It refers to the string that represent the returned Keras variable’s name.

**Returns**

It returns a Keras variable, which is filled with 0.0. It should be noted that if it is symbolic n shape, then a variable cannot be returned rather a dynamic-shaped tensor will be returned.

**Example**

**Numpy implementation**

**eye**

It helps in the instantiation of an identity matrix followed by returning it.

**Arguments**

**size:**It can be defined either as a tuple defining the number of rows and columns or an integer that represents the number of rows.**dtype:**It refers to a string that corresponds to the returned Keras variable’s data type.**name:**It refers to the string that represent the returned Keras variable’s name.

**Returns**

It outputs a Keras variable that represents an identity matrix.

**Example**

**Numpy implementation**

**zeros_like**

It helps in instantiating the similar shape variable that are all-zeros as another tensor.

**Arguments**

**x:**It can be defined either as Keras variable or Keras tensor.**dtype:**It refers to a string that corresponds to the returned Keras variable’s data type. Here the None relates to the usage of x dtype.**name:**It refers to the string that represent the returned Keras variable’s name.

**Returns**

It returns a variable of Keras filled with all zeros that constitutes a shape of x.

**Example**

**Numpy implementation**

**ones_like**

It helps in instantiating the similar shape variable that are all-ones as another tensor.

**Arguments**

**x:**It can be defined either as Keras variable or Keras tensor.**dtype:**It refers to a string that corresponds to the returned Keras variable’s data type. Here the None relates to the usage of x dtype.**name:**It refers to the string that represent the returned Keras variable’s name.

**Returns**

It returns a variable of Keras filled with all zeros that constitutes a shape of x.

**Example**

**Numpy implementation**

**identity**

It outputs a tensor having a similar content as that of the input tensor.

**Arguments**

**x:**It refers to the input tensor.**name:**It refers to the string that represent the name of the variable, which has to be created.

**Returns**

It returns a tensor that has same shape, type as well as content.

**random_uniform_variable**

It put an emphasis on the instantiation a variable that have its values drawn from a uniform distribution.

**Arguments**

**shape:**It can be defined as a tuple of integers that represents the returned Keras variable’s shape.**low:**It indicates to a float value that represents the output interval’s lower boundary.**high:**It refers to a float value, which represents the output interval’s upper boundary.**dtype:**It refers to a string that corresponds to the returned Keras variable’s data type.**name:**It can be defined as a string that relates to the returned Keras variable’s name.**seed:**It can be defined as an integer that represents a random seed.

**Returns**

It outputs a Keras variable that has been filled with drawn samples.

**Example**

**Numpy implementation**

**random_normal_variable**

It helps in the instantiation of a variable whose values are drawn from a normal distribution.

**Arguments**

**shape:**It can be defined as a tuple of integers that represents the returned Keras variable’s shape**mean:**It refers to a float that represents the mean of the normal distribution.**scale:**It refers to a float that represents the normal distribution’s standard deviation.**dtype:**It can be defined as string that represents the returned Keras variable’s dtype.**name:**It refers to a String that represents the returned Keras variable’s name.**seed:**It refer to an integer that represents the random seed.

**Returns**

It outputs a Keras variable that has been filled with drawn samples.

**Example**

**Numpy implementation**

**count_params**

It outputs the constant number of components residing within a Keras variable or tensor.

**Arguments**

**x:**It refers to a Keras variable or tensor.

**Returns**

It results in an integer, which depicts the total number of elements present in x, i.e., the product of the static dimensions of an array.

**Example**

**Numpy implementation**

**cast**

It helps in casting a tensor to a distinct dtype followed by returning it. In case, if you cast a Keras variable then also it will result in a Keras tensor.

**Arguments**

**x:**It can be defined as Keras tensor or variable.**dtype:**It refers to a string either of ‘**float16**‘, ‘**float32**‘, or ‘**float64**‘.

**Returns**

It output a Keras tensor with dtype **dtype**.

**Example**

**update**

It helps in updating the value of **x** to **new_x**.

**Arguments**

**x:**It refers to a**variable**.**new_x:**It can be defined as a tensor having similar shape as that of**x**.

**Returns**

It results in the updated **x** variable

**update_add**

It adds an **increment**, which helps to update the value of **x**.

**Arguments**

**x:**It refers to a**variable**.**increment:**It can be defined as a tensor having a similar shape as that of**x**.

**Returns**

It returns the updated **x** variable.

**update_sub**

It subtracts the decrement so as to update the value of **x**.

**Arguments**

**x:**It can be defined as a variable.**decrement:**It refers to a tensor that have a similar shape as that of**x**.

**Returns**

It returns the updated **x** variable.

**moving_average_update**

For a variable it computes its moving average.

**Arguments**

**x:**It refers to a variable.**value:**It can be defined as a tensor that have a same shape as that of**x**.**momentum:**It refers to a static average momentum.

**Returns**

It outputs an operation, which is utilized for updating the variable.

**dot**

It returns a tensor by either multiplying 2 tensors or variable.

While multiplying an nD tensor to another nD tensor, a Theano behavior is reproduced. (e.g. (2, 3) * (4, 3, 5) -> (2, 4, 5))

**Arguments**

**x:**It refers to a tensor or variable.**y:**It refers to a tensor or variable.

**Returns**

It returns a tensor, which is produced after undergoing a dot product between x and y.

**Examples**

**Numpy implementation**

**batch_dot**

**batch_dot** is useful in computing batchwise dot product between **x** and **y**, where x and y are data inside batches (i.e. in a shape of **(batch_size, 🙂**). It either outputs a tensor or variable that encompass less dimensions than the input. If we reduce the number of dimensions to 1, then we can use **expand_dims**, which ensure the ndim to be atleast 2.

**Arguments**

**x:**It refers to either the Keras tensor or variable that have ndim greater than or equals to 2.**y:**It refers to the Keras tensor or variable that has ndim greater than or equals to 2.**axes:**It can be defined as an int or tuple(int, int) that puts emphasis on the dimensions of the target to be reduced.

**Returns**

It returns a tensor that has a shape identical to the concatenation of **x**‘s shape and **y**‘s shape (). Here the shape of **x** relates to the less the dimension that was summed over and **y** signifies less the batch dimension and the dimension that was summed over. However, it is reshaped to **(batch_size, 1)** if the final rank is 1.

**Examples**

Assume x = [[1, 2], [3, 4]] and y = [[5, 6], [7, 8]] batch_dot(x, y, axes=1) = [[17], [53]] which is the main diagonal of x.dot(y.T), although we never have to calculate the off-diagonal elements.

Pseudocode:

Shape inference: Let x’s shape be (100, 20) and y’s shape be (100, 30, 20). If axes is (1, 2), to find the output shape of resultant tensor, loop through each dimension in x’s shape and y’s shape:

- shape[0] : 100 : append to output shape
- shape[1] : 20 : do not append to output shape, dimension 1 of x has been summed over. (dot_axes[0] = 1)
- shape[0] : 100 : do not append to output shape, always ignore first dimension of y
- shape[1] : 30 : append to output shape
- shape[2] : 20 : do not append to output shape, dimension 2 of y has been summed over. (dot_axes[1] = 2) output_shape = (100, 30)

**transpose**

It is used to transpose a tensor followed by returning it.

**Arguments**

**x:**It can either be a tensor or variable.

**Returns**

It returns a tensor.

**Examples**

**Numpy implementation**

**gather**

It helps in the retrieval of indices **indices** elements within the **reference** of tensor.

**Arguments**

**reference:**It refers to a tensor.**indices:**It can be defined as an integer that represents the tensor of indices.

**Returns**

It outputs a tensor of same type as that of the **reference**.

**Numpy implementation**

**max**

It calculates tensor’s maximum value.

**Arguments**

**x:**It can be defined as a tensor or variable.**axis:**It refers to an integer or integers list present inside [-rank(x), rank(x)), the axis that is used to compute maximum values. If it is set to**None**(default), then it calculates the maximum overall dimensions.**keepdims:**It is a Boolean that decides either to retain the dimensions or not. If**keepdims**is set to**False**, then tensor’s rank will be reduced by 1. Else if keepdims is set to**True**, then the reduced dimension will be preserved with length 1.

**Returns**

It returns a tensor that represents the maximum values of x.

**Numpy implementation**

**min**

It computes the minimum value inside a tensor.

**Arguments**

**x:**It can be defined as a tensor or variable.**axis:**It refers to an integer or integers list present inside [-rank(x), rank(x)), the axis that is used to compute minimum values. If it is set to**None**(default), then it calculates the minimum overall dimensions.**keepdims:**It is a Boolean that decides either to retain the dimensions or not. If**keepdims**is set to**False**, then tensor’s rank will be reduced by 1. Else if keepdims is set to**True**, then the reduced dimension will be preserved with length 1.

**Returns**

It returns a tensor that represents the minimum values of x.

**Numpy implementation**

**sum**

It outputs the summation of values within a tensor, along with the specified axis.

**Arguments**

**x:**It can be defined as a tensor or variable.**axis:**It refers to an integer or integers list present inside [-rank(x), rank(x)), the axis that is used to compute the sum. If it is set to**None**(default), then it calculates the sum overall dimensions.**keepdims:**It is a Boolean that decides either to retain the dimensions or not. If**keepdims**is set to**False**, then tensor’s rank will be reduced by 1. Else if keepdims is set to**True**, then the reduced dimension will be preserved with length 1.

**Returns**

It returns a tensor encompassing sum of **x**.

**Numpy implementation**

**prod**

In conjunction with the specific axis, it computes the multiplication of values inside a tensor.

**Arguments**

**x:**It can be defined as a tensor or variable.**axis:**It refers to an integer or integers list present inside [-rank(x), rank(x)), the axis that is used to compute the product. If it is set to**None**(default), then it calculates the overall product dimensions.**keepdims:**It is a Boolean that decides either to retain the dimensions or not. If**keepdims**is set to**False**, then tensor’s rank will be reduced by 1. Else if keepdims is set to**True**, then the reduced dimension will be preserved with length 1.

**Returns**

It returns a tensor encompassing product of elements within the **x**.

**Numpy implementation**

**cumsum**

In conjunction with the specific axis, it computes the cumulative sum of values inside a tensor.

**Arguments**

**x:**It can be defined as a tensor or variable.**axis:**It refers to an integer, which is the axis that is used to compute the sum.

**Returns**

It returns a tensor encompassing the cumulative sum of values of **x** along an **axis**.

**Numpy implementation**

**cumprod**

In conjunction with the specific axis, it computes the cumulative product of values inside a tensor.

**Arguments**

**x:**It can be defined as a tensor or variable.**axis:**It refers to an integer, which is the axis that is used to compute the product.

**Returns**

It returns a tensor encompassing cumulative product of values of **x** along **an axis**.

**Numpy implementation**

**var**

In conjunction with the specific axis, it computes the tensor’s variance.

**Arguments**

**x:**It can be defined as a tensor or variable.**axis:**It refers to an integer or integers list present inside [-rank(x), rank(x)), the axis that is used to compute the variance. If it is set to**None**(default), then it calculates the overall variance dimensions.**keepdims:**It is a Boolean that decides either to retain the dimensions or not. If**keepdims**is set to**False**, then tensor’s rank will be reduced by 1. Else if keepdims is set to**True**, then the reduced dimension will be preserved with length 1.

**Returns**

It returns tensor’s variance of elements residing in **x**.

**Numpy implementation**

**rnn**

It is useful for reiterating above the tensor dimension.

**Arguments**

**step_function:**It is known as RNN step function. It includes the following argument that is given below:**input:**It includes a tensor having a shape of**(samples, …)**that represent batch sample’s input at a particular time step. It does not include the time dimension.**states:**It can be defined as a tensor’s list.**new_states:**It can be defined as a list of tensor that constitutes the same shape as well as length as that of the states, such that the initial state has to be the output tensor of the previous timestep in the list.

**Returns**

It outputs a tensor of shape **(samples, output_dim)**

**inputs:**It either refers to a tensor of temporal data to be atleast three-dimensional that constitute a shape of**(samples, time, …)**or a nested tensor, such that each has a shape of**(samples, time, …)**.**initial_states:**It can be defined as a tensor of shape**(samples, state_size)**that encompass the state’s initial values to be utilized in the step function. When the state_size has a nested shape, then the nested structure will also be followed by the initial_states.**go_backwards:**It can be defined as a Boolean, and if it set to True, then an interation will be performed above the time dimension in a reverse order followed by returning a reversed sequence.**mask:**It refers to a binary tenor having a shape of**(samples, time, 1)**including a zero each and every element that has been masked.**constants:**It can be defined as a constant values list, which is distributed at every single step.**unroll:**It illustrates if the RNN should be unrolled or a symbolic while-loop to be used.**input_length:**It can be defined as an integer or one-dimensional tensor based on the time dimension if it has fixed length or not. If it is set to variable-length input when there is no specified mask, then it will be used for masking.**time_major:**It can be defined as a Boolean. If it set to**true**, then the shape of input as well output will be**(timesteps batch, …)**, else**(batch, timesteps, …)**if set to**false**. To use**time_major = True**is quite an efficient task as transpose is avoided at the commencement as well as the culmination of RNN calculation. But, mostly, the TensorFlow data exists batch-major due to which, by default, this function accepts input and emits output in the form of batch-major.**zero_output_for_mask:**It refers to a Boolean for which if it is set to true, then it will masked timestep output will be zeros, else the previous step output will be returned.

**Returns**

It returns a tuple of shape **(last_output, outputs, new_states)**, where last_output relates to rnn’s most recent output consisting a shape of **(samples, …)**, outputs refer to a tensor of shape **(samples, time, …)**, such that each entry **outputs[s, t]** corresponds to the step function’s output for sample **s** and time **t** and new_states can be defined as a tensor list that represents the newest states, which are reverted by the step function of shape encompassing a shape of **(samples, …)**.

**Raises**

**ValueError:**A value error is generated if the dimension of input is less than 3.**ValueError:**It can also be raised in case if**unroll**is set to**True**, whereas input timestep isn’t a static number.**ValueError:**In case if the**mask**is provided but is not set to**None**and state isn’t provided (i.e.,**len(states) ==0**), then it is also generated.