# tf_agents.keras_layers.InnerReshape

<br />

|---|
| [![](https://www.tensorflow.org/images/GitHub-Mark-32px.png) View source on GitHub](https://github.com/tensorflow/agents/blob/v0.19.0/tf_agents/keras_layers/inner_reshape.py#L25-L99) |

Returns a Keras layer that reshapes the inner dimensions of tensors.

#### View aliases


**Main aliases**

[`tf_agents.keras_layers.inner_reshape.InnerReshape`](https://www.tensorflow.org/agents/api_docs/python/tf_agents/keras_layers/InnerReshape)

<br />

    tf_agents.keras_layers.InnerReshape(
        current_shape: https://www.tensorflow.org/agents/api_docs/python/tf_agents/typing/types/Shape,
        new_shape: https://www.tensorflow.org/agents/api_docs/python/tf_agents/typing/types/Shape,
        **kwargs
    ) -> tf.keras.layers.Layer

Each tensor passed to an instance of `InnerReshape`, will be reshaped to:

    shape(tensor)[:-len(current_shape)] + new_shape

(after its inner shape is validated against `current_shape`). Note:
The `current_shape` may contain `None` (unknown) dimension values.

This can be helpful when switching between `Dense`, `ConvXd`, and `RNN` layers
in TF-Agents networks, in ways that are agnostic to whether the input has
either `[batch_size]` or `[batch_size, time]` outer dimensions.

For example, to switch between `Dense`, `Conv2D`, and `GRU` layers:

    net = tf_agents.networks.Sequential([
      tf.keras.layers.Dense(32),
      # Convert inner dim from [32] to [4, 4, 2] for Conv2D.
      tf_agents.keras_layers.InnerReshape([None], new_shape=[4, 4, 2]),
      tf.keras.layers.Conv2D(2, 3),
      # Convert inner HWC dims [?, ?, 2] to [8] for Dense/RNN.
      tf_agents.keras_layers.InnerReshape([None, None, 2], new_shape=[-1]),
      tf.keras.layers.GRU(2, return_state=True, return_sequences=True)
    ])

<br />

<br />

<br />

| ## Args ||
|---|---|
| `current_shape` | The current (partial) shape for the inner dims. This should be a `list`, `tuple`, or [`tf.TensorShape`](https://www.tensorflow.org/api_docs/python/tf/TensorShape) with known rank. The given current_shape must be compatible with the inner shape of the input. Examples - `[]`, `[None]`, `[None] * 3`, `[3, 3, 4]`, `[3, None, 4]`. |
| `new_shape` | The new shape for the inner dims. The length of `new_shape` need not match the length of `current_shape`, but if both shapes are fully defined then the total number of elements must match. It may have up to one flexible (`-1`) dimension. Examples - `[3]`, `[]`, `[-1]`, `[-1, 3]`. |
| `**kwargs` | Additionnal args to the Keras core layer constructor, e.g. `name`. |

<br />

<br />

<br />

<br />

| ## Returns ||
|---|---|
| A new Keras `Layer` that performs the requested reshape on incoming tensors. ||

<br />

<br />

<br />

<br />

| ## Raises ||
|---|---|
| `ValueError` | If `current_shape` has unknown rank. |
| `ValueError` | If both shapes are fully defined and the number of elements doesn't match. |

<br />