|
|
@ -967,8 +967,9 @@ void RecurrentGradientMachine::generateSequence() {
|
|
|
|
size_t numSequences = getGenBatchSize();
|
|
|
|
size_t numSequences = getGenBatchSize();
|
|
|
|
|
|
|
|
|
|
|
|
resizeBootFrame(numSequences);
|
|
|
|
resizeBootFrame(numSequences);
|
|
|
|
// We create only two sub-network in generation for alternate use.
|
|
|
|
// We create only two sub-network in generation, one stores states of all
|
|
|
|
// Thus, we can reduce total memory of output_ in layer forward.
|
|
|
|
// layers in previous time step and the other storing the states at current
|
|
|
|
|
|
|
|
// time step.
|
|
|
|
resizeOrCreateFrames(2);
|
|
|
|
resizeOrCreateFrames(2);
|
|
|
|
|
|
|
|
|
|
|
|
// outFrameLines_.size() > 1UL
|
|
|
|
// outFrameLines_.size() > 1UL
|
|
|
@ -1001,10 +1002,9 @@ void RecurrentGradientMachine::generateSequence() {
|
|
|
|
|
|
|
|
|
|
|
|
// init outArg
|
|
|
|
// init outArg
|
|
|
|
size_t resultNum = generator_.config.num_results_per_sample();
|
|
|
|
size_t resultNum = generator_.config.num_results_per_sample();
|
|
|
|
IVector::resizeOrCreate(
|
|
|
|
size_t maxGenWordCount =
|
|
|
|
generator_.outArg.ids,
|
|
|
|
generator_.config.max_num_frames() * numSequences * resultNum;
|
|
|
|
generator_.config.max_num_frames() * numSequences * resultNum,
|
|
|
|
IVector::resizeOrCreate(generator_.outArg.ids, maxGenWordCount, false);
|
|
|
|
false);
|
|
|
|
|
|
|
|
if (resultNum > 1) {
|
|
|
|
if (resultNum > 1) {
|
|
|
|
CHECK_LE(resultNum, static_cast<size_t>(generator_.config.beam_size()));
|
|
|
|
CHECK_LE(resultNum, static_cast<size_t>(generator_.config.beam_size()));
|
|
|
|
Matrix::resizeOrCreate(generator_.outArg.in,
|
|
|
|
Matrix::resizeOrCreate(generator_.outArg.in,
|
|
|
@ -1012,6 +1012,11 @@ void RecurrentGradientMachine::generateSequence() {
|
|
|
|
/* width */ resultNum,
|
|
|
|
/* width */ resultNum,
|
|
|
|
false,
|
|
|
|
false,
|
|
|
|
/* useGpu */ false);
|
|
|
|
/* useGpu */ false);
|
|
|
|
|
|
|
|
Matrix::resizeOrCreate(generator_.outArg.value,
|
|
|
|
|
|
|
|
/* height */ maxGenWordCount,
|
|
|
|
|
|
|
|
/* width */ 1,
|
|
|
|
|
|
|
|
false,
|
|
|
|
|
|
|
|
/* useGpu */ false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ICpuGpuVector::resizeOrCreate(generator_.outArg.sequenceStartPositions,
|
|
|
|
ICpuGpuVector::resizeOrCreate(generator_.outArg.sequenceStartPositions,
|
|
|
|
numSequences + 1,
|
|
|
|
numSequences + 1,
|
|
|
@ -1313,13 +1318,20 @@ void RecurrentGradientMachine::fillGenOutputs() {
|
|
|
|
starts[0] = 0;
|
|
|
|
starts[0] = 0;
|
|
|
|
if (numResults > 1) {
|
|
|
|
if (numResults > 1) {
|
|
|
|
real* probs = generator_.outArg.in->getData();
|
|
|
|
real* probs = generator_.outArg.in->getData();
|
|
|
|
|
|
|
|
real* idsProb = generator_.outArg.value->getData();
|
|
|
|
|
|
|
|
size_t curPos = 0;
|
|
|
|
for (size_t i = 0; i < finalPaths_.size(); ++i) {
|
|
|
|
for (size_t i = 0; i < finalPaths_.size(); ++i) {
|
|
|
|
for (size_t j = 0; j < finalPaths_[i].size(); ++j) {
|
|
|
|
for (size_t j = 0; j < finalPaths_[i].size(); ++j) {
|
|
|
|
Path& path = finalPaths_[i][j];
|
|
|
|
Path& path = finalPaths_[i][j];
|
|
|
|
generator_.ids.push_back(path.ids.size()); // sequence size
|
|
|
|
size_t genLen = path.ids.size();
|
|
|
|
|
|
|
|
generator_.ids.push_back(genLen); // sequence size
|
|
|
|
generator_.ids.insert(
|
|
|
|
generator_.ids.insert(
|
|
|
|
generator_.ids.end(), path.ids.begin(), path.ids.end());
|
|
|
|
generator_.ids.end(), path.ids.begin(), path.ids.end());
|
|
|
|
generator_.ids.push_back(-1); // end of sequence
|
|
|
|
generator_.ids.push_back(-1); // end of sequence
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
memcpy(idsProb + curPos, path.idsProb.data(), sizeof(real) * genLen);
|
|
|
|
|
|
|
|
curPos += genLen;
|
|
|
|
|
|
|
|
idsProb[curPos++] = -1.0;
|
|
|
|
probs[i * numResults + j] = path.logProb;
|
|
|
|
probs[i * numResults + j] = path.logProb;
|
|
|
|
|
|
|
|
|
|
|
|
if (!j && dataArgsSize_) {
|
|
|
|
if (!j && dataArgsSize_) {
|
|
|
|