# tf.contrib.cudnn_rnn.CudnnCompatibleGRUCell

|---|
| [![](https://www.tensorflow.org/images/GitHub-Mark-32px.png) View source on GitHub](https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/contrib/cudnn_rnn/python/ops/cudnn_rnn_ops.py#L81-L180) |

Cudnn Compatible GRUCell.

Inherits From: [`GRUCell`](https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/nn/rnn_cell/GRUCell)

    tf.contrib.cudnn_rnn.CudnnCompatibleGRUCell(
        num_units, reuse=None, kernel_initializer=None
    )

A GRU impl akin to [`tf.compat.v1.nn.rnn_cell.GRUCell`](https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/nn/rnn_cell/GRUCell) to use along with
[`tf.contrib.cudnn_rnn.CudnnGRU`](https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/cudnn_rnn/CudnnGRU). The latter's params can be used by
it seamlessly.

It differs from platform-independent GRUs in how the new memory gate is
calculated. Nvidia picks this variant based on GRU author's\[1\] suggestion and
the fact it has no accuracy impact\[2\].
\[1\] <https://arxiv.org/abs/1406.1078>
\[2\] <http://svail.github.io/diff_graphs/>

Cudnn compatible GRU (from Cudnn library user guide):

    # reset gate


    <div> $$r_t = \sigma(x_t * W_r + h_t-1 * R_h + b_{Wr} + b_{Rr})$$ </div>


    # update gate


    <div> $$u_t = \sigma(x_t * W_u + h_t-1 * R_u + b_{Wu} + b_{Ru})$$ </div>


    # new memory gate


    <div> $$h'_t = tanh(x_t * W_h + r_t .* (h_t-1 * R_h + b_{Rh}) + b_{Wh})$$ </div>




    <div> $$h_t = (1 - u_t) .* h'_t + u_t .* h_t-1$$ </div>


Other GRU (see [`tf.compat.v1.nn.rnn_cell.GRUCell`](https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/nn/rnn_cell/GRUCell) and
[`tf.contrib.rnn.GRUBlockCell`](https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/rnn/GRUBlockCell)):

    # new memory gate
    \\(h'_t = tanh(x_t * W_h + (r_t .* h_t-1) * R_h + b_{Wh})\\)

which is not equivalent to Cudnn GRU: in addition to the extra bias term b_Rh,

    \\(r .* (h * R) != (r .* h) * R\\)

<br />

<br />

<br />

| ## Attributes ||
|---|---|
| `graph` | DEPRECATED FUNCTION <br /> > [!WARNING] > **Warning:** THIS FUNCTION IS DEPRECATED. It will be removed in a future version. Instructions for updating: Stop using this property because tf.layers layers no longer track their graph. |
| `output_size` | Integer or TensorShape: size of outputs produced by this cell. |
| `scope_name` | <br /> |
| `state_size` | size(s) of state(s) used by this cell. <br /> It can be represented by an Integer, a TensorShape or a tuple of Integers or TensorShapes. |

<br />

## Methods

### `get_initial_state`

[View source](https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/ops/rnn_cell_impl.py#L281-L309)

    get_initial_state(
        inputs=None, batch_size=None, dtype=None
    )

### `zero_state`

[View source](https://github.com/tensorflow/tensorflow/blob/v1.15.0/tensorflow/python/ops/rnn_cell_impl.py#L311-L340)

    zero_state(
        batch_size, dtype
    )

Return zero-filled state tensor(s).

<br />

<br />

<br />

| Args ||
|---|---|
| `batch_size` | int, float, or unit Tensor representing the batch size. |
| `dtype` | the data type to use for the state. |

<br />

<br />

<br />

<br />

| Returns ||
|---|---|
| If `state_size` is an int or TensorShape, then the return value is a `N-D` tensor of shape `[batch_size, state_size]` filled with zeros. <br /> If `state_size` is a nested list or tuple, then the return value is a nested list or tuple (of the same structure) of `2-D` tensors with the shapes `[batch_size, s]` for each s in `state_size`. ||

<br />