示例#1
0
void ensemble_factory<dType>::ensembles_models() {

	int num_models = models.size();
	for(int i=0; i<outputdist.rows(); i++) {
		for(int j=0; j< outputdist.cols(); j++) {
			double temp_sum = 0;
			for(int k=0; k<models.size(); k++) {
				temp_sum+=models[k].outputdist(i,j);
			}
			outputdist(i,j) = temp_sum/num_models;
		}
	}

	//normalize now
	// for(int j=0; j< outputdist.cols(); j++) {
	// 	double temp_sum = 0;
	// 	for(int i=0; i<outputdist.rows(); i++) {
	// 		temp_sum+=outputdist(i,j);
	// 	}
	// 	for(int i=0; i<outputdist.rows(); i++) {
	// 		outputdist(i,j) = outputdist(i,j)/temp_sum;
	// 	}
	// }
	normalization.setZero();

	for(int i=0; i<outputdist.rows(); i++) {
		normalization+=outputdist.row(i);
	}
	for(int i=0; i<outputdist.rows(); i++) {
		outputdist.row(i) = (outputdist.row(i).array()/normalization.array()).matrix();
	}
}
示例#2
0
void ensemble_factory<dType>::ensembles_models() {

	int num_models = models.size();
	for(int i=0; i<outputdist.rows(); i++) {
		for(int j=0; j< outputdist.cols(); j++) {
			double temp_sum = 0;
			for(int k=0; k<models.size(); k++) {
				temp_sum+=models[k].outputdist(i,j);
			}
			outputdist(i,j) = temp_sum/num_models;
		}
	}

	//normalize now
	// for(int j=0; j< outputdist.cols(); j++) {
	// 	double temp_sum = 0;
	// 	for(int i=0; i<outputdist.rows(); i++) {
	// 		temp_sum+=outputdist(i,j);
	// 	}
	// 	for(int i=0; i<outputdist.rows(); i++) {
	// 		outputdist(i,j) = outputdist(i,j)/temp_sum;
	// 	}
	// }
	normalization.setZero();

	for(int i=0; i<outputdist.rows(); i++) {
		normalization+=outputdist.row(i);
	}
	for(int i=0; i<outputdist.rows(); i++) {
		outputdist.row(i) = (outputdist.row(i).array()/normalization.array()).matrix();
	}

	//now averaging alignment scores for unk replacement
	if(BZ_CUDA::unk_replacement) {
		//average the scores
		for(int i=0; i<models[0].longest_sent;i++) {
			for(int j=0; j<models[0].beam_size; j++) {
				dType temp_sum = 0;
				for(int k=0; k<models.size(); k++) {
					temp_sum+=models[k].viterbi_alignments_scores[IDX2C(i,j,models[0].longest_sent)];
				}
				BZ_CUDA::alignment_scores[IDX2C(i,j,models[0].longest_sent)] = temp_sum;
			}
		}

		// std::cout << "-------------------------------------------\n";
		// for(int i=0; i<models[0].longest_sent;i++) {
		// 	for(int j=0; j<models[0].beam_size; j++) {
		// 		std::cout << BZ_CUDA::alignment_scores[IDX2C(i,j,models[0].longest_sent)] << " ";
		// 	}
		// 	std::cout << "\n";
		// }
		// std::cout << "\n";
		// std::cout << "-------------------------------------------\n\n";
		//choose the max and fill in BZ_CUDA::viterbi_alignments
		for(int i=0; i<models[0].beam_size; i++) {
			dType max_val = 0;
			int max_index = -1;
			for(int j=0; j<models[0].longest_sent; j++) {
				dType temp_val = BZ_CUDA::alignment_scores[IDX2C(j,i,models[0].longest_sent)];
				if(temp_val > max_val) {
					max_val = temp_val;
					max_index = j;
				}
			}
			// if(max_index==-1) {
			// 	std::cout << "ERROR: max_index is still -1, so all values are zero\n";
			// }
			BZ_CUDA::viterbi_alignments[i] = max_index;
		}
	}
}