Skip to content

Commit

Permalink
Max and Average subsampling layer are working for 0-dimension case now
Browse files Browse the repository at this point in the history
  • Loading branch information
milakov committed Feb 19, 2016
1 parent b3f12f8 commit 4e522a1
Show file tree
Hide file tree
Showing 15 changed files with 183 additions and 64 deletions.
21 changes: 15 additions & 6 deletions nnforge/average_subsampling_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,6 @@ namespace nnforge

void average_subsampling_layer::check()
{
if (subsampling_sizes.size() == 0)
throw neural_network_exception("subsampling sizes for average subsampling layer may not be empty");

for(unsigned int i = 0; i < subsampling_sizes.size(); i++)
{
if (subsampling_sizes[i] == 0)
Expand Down Expand Up @@ -215,13 +212,25 @@ namespace nnforge
}

if (feature_map_subsampling_size != 1)
ss << ", fm " << feature_map_subsampling_size;
{
if (!ss.str().empty())
ss << ", ";
ss << "fm " << feature_map_subsampling_size;
}

if (entry_subsampling_size != 1)
ss << ", samples " << entry_subsampling_size;
{
if (!ss.str().empty())
ss << ", ";
ss << "samples " << entry_subsampling_size;
}

if (alpha != -std::numeric_limits<float>::max())
ss << ", alpha " << alpha;
{
if (!ss.str().empty())
ss << ", ";
ss << "alpha " << alpha;
}

res.push_back(ss.str());

Expand Down
22 changes: 16 additions & 6 deletions nnforge/cuda/average_subsampling_layer_tester_cuda.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -253,15 +253,25 @@ namespace nnforge
feature_map_subsampling_size = layer_derived->feature_map_subsampling_size;
entry_subsampling_size = layer_derived->entry_subsampling_size;

int_fastdiv current_stride(layer_derived->subsampling_sizes[0]);
std::vector<unsigned int> local_subsampling_sizes = layer_derived->subsampling_sizes;
if (local_subsampling_sizes.empty())
local_subsampling_sizes.push_back(1);
std::vector<unsigned int> local_input_dimension_sizes = input_configuration_specific_list[0].dimension_sizes;
if (local_input_dimension_sizes.empty())
local_input_dimension_sizes.push_back(1);
std::vector<unsigned int> local_output_dimension_sizes = output_configuration_specific.dimension_sizes;
if (local_output_dimension_sizes.empty())
local_output_dimension_sizes.push_back(1);

int_fastdiv current_stride(local_subsampling_sizes[0]);
for(int i = 0; i < dimension_count; ++i)
{
subsampling_sizes[i] = layer_derived->subsampling_sizes[i];
input_sizes[i] = input_configuration_specific_list[0].dimension_sizes[i];
output_sizes[i] = output_configuration_specific.dimension_sizes[i];
subsampling_sizes[i] = local_subsampling_sizes[i];
input_sizes[i] = local_input_dimension_sizes[i];
output_sizes[i] = local_output_dimension_sizes[i];
strides[i] = current_stride;

current_stride = current_stride * static_cast<int>(output_configuration_specific.dimension_sizes[i]);
current_stride = current_stride * output_sizes[i];
}

mult = layer_derived->get_effective_alpha();
Expand All @@ -270,7 +280,7 @@ namespace nnforge
for(int i = 0; i < dimension_count; ++i)
forward_packed_config_count *= output_sizes[i];

nonunit_window_x = (layer_derived->subsampling_sizes[0] > 1);
nonunit_window_x = (subsampling_sizes[0] > 1);
}

private:
Expand Down
7 changes: 5 additions & 2 deletions nnforge/cuda/average_subsampling_layer_testing_schema_cuda.cu
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2011-2015 Maxim Milakov
* Copyright 2011-2016 Maxim Milakov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -52,7 +52,10 @@ namespace nnforge

