Example #1
0
    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)
Example #2
0
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)
Example #5
0
 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")