Add support for customizing gesture recognizer layers
PiperOrigin-RevId: 496456160
This commit is contained in:
		
							parent
							
								
									4822476974
								
							
						
					
					
						commit
						3e6cd5d2bf
					
				| 
						 | 
				
			
			@ -173,15 +173,20 @@ class GestureRecognizer(classifier.Classifier):
 | 
			
		|||
        batch_size=None,
 | 
			
		||||
        dtype=tf.float32,
 | 
			
		||||
        name='hand_embedding')
 | 
			
		||||
 | 
			
		||||
    x = tf.keras.layers.BatchNormalization()(inputs)
 | 
			
		||||
    x = tf.keras.layers.ReLU()(x)
 | 
			
		||||
    x = inputs
 | 
			
		||||
    dropout_rate = self._model_options.dropout_rate
 | 
			
		||||
    x = tf.keras.layers.Dropout(rate=dropout_rate, name='dropout')(x)
 | 
			
		||||
    for i, width in enumerate(self._model_options.layer_widths):
 | 
			
		||||
      x = tf.keras.layers.BatchNormalization()(x)
 | 
			
		||||
      x = tf.keras.layers.ReLU()(x)
 | 
			
		||||
      x = tf.keras.layers.Dropout(rate=dropout_rate)(x)
 | 
			
		||||
      x = tf.keras.layers.Dense(width, name=f'custom_gesture_recognizer_{i}')(x)
 | 
			
		||||
    x = tf.keras.layers.BatchNormalization()(x)
 | 
			
		||||
    x = tf.keras.layers.ReLU()(x)
 | 
			
		||||
    x = tf.keras.layers.Dropout(rate=dropout_rate)(x)
 | 
			
		||||
    outputs = tf.keras.layers.Dense(
 | 
			
		||||
        self._num_classes,
 | 
			
		||||
        activation='softmax',
 | 
			
		||||
        name='custom_gesture_recognizer')(
 | 
			
		||||
        name='custom_gesture_recognizer_out')(
 | 
			
		||||
            x)
 | 
			
		||||
 | 
			
		||||
    self._model = tf.keras.Model(inputs=inputs, outputs=outputs)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,6 +60,32 @@ class GestureRecognizerTest(tf.test.TestCase):
 | 
			
		|||
 | 
			
		||||
    self._test_accuracy(model)
 | 
			
		||||
 | 
			
		||||
  @unittest_mock.patch.object(
 | 
			
		||||
      tf.keras.layers, 'Dense', wraps=tf.keras.layers.Dense)
 | 
			
		||||
  def test_gesture_recognizer_model_layer_widths(self, mock_dense):
 | 
			
		||||
    layer_widths = [64, 32]
 | 
			
		||||
    model_options = gesture_recognizer.ModelOptions(layer_widths=layer_widths)
 | 
			
		||||
    hparams = gesture_recognizer.HParams(
 | 
			
		||||
        export_dir=tempfile.mkdtemp(), epochs=2)
 | 
			
		||||
    gesture_recognizer_options = gesture_recognizer.GestureRecognizerOptions(
 | 
			
		||||
        model_options=model_options, hparams=hparams)
 | 
			
		||||
    model = gesture_recognizer.GestureRecognizer.create(
 | 
			
		||||
        train_data=self._train_data,
 | 
			
		||||
        validation_data=self._validation_data,
 | 
			
		||||
        options=gesture_recognizer_options)
 | 
			
		||||
    expected_calls = [
 | 
			
		||||
        unittest_mock.call(w, name=f'custom_gesture_recognizer_{i}')
 | 
			
		||||
        for i, w in enumerate(layer_widths)
 | 
			
		||||
    ]
 | 
			
		||||
    expected_calls.append(
 | 
			
		||||
        unittest_mock.call(
 | 
			
		||||
            len(self._train_data.label_names),
 | 
			
		||||
            activation='softmax',
 | 
			
		||||
            name='custom_gesture_recognizer_out'))
 | 
			
		||||
    self.assertLen(mock_dense.call_args_list, len(expected_calls))
 | 
			
		||||
    mock_dense.assert_has_calls(expected_calls)
 | 
			
		||||
    self._test_accuracy(model)
 | 
			
		||||
 | 
			
		||||
  def test_export_gesture_recognizer_model(self):
 | 
			
		||||
    model_options = gesture_recognizer.ModelOptions()
 | 
			
		||||
    hparams = gesture_recognizer.HParams(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,7 @@
 | 
			
		|||
"""Configurable model options for gesture recognizer models."""
 | 
			
		||||
 | 
			
		||||
import dataclasses
 | 
			
		||||
from typing import List
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@dataclasses.dataclass
 | 
			
		||||
| 
						 | 
				
			
			@ -23,5 +24,10 @@ class GestureRecognizerModelOptions:
 | 
			
		|||
  Attributes:
 | 
			
		||||
    dropout_rate: The fraction of the input units to drop, used in dropout
 | 
			
		||||
      layer.
 | 
			
		||||
    layer_widths: A list of hidden layer widths for the gesture model. Each
 | 
			
		||||
      element in the list will create a new hidden layer with the specified
 | 
			
		||||
      width. The hidden layers are separated with BatchNorm, Dropout, and ReLU.
 | 
			
		||||
      Defaults to an empty list(no hidden layers).
 | 
			
		||||
  """
 | 
			
		||||
  dropout_rate: float = 0.05
 | 
			
		||||
  layer_widths: List[int] = dataclasses.field(default_factory=list)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user