switch (output_configuration_specific.dimension_sizes.size())
{
case 1:
case 0:
res = layer_tester_cuda::ptr(new average_subsampling_layer_tester_cuda<1>());
break;
case 1:
res = layer_tester_cuda::ptr(new average_subsampling_layer_tester_cuda<1>());
break;
case 2:
Expand Down
23 changes: 17 additions & 6 deletions nnforge/cuda/average_subsampling_layer_updater_cuda.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -440,15 +440,26 @@ namespace nnforge
entry_subsampling_size = layer_derived->entry_subsampling_size;

exact_subsampling = (output_configuration_specific.feature_map_count * feature_map_subsampling_size == input_configuration_specific_list[0].feature_map_count);
int_fastdiv current_stride(layer_derived->subsampling_sizes[0]);

std::vector<unsigned int> local_subsampling_sizes = layer_derived->subsampling_sizes;
if (local_subsampling_sizes.empty())
local_subsampling_sizes.push_back(1);
std::vector<unsigned int> local_input_dimension_sizes = input_configuration_specific_list[0].dimension_sizes;
if (local_input_dimension_sizes.empty())
local_input_dimension_sizes.push_back(1);
std::vector<unsigned int> local_output_dimension_sizes = output_configuration_specific.dimension_sizes;
if (local_output_dimension_sizes.empty())
local_output_dimension_sizes.push_back(1);

int_fastdiv current_stride(local_subsampling_sizes[0]);
for(int i = 0; i < dimension_count; ++i)
{
subsampling_sizes[i] = layer_derived->subsampling_sizes[i];
input_sizes[i] = input_configuration_specific_list[0].dimension_sizes[i];
output_sizes[i] = output_configuration_specific.dimension_sizes[i];
subsampling_sizes[i] = local_subsampling_sizes[i];
input_sizes[i] = local_input_dimension_sizes[i];
output_sizes[i] = local_output_dimension_sizes[i];
strides[i] = current_stride;

current_stride = current_stride * static_cast<int>(output_configuration_specific.dimension_sizes[i]);
current_stride = current_stride * output_sizes[i];
exact_subsampling = exact_subsampling & (input_sizes[i] == output_sizes[i] * subsampling_sizes[i]);
}

Expand All @@ -458,7 +469,7 @@ namespace nnforge
for(int i = 0; i < dimension_count; ++i)
forward_packed_config_count *= output_sizes[i];

nonunit_window_x = (layer_derived->subsampling_sizes[0] > 1);
nonunit_window_x = (subsampling_sizes[0] > 1);
}

bool is_backward_data_dependent_on_input_buffer(unsigned int action_input_index, unsigned int data_input_index) const
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2011-2015 Maxim Milakov
* Copyright 2011-2016 Maxim Milakov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -53,6 +53,9 @@ namespace nnforge

switch (output_configuration_specific.dimension_sizes.size())
{
case 0:
res = layer_updater_cuda::ptr(new average_subsampling_layer_updater_cuda<1>());
break;
case 1:
res = layer_updater_cuda::ptr(new average_subsampling_layer_updater_cuda<1>());
break;
Expand Down
22 changes: 16 additions & 6 deletions nnforge/cuda/max_subsampling_layer_tester_cuda.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -292,21 +292,31 @@ namespace nnforge
feature_map_subsampling_size = layer_derived->feature_map_subsampling_size;
entry_subsampling_size = layer_derived->entry_subsampling_size;

int_fastdiv current_stride(layer_derived->subsampling_sizes[0]);
std::vector<unsigned int> local_subsampling_sizes = layer_derived->subsampling_sizes;
if (local_subsampling_sizes.empty())
local_subsampling_sizes.push_back(1);
std::vector<unsigned int> local_input_dimension_sizes = input_configuration_specific_list[0].dimension_sizes;
if (local_input_dimension_sizes.empty())
local_input_dimension_sizes.push_back(1);
std::vector<unsigned int> local_output_dimension_sizes = output_configuration_specific.dimension_sizes;
if (local_output_dimension_sizes.empty())
local_output_dimension_sizes.push_back(1);

int_fastdiv current_stride(local_subsampling_sizes[0]);
for(int i = 0; i < dimension_count; ++i)
{
subsampling_sizes[i] = layer_derived->subsampling_sizes[i];
input_sizes[i] = input_configuration_specific_list[0].dimension_sizes[i];
output_sizes[i] = output_configuration_specific.dimension_sizes[i];
subsampling_sizes[i] = local_subsampling_sizes[i];
input_sizes[i] = local_input_dimension_sizes[i];
output_sizes[i] = local_output_dimension_sizes[i];
strides[i] = current_stride;
current_stride = current_stride * static_cast<int>(output_configuration_specific.dimension_sizes[i]);
current_stride = current_stride * output_sizes[i];
}

forward_packed_config_count = subsampling_sizes[0];
for(int i = 0; i < dimension_count; ++i)
forward_packed_config_count *= output_sizes[i];

nonunit_window_x = (layer_derived->subsampling_sizes[0] > 1);
nonunit_window_x = (subsampling_sizes[0] > 1);
}

