diff --git a/paddle/gserver/evaluators/Evaluator.cpp b/paddle/gserver/evaluators/Evaluator.cpp index b1daa09062fabea433e121d2498894dbd38878e1..97b25b04c459ebe6f4e051bfd553b494905642ff 100644 --- a/paddle/gserver/evaluators/Evaluator.cpp +++ b/paddle/gserver/evaluators/Evaluator.cpp @@ -993,12 +993,14 @@ public: virtual void eval(const NeuralNetwork& nn) { for (const std::string& name : config_.input_layers()) { - std::vector> out; - auto err = nn.getLayerOutputValue(name, &out); - err.check(); - for (auto& each : out) { - LOG(INFO) << "layer=" << name << std::get<0>(each) << ":\n" - << std::get<1>(each); + auto& argu = nn.getLayer(name)->getOutput(); + std::unordered_map out; + argu.getValueString(&out); + for (auto field : {"value", "id", "sequence pos", "sub-sequence pos"}) { + auto it = out.find(field); + if (it != out.end()) { + LOG(INFO) << "layer=" << name << " " << field << ":\n" << it->second; + } } } } diff --git a/paddle/gserver/gradientmachines/NeuralNetwork.cpp b/paddle/gserver/gradientmachines/NeuralNetwork.cpp index bf76830d61f9a35a3d315e841289fdbf0dae7df7..22051e07ee0026bc3c44a8767e265a56b415b8e4 100644 --- a/paddle/gserver/gradientmachines/NeuralNetwork.cpp +++ b/paddle/gserver/gradientmachines/NeuralNetwork.cpp @@ -405,42 +405,4 @@ NeuralNetwork* NeuralNetwork::newNeuralNetwork(const std::string& name, } } -Error NeuralNetwork::getLayerOutputValue( - const std::string& layerName, - std::vector>* out) const { - auto& layers = this->config_.layers(); - auto it = std::find_if( - layers.begin(), layers.end(), [&layerName](const LayerConfig& conf) { - return conf.name() == layerName; - }); - if (it == layers.end()) { - return Error("Cannot find layer %s", layerName.c_str()); - } - auto& layer = this->getLayer(layerName); - out->reserve(4); - auto& argu = layer->getOutput(); - - if (argu.value) { - std::ostringstream os; - argu.value->print(os); - out->push_back({"value", os.str()}); - } - if (argu.ids) { - std::ostringstream os; - argu.ids->print(os, argu.ids->getSize()); - out->push_back({"ids", os.str()}); - } - if (auto startPos = argu.sequenceStartPositions) { - std::ostringstream os; - startPos->getVector(false)->print(os, startPos->getSize()); - out->push_back({"sequence pos", os.str()}); - } - if (auto subStartPos = argu.subSequenceStartPositions) { - std::ostringstream os; - subStartPos->getVector(false)->print(os, subStartPos->getSize()); - out->push_back({"sub-sequence pos", os.str()}); - } - return Error(); -} - } // namespace paddle diff --git a/paddle/gserver/gradientmachines/NeuralNetwork.h b/paddle/gserver/gradientmachines/NeuralNetwork.h index 4d277d103f143d3a2f5b1df0e99ac0dbf5239aec..25af4abcf81700e200feea806fa3daed19df1275 100644 --- a/paddle/gserver/gradientmachines/NeuralNetwork.h +++ b/paddle/gserver/gradientmachines/NeuralNetwork.h @@ -128,10 +128,6 @@ public: static NeuralNetwork* newNeuralNetwork(const std::string& name = "", NeuralNetwork* rootNetwork = nullptr); - inline Error __must_check getLayerOutputValue( - const std::string& layerName, - std::vector>* out) const; - protected: /** * The constructor of NeuralNetwork. diff --git a/paddle/gserver/layers/PrintLayer.cpp b/paddle/gserver/layers/PrintLayer.cpp index 85f52ad5debd035c403c73afc7390904428e28a7..f1f3dd412c67a9570831a3299905487c5ddacc6b 100644 --- a/paddle/gserver/layers/PrintLayer.cpp +++ b/paddle/gserver/layers/PrintLayer.cpp @@ -26,28 +26,15 @@ public: void PrintLayer::forward(PassType passType) { Layer::forward(passType); for (size_t i = 0; i != inputLayers_.size(); ++i) { - const auto& argu = getInput(i); + auto& argu = getInput(i); const std::string& name = inputLayers_[i]->getName(); - if (argu.value) { - std::ostringstream os; - argu.value->print(os); - LOG(INFO) << "layer=" << name << " value matrix:\n" << os.str(); - } - if (argu.ids) { - std::ostringstream os; - argu.ids->print(os, argu.ids->getSize()); - LOG(INFO) << "layer=" << name << " ids vector:\n" << os.str(); - } - if (auto startPos = argu.sequenceStartPositions) { - std::ostringstream os; - startPos->getVector(false)->print(os, startPos->getSize()); - LOG(INFO) << "layer=" << name << " sequence pos vector:\n" << os.str(); - } - if (auto subStartPos = argu.subSequenceStartPositions) { - std::ostringstream os; - subStartPos->getVector(false)->print(os, subStartPos->getSize()); - LOG(INFO) << "layer=" << name << " sub-sequence pos vector:\n" - << os.str(); + std::unordered_map out; + argu.getValueString(&out); + for (auto field : {"value", "id", "sequence pos", "sub-sequence pos"}) { + auto it = out.find(field); + if (it != out.end()) { + LOG(INFO) << "layer=" << name << " " << field << ":\n" << it->second; + } } } } diff --git a/paddle/parameter/Argument.cpp b/paddle/parameter/Argument.cpp index 65d01a15718ae2bebd4869eff0e5407524bc0e7c..e9de0f66987603fdfd3c84853b531330f1852896 100644 --- a/paddle/parameter/Argument.cpp +++ b/paddle/parameter/Argument.cpp @@ -602,6 +602,32 @@ void Argument::degradeSequence(const Argument& input, bool useGpu) { tgtBuf[numSequences] = numSubSequences; } +void Argument::getValueString( + std::unordered_map* out) const { + if (value) { + std::ostringstream os; + value->print(os); + out->insert({"value", os.str()}); + } + if (ids) { + std::ostringstream os; + ids->print(os, ids->getSize()); + out->insert({"ids", os.str()}); + } + if (sequenceStartPositions) { + std::ostringstream os; + sequenceStartPositions->getVector(false)->print( + os, sequenceStartPositions->getSize()); + out->insert({"sequence pos", os.str()}); + } + if (subSequenceStartPositions) { + std::ostringstream os; + subSequenceStartPositions->getVector(false)->print( + os, subSequenceStartPositions->getSize()); + out->insert({"sub-sequence pos", os.str()}); + } +} + void Argument::subArgFrom(const Argument& input, size_t offset, size_t height, diff --git a/paddle/parameter/Argument.h b/paddle/parameter/Argument.h index afd2de0202bf0f14ec3d4c5b856455a3488e41f6..c751dbb855d31d6b6a765de97aca2f5ba2aa3586 100644 --- a/paddle/parameter/Argument.h +++ b/paddle/parameter/Argument.h @@ -297,6 +297,14 @@ struct Argument { sequence has sub-sequence degrades to a sequence. */ void degradeSequence(const Argument& input, bool useGpu); + + /** + * @brief getValueString will return the argument's output in string. There + * are several kinds of output. The keys of output dictionary are 'value', + * 'id', 'sequence pos', 'sub-sequence pos'. + * @param out [out]: the return values. + */ + void getValueString(std::unordered_map* out) const; }; } // namespace paddle