Ensuring SavedModel is in inference mode
Hi @p3achyjr ,

Apologies for the delayed response. If the model uses dropout or another technique in which the forward pass differs between training and inference (like batch normalization), the `__call__` method takes an optional, Python-valued `training=` argument that `defaults to False` but `can be set to True`

You can use ExportArchive to write SavedModel artifacts (e.g. for inference or for training). Please refer an attached example [here](https://www.tensorflow.org/api_docs/python/tf/keras/export/ExportArchive).

Thanks!

 Sorry about the delay on all my issues. Thanks for getting back, this is really helpful :) Are you satisfied with the resolution of your issue?
<a href="https://docs.google.com/forms/d/e/1FAIpQLSfaP12TRhd9xSxjXZjcZFNXPGk4kc1-qMdv3gc6bEP90vY1ew/viewform?entry.85265664=Yes&entry.2137816233=https://github.com/tensorflow/tensorflow/issues/60855">Yes</a>
<a href="https://docs.google.com/forms/d/e/1FAIpQLSfaP12TRhd9xSxjXZjcZFNXPGk4kc1-qMdv3gc6bEP90vY1ew/viewform?entry.85265664=No&entry.2137816233=https://github.com/tensorflow/tensorflow/issues/60855">No</a>

<details><summary>Click to expand!</summary> 
 
 ### Issue Type

Support

### Have you reproduced the bug with TF nightly?

Yes

### Source

source

### Tensorflow Version

2.11

### Custom Code

Yes

### OS Platform and Distribution

Debian GNU/Linux 10

### Mobile device

_No response_

### Python version

3.7

### Bazel version

_No response_

### GCC/Compiler version

9

### CUDA/cuDNN version

_No response_

### GPU model and memory

_No response_

### Current Behaviour?

I am saving a model via `model.save` from Keras, then later loading the graph in C++ and running inference through it.

How can I ensure that the graph is in inference mode? In C++, I can only invoke the graph via feed and fetch names, and there is no feed name for the `is_training` parameter. This is important for batchnorm.

I've copied the output from `saved_model_cli` below.

### Standalone code to reproduce the issue

```shell
signature_def['__saved_model_init_op']:
  The given SavedModel SignatureDef contains the following input(s):
  The given SavedModel SignatureDef contains the following output(s):
    outputs['__saved_model_init_op'] tensor_info:
        dtype: DT_INVALID
        shape: unknown_rank
        name: NoOp
  Method name is:

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['args_0'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 19, 19, 7)
        name: serving_default_args_0:0
    inputs['args_1'] tensor_info:
        dtype: DT_HALF
        shape: (-1, 1)
        name: serving_default_args_1:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['output_1'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 362)
        name: StatefulPartitionedCall:0
    outputs['output_2'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 2)
        name: StatefulPartitionedCall:1
    outputs['output_3'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 19, 19, 1)
        name: StatefulPartitionedCall:2
    outputs['output_4'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 800)
        name: StatefulPartitionedCall:3
    outputs['output_5'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: StatefulPartitionedCall:4
  Method name is: tensorflow/serving/predict

Concrete Functions:
  Function Name: '__call__'
    Option #1
      Callable with:
        Argument #1
          board_state: TensorSpec(shape=(None, 19, 19, 7), dtype=tf.float32, name='board_state')
        Argument #2
          game_state: TensorSpec(shape=(None, 1), dtype=tf.float16, name='game_state')
        Argument #3
          DType: bool
          Value: True
    Option #2
      Callable with:
        Argument #1
          board_state: TensorSpec(shape=(None, 19, 19, 7), dtype=tf.float32, name='board_state')
        Argument #2
          game_state: TensorSpec(shape=(None, 1), dtype=tf.float16, name='game_state')
        Argument #3
          DType: bool
          Value: False

  Function Name: '_default_save_signature'
    Option #1
      Callable with:
        Argument #1
          args_0: TensorSpec(shape=(None, 19, 19, 7), dtype=tf.float32, name='args_0')
        Argument #2
          args_1: TensorSpec(shape=(None, 1), dtype=tf.float16, name='args_1')

  Function Name: 'call_and_return_all_conditional_losses'
    Option #1
      Callable with:
        Argument #1
          board_state: TensorSpec(shape=(None, 19, 19, 7), dtype=tf.float32, name='board_state')
        Argument #2
          game_state: TensorSpec(shape=(None, 1), dtype=tf.float16, name='game_state')
        Argument #3
          DType: bool
          Value: False
    Option #2
      Callable with:
        Argument #1
          board_state: TensorSpec(shape=(None, 19, 19, 7), dtype=tf.float32, name='board_state')
        Argument #2
          game_state: TensorSpec(shape=(None, 1), dtype=tf.float16, name='game_state')
        Argument #3
          DType: bool
          Value: True

  Function Name: 'infer_float'
    Option #1
      Callable with:
        Argument #1
          board_state: TensorSpec(shape=(None, 19, 19, 7), dtype=tf.float32, name='board_state')
        Argument #2
          game_state: TensorSpec(shape=(None, 1), dtype=tf.float32, name='game_state')

  Function Name: 'infer_mixed'
    Option #1
      Callable with:
        Argument #1
          board_state: TensorSpec(shape=(None, 19, 19, 7), dtype=tf.float16, name='board_state')
        Argument #2
          game_state: TensorSpec(shape=(None, 1), dtype=tf.float16, name='game_state')
```


### Relevant log output

_No response_</details>