private:
Expand Down
7 changes: 5 additions & 2 deletions nnforge/cuda/max_subsampling_layer_testing_schema_cuda.cu
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2011-2015 Maxim Milakov
* Copyright 2011-2016 Maxim Milakov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -77,7 +77,10 @@ namespace nnforge
{
switch (output_configuration_specific.dimension_sizes.size())
{
case 1:
case 0:
res = layer_tester_cuda::ptr(new max_subsampling_layer_tester_cuda<1>());
break;
case 1:
res = layer_tester_cuda::ptr(new max_subsampling_layer_tester_cuda<1>());
break;
case 2:
Expand Down
24 changes: 17 additions & 7 deletions nnforge/cuda/max_subsampling_layer_updater_cuda.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -880,17 +880,27 @@ namespace nnforge
feature_map_subsampling_size = layer_derived->feature_map_subsampling_size;
entry_subsampling_size = layer_derived->entry_subsampling_size;

int_fastdiv current_stride(layer_derived->subsampling_sizes[0]);
std::vector<unsigned int> local_subsampling_sizes = layer_derived->subsampling_sizes;
if (local_subsampling_sizes.empty())
local_subsampling_sizes.push_back(1);
std::vector<unsigned int> local_input_dimension_sizes = input_configuration_specific_list[0].dimension_sizes;
if (local_input_dimension_sizes.empty())
local_input_dimension_sizes.push_back(1);
std::vector<unsigned int> local_output_dimension_sizes = output_configuration_specific.dimension_sizes;
if (local_output_dimension_sizes.empty())
local_output_dimension_sizes.push_back(1);

int_fastdiv current_stride(local_subsampling_sizes[0]);
total_subsampling_size = entry_subsampling_size * feature_map_subsampling_size;
for(int i = 0; i < dimension_count; ++i)
{
subsampling_sizes[i] = layer_derived->subsampling_sizes[i];
input_sizes[i] = input_configuration_specific_list[0].dimension_sizes[i];
output_sizes[i] = output_configuration_specific.dimension_sizes[i];
subsampling_sizes[i] = local_subsampling_sizes[i];
input_sizes[i] = local_input_dimension_sizes[i];
output_sizes[i] = local_output_dimension_sizes[i];
strides[i] = current_stride;

total_subsampling_size *= subsampling_sizes[i];
current_stride = current_stride * static_cast<int>(output_configuration_specific.dimension_sizes[i]);
current_stride = current_stride * output_sizes[i];
}

forward_packed_config_count = subsampling_sizes[0];
Expand All @@ -899,9 +909,9 @@ namespace nnforge

exact_subsampling = (output_configuration_specific.feature_map_count * feature_map_subsampling_size == input_configuration_specific_list[0].feature_map_count);
for(int i = 0; i < dimension_count; ++i)
exact_subsampling = exact_subsampling && (output_configuration_specific.dimension_sizes[i] * subsampling_sizes[i] == input_configuration_specific_list[0].dimension_sizes[i]);
exact_subsampling = exact_subsampling && (output_sizes[i] * subsampling_sizes[i] == input_sizes[i]);

nonunit_window_x = (layer_derived->subsampling_sizes[0] > 1);
nonunit_window_x = (subsampling_sizes[0] > 1);
}

bool is_backward_data_dependent_on_input_buffer(unsigned int action_input_index, unsigned int data_input_index) const
Expand Down
5 changes: 4 additions & 1 deletion nnforge/cuda/max_subsampling_layer_updater_schema_cuda.cu
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2011-2015 Maxim Milakov
* Copyright 2011-2016 Maxim Milakov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -58,6 +58,9 @@ namespace nnforge

switch (output_configuration_specific.dimension_sizes.size())
{
case 0:
res = layer_updater_cuda::ptr(new max_subsampling_layer_updater_cuda<1>());
break;
case 1:
res = layer_updater_cuda::ptr(new max_subsampling_layer_updater_cuda<1>());
break;
Expand Down
36 changes: 25 additions & 11 deletions nnforge/max_subsampling_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,6 @@ namespace nnforge

void max_subsampling_layer::check()
{
if (subsampling_sizes.size() == 0)
throw neural_network_exception("subsampling sizes for max subsampling layer may not be empty");

for(unsigned int i = 0; i < subsampling_sizes.size(); i++)
{
if (subsampling_sizes[i] == 0)
Expand Down Expand Up @@ -267,23 +264,40 @@ namespace nnforge
std::stringstream ss;

if (is_min)
ss << "MIN, ";
ss << "MIN";

for(int i = 0; i < subsampling_sizes.size(); ++i)
if (!subsampling_sizes.empty())
{
if (i != 0)
ss << "x";
ss << subsampling_sizes[i];
if (!ss.str().empty())
ss << ", ";
for(int i = 0; i < subsampling_sizes.size(); ++i)
{
if (i != 0)
ss << "x";
ss << subsampling_sizes[i];
}
}

if (feature_map_subsampling_size != 1)
ss << ", fm " << feature_map_subsampling_size;
{
if (!ss.str().empty())
ss << ", ";
ss << "fm " << feature_map_subsampling_size;
}

if (entry_subsampling_size != 1)
ss << ", samples " << entry_subsampling_size;
{
if (!ss.str().empty())
ss << ", ";
ss << "samples " << entry_subsampling_size;
}

if (tiling)
ss << ", tiling";
{
if (!ss.str().empty())
ss << ", ";
ss << "tiling";
}

res.push_back(ss.str());

Expand Down
14 changes: 11 additions & 3 deletions nnforge/plain/average_subsampling_layer_tester_plain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@ namespace nnforge
const layer_configuration_specific& output_configuration_specific,
unsigned int entry_count) const
{
std::vector<unsigned int> input_dimension_sizes = input_configuration_specific_list[0].dimension_sizes;
if (input_dimension_sizes.empty())
input_dimension_sizes.push_back(1);
std::vector<unsigned int> output_dimension_sizes = output_configuration_specific.dimension_sizes;
if (output_dimension_sizes.empty())
output_dimension_sizes.push_back(1);
const float * const in_it_global = *input_buffers[0];
float * const out_it_global = *output_buffer;
const unsigned int input_neuron_count = input_configuration_specific_list[0].get_neuron_count();
Expand All @@ -61,17 +67,19 @@ namespace nnforge
const unsigned int output_neuron_count_per_feature_map = output_configuration_specific.get_neuron_count_per_feature_map();
nnforge_shared_ptr<const average_subsampling_layer> layer_derived = nnforge_dynamic_pointer_cast<const average_subsampling_layer>(layer_schema);
std::vector<unsigned int> subsampling_sizes = layer_derived->subsampling_sizes;
if (subsampling_sizes.empty())
subsampling_sizes.push_back(1);
const unsigned int feature_map_subsampling_size = layer_derived->feature_map_subsampling_size;
subsampling_sizes.push_back(feature_map_subsampling_size);
const unsigned int entry_subsampling_size = layer_derived->entry_subsampling_size;
subsampling_sizes.push_back(entry_subsampling_size);
const unsigned int subsampling_dimension_count = static_cast<unsigned int>(subsampling_sizes.size());
const unsigned int spatial_dimension_count = static_cast<unsigned int>(output_configuration_specific.dimension_sizes.size());
const unsigned int spatial_dimension_count = static_cast<unsigned int>(input_dimension_sizes.size());
std::vector<unsigned int> input_slices(subsampling_sizes.size());
input_slices[0] = 1;
for(unsigned int i = 0; i < subsampling_dimension_count - 1; ++i)
{
int dimension_size = (i < spatial_dimension_count) ? input_configuration_specific_list[0].dimension_sizes[i] : input_configuration_specific_list[0].feature_map_count;
int dimension_size = (i < spatial_dimension_count) ? input_dimension_sizes[i] : input_configuration_specific_list[0].feature_map_count;
input_slices[i + 1] = input_slices[i] * dimension_size;
}
unsigned int subsampling_elem_count = 1;
Expand Down Expand Up @@ -100,7 +108,7 @@ namespace nnforge
}

const int total_workload = entry_count * output_configuration_specific.feature_map_count;
const std::vector<unsigned int>::const_iterator dimension_sizes_it = output_configuration_specific.dimension_sizes.begin();
const std::vector<unsigned int>::const_iterator dimension_sizes_it = output_dimension_sizes.begin();
const std::vector<unsigned int>::const_iterator subsampling_sizes_it = subsampling_sizes.begin();
const std::vector<unsigned int>::const_iterator input_slices_it = input_slices.begin();
const std::vector<unsigned int>::const_iterator offset_list_it = offset_list.begin();
Expand Down
Loading

0 comments on commit 4e522a1

Please sign in to comment.