# Keras Backend

## Overview

Keras is a model-level library, providing high-level building blocks for developing deep learning models. It does not handle itself low-level operations such as tensor products, convolutions and so on. Instead, it relies on a specialized, well-optimized tensor manipulation library to do so, serving as the “backend engine” of Keras.

The R interface to Keras uses TensorFlow™ as it’s default tensor backend engine, however it’s possible to use other backends if desired. At this time, Keras has three backend implementations available:

- TensorFlow is an open-source symbolic tensor manipulation framework developed by Google.

- Theano is an open-source symbolic tensor manipulation framework developed by LISA Lab at Université de Montréal.

- CNTK is an open-source toolkit for deep learning developed by Microsoft.

## Selecting a Backend

Keras uses the TensorFlow backend by default. If you want to switch to Theano or CNTK call the `use_backend()` function just after your call to `library(keras)`. For example:

    library(keras)
    use_backend("theano")

If you want to use the CNTK backend then you should follow the installation instructions for CNTK and then speicfy “cntk” in your call to `use_backend()`:

    library(keras)
    use_backend("cntk")

## Selecting an Implementation

Keras specifies an API that can be implemented by multiple providers. By default, the Keras R package uses the implementation provided by the Keras Python package (“keras”). TensorFlow also provides an integrated implementation of Keras which you can use by specifying “tensorflow” in a call to the `use_implementation()` function. For example:

    library(keras)
    use_implementation("tensorflow")

You would typically specify the “tensorflow” implementation when using Keras with the tfestimators package, as this implementation allows you to use Keras models seamlessly as TensorFlow Estimators.

### Keras Configuration File

If you have run Keras at least once, you will find the Keras configuration file at:

`~/.keras/keras.json`

If it isn’t there, you can create it.

The default configuration file looks like this:

    {
        "image_data_format": "channels_last",
        "epsilon": 1e-07,
        "floatx": "float32",
        "backend": "tensorflow"
    }

You can change these settings by editing `$HOME/.keras/keras.json`.

- `image_data_format`: String, either `"channels_last"` or `"channels_first"`. It specifies which data format convention Keras will follow. (`backend()$image_data_format()` returns it.)
  - For 2D data (e.g. image), `"channels_last"` assumes `(rows, cols, channels)` while `"channels_first"` assumes `(channels, rows, cols)`.
  - For 3D data, `"channels_last"` assumes `(conv_dim1, conv_dim2, conv_dim3, channels)` while `"channels_first"` assumes `(channels, conv_dim1, conv_dim2, conv_dim3)`.
- `epsilon`: Float, a numeric fuzzing constant used to avoid dividing by zero in some operations.
- `floatx`: String, `"float16"`, `"float32"`, or `"float64"`. Default float precision.
- `backend`: String, `"tensorflow"`, `"theano"`, or `"cntk"`.

## Using the Backend

If you want the Keras modules you write to be compatible with all available backends, you have to write them via the abstract Keras backend API. Backend API functions have a `k_` prefix (e.g. `k_placeholder`, `k_constant`, `k_dot`, etc.).

For example, the code below instantiates an input placeholder. It’s equivalent to `tf$placeholder()`:

    library(keras)
    inputs <- k_placeholder(shape = c(2, 4, 5))
    # also works:
    inputs <-  k_placeholder(shape = list(NULL, 4, 5))
    # also works:
    inputs <- k_placeholder(ndim = 3)

The code below instantiates a variable. It’s equivalent to `tf$Variable()`:

    val <- array(runif(60), dim = c(3L, 4L, 5L))
    var <- k_variable(value = val)

    # all-zeros variable:
    var <- k_zeros(shape = c(3, 4, 5))
    # all-ones:
    var <- k_ones(shape = c(3, 4, 5))

## Backend Functions

