Beispiel #1
0
def test_sp_flock_node_accessor_types_and_dimensions():

    device = 'cuda'  # CPU not supported by SPFlock

    upper_bound = 107
    flock_input_size = upper_bound
    flock_size = 1

    num_cc = 21

    # define params
    sp_params = MnistSpTopology.get_sp_params(num_cluster_centers=num_cc,
                                              cluster_boost_threshold=1000,
                                              learning_rate=0.1,
                                              buffer_size=2 * 30,
                                              batch_size=30,
                                              input_size=flock_input_size,
                                              flock_size=flock_size,
                                              max_boost_time=1500)

    # random_node -> unsqueeze_node, sp_flock
    random_node = RandomNumberNode(upper_bound=upper_bound)
    unsqueeze_node = UnsqueezeNode(0)
    sp_node = SpatialPoolerFlockNode(sp_params.clone())

    Connector.connect(random_node.outputs.one_hot_output,
                      unsqueeze_node.inputs.input)
    Connector.connect(unsqueeze_node.outputs.output,
                      sp_node.inputs.sp.data_input)

    # update dimensions
    creator = AllocatingCreator(device=device)
    random_node.allocate_memory_blocks(creator)
    unsqueeze_node.allocate_memory_blocks(creator)
    sp_node.allocate_memory_blocks(creator)

    # make step
    random_node.step()
    unsqueeze_node.step()
    sp_node.step()

    # collect the results
    reconstruction = SpatialPoolerFlockNodeAccessor.get_reconstruction(sp_node)
    deltas = SpatialPoolerFlockNodeAccessor.get_sp_deltas(sp_node)
    boosting_durations = SpatialPoolerFlockNodeAccessor.get_sp_boosting_durations(
        sp_node)
    output_id = SpatialPoolerFlockNodeAccessor.get_output_id(sp_node)

    # check result properties
    assert type(reconstruction) is torch.Tensor
    assert type(deltas) is torch.Tensor
    assert type(boosting_durations) is torch.Tensor
    assert type(output_id) is int

    assert reconstruction.shape == (flock_size, flock_input_size)
    assert deltas.shape == (flock_size, num_cc, flock_input_size)
    assert boosting_durations.shape == (flock_size, num_cc)
    assert 0 <= output_id < num_cc

    # test the sp metrics
    delta = average_sp_delta(deltas)
    boosting_dur = average_boosting_duration(boosting_durations)

    nbc = num_boosted_clusters(boosting_durations)

    assert type(delta) is float
    assert type(boosting_dur) is float
    assert 0 <= boosting_dur <= 1000

    assert type(nbc) is float
    assert 0 <= nbc <= 1
 def get_learned_model_output_id(self) -> int:
     return SpatialPoolerFlockNodeAccessor.get_output_id(self._sp)