def populate_defaults(input_feature): set_default_values(input_feature, {TIED: None, "encoder": "parallel_cnn", "level": "word"}) encoder_class = get_encoder_cls(input_feature["type"], input_feature["encoder"]) if hasattr(encoder_class, "default_params"): set_default_values(input_feature, encoder_class.default_params)
def test_sequence_embed_encoder(enc_embedding_size: int, input_sequence: torch.Tensor) -> None: encoder_parameters["embedding_size"] = enc_embedding_size encoder_obj = get_encoder_cls(SEQUENCE, "embed")(**encoder_parameters) encoder_out = encoder_obj(input_sequence) assert encoder_out["encoder_output"].size()[1:] == encoder_obj.output_shape
def test_passthrough_encoder(enc_reduce_output, input_sequence): encoder_parameters = {"reduce_output": enc_reduce_output} # retrieve encoder to test encoder_obj = get_encoder_cls(SEQUENCE, "passthrough")(**encoder_parameters) encoder_out = encoder_obj(input_sequence) assert "encoder_output" in encoder_out assert (encoder_out["encoder_output"].shape == (BATCH_SIZE, SEQ_SIZE, 1) if enc_reduce_output is None else (BATCH_SIZE, 1))
def test_sequence_embed_encoder(enc_embedding_size: int, input_sequence: torch.Tensor) -> None: encoder_parameters["embedding_size"] = enc_embedding_size # retrieve encoder to test encoder_obj = get_encoder_cls(SEQUENCE, "embed")(**encoder_parameters) encoder_out = encoder_obj(input_sequence) # check to make sure shape is correct depending on relationship # of vocab_size and embedding_size if enc_embedding_size > TEST_VOCAB_SIZE: assert (BATCH_SIZE, *encoder_obj.output_shape) == (BATCH_SIZE, TEST_VOCAB_SIZE) else: assert (BATCH_SIZE, *encoder_obj.output_shape) == (BATCH_SIZE, enc_embedding_size)
def initialize_encoder(self, encoder_parameters): return get_encoder_cls(self.type(), self.encoder)(**encoder_parameters)
def test_sequence_encoders( enc_encoder: str, enc_cell_type: str, enc_dropout: float, enc_num_layers: int, enc_norm: Union[None, str], enc_reduce_output: Union[None, str], enc_should_embed: bool, input_sequence: torch.Tensor, ): # update encoder parameters for specific unit test case encoder_parameters["cell_type"] = enc_cell_type encoder_parameters["dropout"] = enc_dropout encoder_parameters["num_layers"] = enc_num_layers encoder_parameters["norm"] = enc_norm encoder_parameters["reduce_output"] = enc_reduce_output # retrieve encoder to test encoder_obj = get_encoder_cls(SEQUENCE, enc_encoder)(**encoder_parameters) if torch.cuda.is_available(): encoder_obj = encoder_obj.cuda() encoder_out = encoder_obj(input_sequence) assert "encoder_output" in encoder_out assert isinstance(encoder_out["encoder_output"], torch.Tensor) if enc_encoder == "parallel_cnn": number_parallel_cnn_layers = PARALLEL_CNN_LAYERS output_dimension = encoder_parameters[ "num_filters"] * number_parallel_cnn_layers assert (encoder_out["encoder_output"].shape == (BATCH_SIZE, SEQ_SIZE, output_dimension) if enc_reduce_output is None else (BATCH_SIZE, output_dimension)) elif enc_encoder == "stacked_parallel_cnn": number_parallel_cnn_layers = PARALLEL_CNN_LAYERS output_dimension = encoder_parameters[ "num_filters"] * number_parallel_cnn_layers assert (encoder_out["encoder_output"].shape == (BATCH_SIZE, SEQ_SIZE, output_dimension) if enc_reduce_output is None else (BATCH_SIZE, output_dimension)) elif enc_encoder == "rnn": assert (encoder_out["encoder_output"].shape == (BATCH_SIZE, SEQ_SIZE, TEST_STATE_SIZE) if enc_reduce_output is None else (BATCH_SIZE, TEST_STATE_SIZE)) assert "encoder_output_state" in encoder_out if enc_cell_type == "lstm": assert isinstance(encoder_out["encoder_output_state"], tuple) assert isinstance(encoder_out["encoder_output_state"][0], torch.Tensor) assert isinstance(encoder_out["encoder_output_state"][1], torch.Tensor) assert encoder_out["encoder_output_state"][0].shape == ( BATCH_SIZE, TEST_STATE_SIZE) assert encoder_out["encoder_output_state"][1].shape == ( BATCH_SIZE, TEST_STATE_SIZE) else: assert isinstance(encoder_out["encoder_output_state"], torch.Tensor) assert encoder_out["encoder_output_state"].shape == ( BATCH_SIZE, TEST_STATE_SIZE) elif enc_encoder == "cnnrnn": assert encoder_out["encoder_output"].shape[ 1:] == encoder_obj.output_shape assert "encoder_output_state" in encoder_out if enc_cell_type == "lstm": assert isinstance(encoder_out["encoder_output_state"], tuple) assert encoder_out["encoder_output_state"][0].shape == ( BATCH_SIZE, TEST_STATE_SIZE) assert encoder_out["encoder_output_state"][1].shape == ( BATCH_SIZE, TEST_STATE_SIZE) else: assert isinstance(encoder_out["encoder_output_state"], torch.Tensor) assert encoder_out["encoder_output_state"].shape == ( BATCH_SIZE, TEST_STATE_SIZE) elif enc_encoder == "stacked_cnn": assert encoder_out["encoder_output"].shape[ 1:] == encoder_obj.output_shape elif enc_encoder == "embed": assert (encoder_out["encoder_output"].shape == (BATCH_SIZE, SEQ_SIZE, TEST_EMBEDDING_SIZE) if enc_reduce_output is None else (BATCH_SIZE, TEST_EMBEDDING_SIZE)) elif enc_encoder == "transformer": assert encoder_out["encoder_output"].shape[ 1:] == encoder_obj.output_shape elif enc_encoder == "passthrough": assert (encoder_out["encoder_output"].shape == (BATCH_SIZE, SEQ_SIZE, 1) if enc_reduce_output is None else (BATCH_SIZE, 1)) else: raise ValueError(f"{enc_encoder} is an invalid encoder specification")