`k_abs` | Element-wise absolute value.
`k_all` | Bitwise reduction (logical AND).
`k_any` | Bitwise reduction (logical OR).
`k_arange` | Creates a 1D tensor containing a sequence of integers.
`k_argmax` | Returns the index of the maximum value along an axis.
`k_argmin` | Returns the index of the minimum value along an axis.
`k_backend` | Active Keras backend
`k_batch_dot` | Batchwise dot product.
`k_batch_flatten` | Turn a nD tensor into a 2D tensor with same 1st dimension.
`k_batch_get_value` | Returns the value of more than one tensor variable.
`k_batch_normalization` | Applies batch normalization on x given mean, var, beta and gamma.
`k_batch_set_value` | Sets the values of many tensor variables at once.
`k_bias_add` | Adds a bias vector to a tensor.
`k_binary_crossentropy` | Binary crossentropy between an output tensor and a target tensor.
`k_cast_to_floatx` | Cast an array to the default Keras float type.
`k_cast` | Casts a tensor to a different dtype and returns it.
`k_categorical_crossentropy` | Categorical crossentropy between an output tensor and a target tensor.
`k_clear_session` | Destroys the current TF graph and creates a new one.
`k_clip` | Element-wise value clipping.
`k_concatenate` | Concatenates a list of tensors alongside the specified axis.
`k_constant` | Creates a constant tensor.
`k_conv1d` | 1D convolution.
`k_conv2d_transpose` | 2D deconvolution (i.e. transposed convolution).
`k_conv2d` | 2D convolution.
`k_conv3d_transpose` | 3D deconvolution (i.e. transposed convolution).
`k_conv3d` | 3D convolution.
`k_cos` | Computes cos of x element-wise.
`k_count_params` | Returns the static number of elements in a Keras variable or tensor.
`k_ctc_batch_cost` | Runs CTC loss algorithm on each batch element.
`k_ctc_decode` | Decodes the output of a softmax.
`k_ctc_label_dense_to_sparse` | Converts CTC labels from dense to sparse.
`k_cumprod` | Cumulative product of the values in a tensor, alongside the specified axis.
`k_cumsum` | Cumulative sum of the values in a tensor, alongside the specified axis.
`k_depthwise_conv2d` | 2D convolution with separable filters.
`k_dot` | Multiplies 2 tensors (and/or variables) and returns a tensor.
`k_dropout` | Sets entries in `x` to zero at random, while scaling the entire tensor.
`k_dtype` | Returns the dtype of a Keras tensor or variable, as a string.
`k_elu` | Exponential linear unit.
`k_epsilon` `k_set_epsilon` | Fuzz factor used in numeric expressions.
`k_equal` | Element-wise equality between two tensors.
`k_eval` | Evaluates the value of a variable.
`k_exp` | Element-wise exponential.
`k_expand_dims` | Adds a 1-sized dimension at index “axis”.
`k_eye` | Instantiate an identity matrix and returns it.
`k_flatten` | Flatten a tensor.
`k_floatx` `k_set_floatx` | Default float type
`k_foldl` | Reduce elems using fn to combine them from left to right.
`k_foldr` | Reduce elems using fn to combine them from right to left.
`k_function` | Instantiates a Keras function
`k_gather` | Retrieves the elements of indices `indices` in the tensor `reference`.
`k_get_session` `k_set_session` | TF session to be used by the backend.
`k_get_uid` | Get the uid for the default graph.
`k_get_value` | Returns the value of a variable.
`k_get_variable_shape` | Returns the shape of a variable.
`k_gradients` | Returns the gradients of `variables` w.r.t. `loss`.
`k_greater_equal` | Element-wise truth value of (x >= y).
`k_greater` | Element-wise truth value of (x > y).
`k_hard_sigmoid` | Segment-wise linear approximation of sigmoid.
`k_identity` | Returns a tensor with the same content as the input tensor.
`k_image_data_format` `k_set_image_data_format` | Default image data format convention (‘channels_first’ or ‘channels_last’).
`k_in_test_phase` | Selects `x` in test phase, and `alt` otherwise.
`k_in_top_k` | Returns whether the `targets` are in the top `k` `predictions`.
`k_in_train_phase` | Selects `x` in train phase, and `alt` otherwise.
`k_int_shape` | Returns the shape of tensor or variable as a list of int or NULL entries.
`k_is_tensor` | Returns whether `x` is a symbolic tensor.
`k_is_keras_tensor` | Returns whether `x` is a Keras tensor.
`k_is_placeholder` | Returns whether `x` is a placeholder.
`k_is_sparse` | Returns whether a tensor is a sparse tensor.
`k_l2_normalize` | Normalizes a tensor wrt the L2 norm alongside the specified axis.
`k_learning_phase` | Returns the learning phase flag.
`k_less_equal` | Element-wise truth value of (x <= y).
`k_less` | Element-wise truth value of (x < y).
`k_local_conv1d` | Apply 1D conv with un-shared weights.
`k_local_conv2d` | Apply 2D conv with un-shared weights.
`k_log` | Element-wise log.
`k_logsumexp` | Computes log(sum(exp(elements across dimensions of a tensor))).
`k_manual_variable_initialization` | Sets the manual variable initialization flag.
`k_map_fn` | Map the function fn over the elements elems and return the outputs.
`k_max` | Maximum value in a tensor.
`k_maximum` | Element-wise maximum of two tensors.
`k_mean` | Mean of a tensor, alongside the specified axis.
`k_min` | Minimum value in a tensor.
`k_minimum` | Element-wise minimum of two tensors.
`k_moving_average_update` | Compute the moving average of a variable.
`k_ndim` | Returns the number of axes in a tensor, as an integer.
`k_normalize_batch_in_training` | Computes mean and std for batch then apply batch_normalization on batch.
`k_not_equal` | Element-wise inequality between two tensors.
`k_one_hot` | Computes the one-hot representation of an integer tensor.
`k_ones_like` | Instantiates an all-ones variable of the same shape as another tensor.
`k_ones` | Instantiates an all-ones tensor variable and returns it.
`k_permute_dimensions` | Permutes axes in a tensor.
`k_placeholder` | Instantiates a placeholder tensor and returns it.
`k_pool2d` | 2D Pooling.
`k_pool3d` | 3D Pooling.
`k_pow` | Element-wise exponentiation.
`k_print_tensor` | Prints `message` and the tensor value when evaluated.
`k_prod` | Multiplies the values in a tensor, alongside the specified axis.
`k_random_binomial` | Returns a tensor with random binomial distribution of values.
`k_random_normal_variable` | Instantiates a variable with values drawn from a normal distribution.
`k_random_normal` | Returns a tensor with normal distribution of values.
`k_random_uniform_variable` | Instantiates a variable with values drawn from a uniform distribution.
`k_random_uniform` | Returns a tensor with uniform distribution of values.
`k_relu` | Rectified linear unit.
`k_repeat_elements` | Repeats the elements of a tensor along an axis.
`k_repeat` | Repeats a 2D tensor.
`k_reset_uids` | Reset graph identifiers.
`k_reshape` | Reshapes a tensor to the specified shape.
`k_resize_images` | Resizes the images contained in a 4D tensor.
`k_resize_volumes` | Resizes the volume contained in a 5D tensor.
`k_reverse` | Reverse a tensor along the specified axes.
`k_rnn` | Iterates over the time dimension of a tensor
`k_round` | Element-wise rounding to the closest integer.
`k_separable_conv2d` | 2D convolution with separable filters.
`k_set_learning_phase` | Sets the learning phase to a fixed value.
`k_set_value` | Sets the value of a variable, from an R array.
`k_shape` | Returns the symbolic shape of a tensor or variable.
`k_sigmoid` | Element-wise sigmoid.
`k_sign` | Element-wise sign.
`k_sin` | Computes sin of x element-wise.
`k_softmax` | Softmax of a tensor.
`k_softplus` | Softplus of a tensor.
`k_softsign` | Softsign of a tensor.
`k_sparse_categorical_crossentropy` | Categorical crossentropy with integer targets.
`k_spatial_2d_padding` | Pads the 2nd and 3rd dimensions of a 4D tensor.
`k_spatial_3d_padding` | Pads 5D tensor with zeros along the depth, height, width dimensions.
`k_sqrt` | Element-wise square root.
`k_square` | Element-wise square.
`k_squeeze` | Removes a 1-dimension from the tensor at index “axis”.
`k_stack` | Stacks a list of rank `R` tensors into a rank `R+1` tensor.
`k_std` | Standard deviation of a tensor, alongside the specified axis.
`k_stop_gradient` | Returns `variables` but with zero gradient w.r.t. every other variable.
`k_sum` | Sum of the values in a tensor, alongside the specified axis.
`k_switch` | Switches between two operations depending on a scalar value.
`k_tanh` | Element-wise tanh.
`k_temporal_padding` | Pads the middle dimension of a 3D tensor.
`k_tile` | Creates a tensor by tiling `x` by `n`.
`k_to_dense` | Converts a sparse tensor into a dense tensor and returns it.
`k_transpose` | Transposes a tensor and returns it.
`k_truncated_normal` | Returns a tensor with truncated random normal distribution of values.
`k_update_add` | Update the value of `x` by adding `increment`.
`k_update_sub` | Update the value of `x` by subtracting `decrement`.
`k_update` | Update the value of `x` to `new_x`.
`k_var` | Variance of a tensor, alongside the specified axis.
`k_variable` | Instantiates a variable and returns it.
`k_zeros_like` | Instantiates an all-zeros variable of the same shape as another tensor.
`k_zeros` | Instantiates an all-zeros variable and returns it.