def testFailsOnNonIdentityTranslator(self): component_spec = spec_pb2.ComponentSpec() text_format.Parse(""" name: "test" network_unit { registered_name: "IdentityNetwork" } linked_feature { name: "features" embedding_dim: -1 size: 1 source_translator: "history" source_component: "mock" } """, component_spec) # For feature extraction: with tf.Graph().as_default(): comp = bulk_component.BulkFeatureExtractorComponentBuilder( self.master, component_spec) # Expect feature extraction to generate a error due to the "history" # translator. with self.assertRaises(NotImplementedError): comp.build_greedy_training(self.master_state, self.network_states) # As well as annotation: with tf.Graph().as_default(): comp = bulk_component.BulkAnnotatorComponentBuilder( self.master, component_spec) with self.assertRaises(NotImplementedError): comp.build_greedy_training(self.master_state, self.network_states)
def testNormalFixedFeaturesAreDifferentiable(self): component_spec = spec_pb2.ComponentSpec() text_format.Parse(""" name: "test" network_unit { registered_name: "IdentityNetwork" } fixed_feature { name: "fixed" embedding_dim: 32 size: 1 pretrained_embedding_matrix { part {} } vocab { part {} } } component_builder { registered_name: "bulk_component.BulkFeatureExtractorComponentBuilder" } """, component_spec) with tf.Graph().as_default(): comp = bulk_component.BulkFeatureExtractorComponentBuilder( self.master, component_spec) # Get embedding matrix variables. with tf.variable_scope(comp.name, reuse=True): fixed_embedding_matrix = tf.get_variable( network_units.fixed_embeddings_name(0)) # Get output layer. comp.build_greedy_training(self.master_state, self.network_states) activations = self.network_states[comp.name].activations outputs = activations[comp.network.layers[0].name].bulk_tensor # Compute the gradient of the output layer w.r.t. the embedding matrix. # This should be well-defined for in the normal case. gradients = tf.gradients(outputs, fixed_embedding_matrix) self.assertEqual(len(gradients), 1) self.assertFalse(gradients[0] is None)
def testConstantFixedFeatureFailsIfNotPretrained(self): component_spec = spec_pb2.ComponentSpec() text_format.Parse(""" name: "test" network_unit { registered_name: "IdentityNetwork" } fixed_feature { name: "fixed" embedding_dim: 32 size: 1 is_constant: true } component_builder { registered_name: "bulk_component.BulkFeatureExtractorComponentBuilder" } """, component_spec) with tf.Graph().as_default(): comp = bulk_component.BulkFeatureExtractorComponentBuilder( self.master, component_spec) with self.assertRaisesRegexp(ValueError, 'Constant embeddings must be pretrained'): comp.build_greedy_training(self.master_state, self.network_states) with self.assertRaisesRegexp(ValueError, 'Constant embeddings must be pretrained'): comp.build_greedy_inference( self.master_state, self.network_states, during_training=True) with self.assertRaisesRegexp(ValueError, 'Constant embeddings must be pretrained'): comp.build_greedy_inference( self.master_state, self.network_states, during_training=False)
def testFailsOnRecurrentLinkedFeature(self): component_spec = spec_pb2.ComponentSpec() text_format.Parse(""" name: "test" network_unit { registered_name: "FeedForwardNetwork" parameters { key: 'hidden_layer_sizes' value: '64' } } linked_feature { name: "features" embedding_dim: -1 size: 1 source_translator: "identity" source_component: "test" source_layer: "layer_0" } """, component_spec) # For feature extraction: with tf.Graph().as_default(): comp = bulk_component.BulkFeatureExtractorComponentBuilder( self.master, component_spec) # Expect feature extraction to generate a error due to the "history" # translator. with self.assertRaises(RuntimeError): comp.build_greedy_training(self.master_state, self.network_states) # As well as annotation: with tf.Graph().as_default(): comp = bulk_component.BulkAnnotatorComponentBuilder( self.master, component_spec) with self.assertRaises(RuntimeError): comp.build_greedy_training(self.master_state, self.network_states)
def testConstantFixedFeaturesAreNotDifferentiableButOthersAre(self): component_spec = spec_pb2.ComponentSpec() text_format.Parse( """ name: "test" network_unit { registered_name: "IdentityNetwork" } fixed_feature { name: "constant" embedding_dim: 32 size: 1 is_constant: true pretrained_embedding_matrix { part {} } vocab { part {} } } fixed_feature { name: "trainable" embedding_dim: 32 size: 1 pretrained_embedding_matrix { part {} } vocab { part {} } } component_builder { registered_name: "bulk_component.BulkFeatureExtractorComponentBuilder" } """, component_spec) with tf.Graph().as_default(): comp = bulk_component.BulkFeatureExtractorComponentBuilder( self.master, component_spec) # Get embedding matrix variables. with tf.variable_scope(comp.name, reuse=True): constant_embedding_matrix = tf.get_variable( network_units.fixed_embeddings_name(0)) trainable_embedding_matrix = tf.get_variable( network_units.fixed_embeddings_name(1)) # Get output layer. comp.build_greedy_training(self.master_state, self.network_states) activations = self.network_states[comp.name].activations outputs = activations[comp.network.layers[0].name].bulk_tensor # The constant embeddings are non-differentiable. constant_gradients = tf.gradients(outputs, constant_embedding_matrix) self.assertEqual(len(constant_gradients), 1) self.assertTrue(constant_gradients[0] is None) # The trainable embeddings are differentiable. trainable_gradients = tf.gradients(outputs, trainable_embedding_matrix) self.assertEqual(len(trainable_gradients), 1) self.assertFalse(trainable_gradients[0] is None)
def testPreCreateCalledBeforeCreate(self): component_spec = spec_pb2.ComponentSpec() text_format.Parse( """ name: "test" network_unit { registered_name: "IdentityNetwork" } """, component_spec) class AssertPreCreateBeforeCreateNetwork( network_units.NetworkUnitInterface): """Mock that asserts that .create() is called before .pre_create().""" def __init__(self, comp, test_fixture): super(AssertPreCreateBeforeCreateNetwork, self).__init__(comp) self._test_fixture = test_fixture self._pre_create_called = False def get_logits(self, network_tensors): return tf.zeros([2, 1], dtype=tf.float32) def pre_create(self, *unused_args): self._pre_create_called = True def create(self, *unused_args, **unuesd_kwargs): self._test_fixture.assertTrue(self._pre_create_called) return [] builder = bulk_component.BulkFeatureExtractorComponentBuilder( self.master, component_spec) builder.network = AssertPreCreateBeforeCreateNetwork(builder, self) builder.build_greedy_training(component.MasterState(['foo', 'bar'], 2), self.network_states) self.setUp() builder = bulk_component.BulkFeatureExtractorComponentBuilder( self.master, component_spec) builder.network = AssertPreCreateBeforeCreateNetwork(builder, self) builder.build_greedy_inference( component.MasterState(['foo', 'bar'], 2), self.network_states) self.setUp() builder = bulk_component.BulkFeatureIdExtractorComponentBuilder( self.master, component_spec) builder.network = AssertPreCreateBeforeCreateNetwork(builder, self) builder.build_greedy_training(component.MasterState(['foo', 'bar'], 2), self.network_states) self.setUp() builder = bulk_component.BulkFeatureIdExtractorComponentBuilder( self.master, component_spec) builder.network = AssertPreCreateBeforeCreateNetwork(builder, self) builder.build_greedy_inference( component.MasterState(['foo', 'bar'], 2), self.network_states) self.setUp() builder = bulk_component.BulkAnnotatorComponentBuilder( self.master, component_spec) builder.network = AssertPreCreateBeforeCreateNetwork(builder, self) builder.build_greedy_training(component.MasterState(['foo', 'bar'], 2), self.network_states) self.setUp() builder = bulk_component.BulkAnnotatorComponentBuilder( self.master, component_spec) builder.network = AssertPreCreateBeforeCreateNetwork(builder, self) builder.build_greedy_inference( component.MasterState(['foo', 'bar'], 2), self.network_states)