Ejemplo n.º 1
0
	void extract_data_transformer::transform(
		const float * data,
		float * data_transformed,
		const layer_configuration_specific& original_config,
		unsigned int sample_id)
	{
		if (input_window_sizes == output_window_sizes)
		{
			const std::vector<unsigned int>& dimension_sizes = original_config.dimension_sizes;

			if (dimension_sizes.size() != input_window_sizes.size())
				throw neural_network_exception((boost::format("extract_data_transformer is created with %1%-dimensions, data has %2% dimensions") % input_window_sizes.size() % dimension_sizes.size()).str());

			std::vector<unsigned int> src_offset_list;
			for(unsigned int i = 0; i < dimension_sizes.size(); ++i)
			{
				if (dimension_sizes[i] < output_window_sizes[i])
					throw neural_network_exception((boost::format("Dimension %1% of original config has %2% size while minimum is %3%") % i % dimension_sizes[i] % output_window_sizes[i]).str());
				src_offset_list.push_back((dimension_sizes[i] - output_window_sizes[i]) / 2);
			}

			std::vector<unsigned int> dst_pos_list(dimension_sizes.size(), 0);

			const float * src_begin = data;
			float * dst = data_transformed;

			for(unsigned int feature_map_id = 0; feature_map_id < original_config.feature_map_count; ++feature_map_id)
			{
				while (true)
				{
					unsigned int offset = dst_pos_list.back() + src_offset_list.back();
					for(int i = static_cast<int>(dimension_sizes.size()) - 2; i >= 0; --i)
						offset = offset * dimension_sizes[i] + dst_pos_list[i] + src_offset_list[i];

					memcpy(dst, src_begin + offset, output_window_sizes[0] * sizeof(float));
					dst += output_window_sizes[0];

					bool inc = false;
					for(int i = 1; i < output_window_sizes.size(); ++i)
					{
						dst_pos_list[i]++;
						if (dst_pos_list[i] < output_window_sizes[i])
						{
							inc = true;
							break;
						}
						else
							dst_pos_list[i] = 0;
					}
					if (!inc)
						break;
				}

				src_begin += original_config.get_neuron_count_per_feature_map();
			}
		}
		else
		{
			if (original_config.dimension_sizes.size() != 2)
				throw neural_network_exception((boost::format("Resizing extract_data_transformer is processing 2D data only, data is passed with number of dimensions %1%") % original_config.dimension_sizes.size()).str());

			int window_top_left_x = (original_config.dimension_sizes[0] - input_window_sizes[0]) / 2;
			int window_bottom_right_x = window_top_left_x + input_window_sizes[0];
			int window_top_left_y = (original_config.dimension_sizes[1] - input_window_sizes[1]) / 2;
			int window_bottom_right_y = window_top_left_y + input_window_sizes[1];

			unsigned int original_neuron_count_per_feature_map = original_config.get_neuron_count_per_feature_map();
			unsigned int transformed_neuron_count_per_feature_map = get_transformed_configuration(original_config).get_neuron_count_per_feature_map();
			for(unsigned int feature_map_id = 0; feature_map_id < original_config.feature_map_count; ++feature_map_id)
			{
				cv::Mat1f original_image(static_cast<int>(original_config.dimension_sizes[1]), static_cast<int>(original_config.dimension_sizes[0]), const_cast<float *>(data) + (original_neuron_count_per_feature_map * feature_map_id));
				cv::Mat1f cropped_image = original_image.rowRange(window_top_left_y, window_bottom_right_y).colRange(window_top_left_x, window_bottom_right_x);
				cv::Mat1f dest_image(static_cast<int>(output_window_sizes[1]), static_cast<int>(output_window_sizes[0]), data_transformed + (transformed_neuron_count_per_feature_map * feature_map_id));
				cv::resize(cropped_image, dest_image, dest_image.size());
			}
		}
	}
	void rotate_band_data_transformer::transform(
		const void * data,
		void * data_transformed,
		neuron_data_type::input_type type,
		const layer_configuration_specific& original_config,
		unsigned int sample_id)
	{
		const std::vector<unsigned int>& dimension_sizes = original_config.dimension_sizes;

		if (dimension_sizes.size() != rotate_band_distributions.size())
			throw neural_network_exception((boost::format("rotate_band_data_transformer is created with %1%-dimensional rotations, data has %2% dimensions") % rotate_band_distributions.size() % dimension_sizes.size()).str());

		size_t elem_size = neuron_data_type::get_input_size(type);

		const unsigned char * src_begin = (const unsigned char *)data;
		unsigned char * dst = (unsigned char *)data_transformed;

		std::vector<unsigned int> src_pos_list;
		std::vector<unsigned int>::const_iterator it2 = dimension_sizes.begin();
		for(std::vector<nnforge_uniform_int_distribution<int> >::iterator it = rotate_band_distributions.begin(); it != rotate_band_distributions.end(); ++it, ++it2)
		{
			nnforge_uniform_int_distribution<int>& rotate_band_distribution = *it;
			int rotate_band = rotate_band_distribution.min();
			if (rotate_band_distribution.max() > rotate_band_distribution.min())
				rotate_band = rotate_band_distribution(generator);
			if (rotate_band < 0)
				rotate_band += *it2;
			src_pos_list.push_back(rotate_band);
		}

		std::vector<unsigned int> dst_pos_list(dimension_sizes.size(), 0);

		unsigned int x_xopy_count1 = dimension_sizes[0] - src_pos_list[0];
		for(unsigned int feature_map_id = 0; feature_map_id < original_config.feature_map_count; ++feature_map_id)
		{
			while (true)
			{
				unsigned int offset = 0;
				for(int i = dimension_sizes.size() - 1; i > 0; --i)
					offset = (offset + src_pos_list[i]) * dimension_sizes[i - 1];
				const unsigned char * src = src_begin + offset * elem_size;

				memcpy(dst, src + src_pos_list[0] * elem_size, x_xopy_count1 * elem_size);
				if (src_pos_list[0] > 0)
					memcpy(dst + x_xopy_count1 * elem_size, src, src_pos_list[0] * elem_size);
				dst += dimension_sizes[0] * elem_size;

				bool inc = false;
				for(int i = 1; i < dimension_sizes.size(); ++i)
				{
					dst_pos_list[i]++;
					src_pos_list[i]++;
					if (src_pos_list[i] == dimension_sizes[i])
						src_pos_list[i] = 0;
					if (dst_pos_list[i] < dimension_sizes[i])
					{
						inc = true;
						break;
					}
					else
						dst_pos_list[i] = 0;
				}
				if (!inc)
					break;
			}

			src_begin += original_config.get_neuron_count_per_feature_map() * elem_size;
		}
	}