From e4f1938426dc612721d0e97716def791fa185b90 Mon Sep 17 00:00:00 2001 From: "jijoong.moon" Date: Mon, 9 Nov 2020 10:10:01 +0900 Subject: [PATCH] [ LAYER ] Expose Output Layer It is not enough to support various connection in network if we support output layer only in implicitly. This PR includes eanbling output layer explicitly. **Self evaluation:** 1. Build test: [X]Passed [ ]Failed [ ]Skipped 2. Run test: [X]Passed [ ]Failed [ ]Skipped Signed-off-by: jijoong.moon --- nntrainer/graph/network_graph.cpp | 49 ++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/nntrainer/graph/network_graph.cpp b/nntrainer/graph/network_graph.cpp index 4abb0bf..6272f53 100644 --- a/nntrainer/graph/network_graph.cpp +++ b/nntrainer/graph/network_graph.cpp @@ -212,6 +212,15 @@ int NetworkGraph::realizeActivationType( layer->input_layers.clear(); layer->input_layers.push_back(current.getName()); + layer->num_outputs = current.num_outputs; + layer->output_layers.clear(); + for (unsigned int i = 0; i < current.num_outputs; ++i) + layer->output_layers.push_back(current.output_layers[i]); + + current.num_outputs = 1; + current.output_layers.clear(); + current.output_layers.push_back(layer->getName()); + addLayerNode(layer); for (unsigned int i = 0; i < layers.size(); ++i) { @@ -263,6 +272,11 @@ int NetworkGraph::addLossLayer(const LossType loss_type) { ensureName(layer); + LayerNode last_node = getLayerNode(num_node - 1); + last_node.layer->num_outputs = 1; + last_node.layer->output_layers.clear(); + last_node.layer->output_layers.push_back(layer->getName()); + layer->num_inputs = 1; layer->input_layers.clear(); layer->input_layers.push_back(input_str); @@ -276,17 +290,20 @@ void NetworkGraph::setOutputLayers(std::vector> layers) { for (unsigned int idx = 0; idx < layers.size(); ++idx) { unsigned int count = 0; + std::cout << layers[idx]->getName() << " : "; for (unsigned int i = 0; i < layers.size(); ++i) { if (layers[i]->getName() == layers[idx]->getName()) continue; for (unsigned int j = 0; j < layers[i]->input_layers.size(); ++j) { if (layers[i]->input_layers[j] == layers[idx]->getName()) { - layers[idx]->output_layers.push_back(layers[i]->input_layers[j]); + layers[idx]->output_layers.push_back(layers[i]->getName()); + std::cout << layers[idx]->output_layers[count] << ", "; count++; } } } layers[idx]->num_outputs = count; + std::cout << std::endl; } } @@ -363,14 +380,14 @@ int NetworkGraph::setGraphNode(std::vector> layers, addLossLayer(loss_type); - std::list::iterator iter; - for (unsigned int i = 0; i < adj.size(); ++i) { - iter = adj[i].begin(); - for (unsigned int j = 0; j < (*iter).layer->input_layers.size(); ++j) - std::cout << " " << (*iter).layer->input_layers[j] << std::endl; - std::cout << (*iter).index << " : " << (*iter).layer->getName() - << std::endl; - } + // std::list::iterator iter; + // for (unsigned int i = 0; i < adj.size(); ++i) { + // iter = adj[i].begin(); + // for (unsigned int j = 0; j < (*iter).layer->input_layers.size(); ++j) + // std::cout << " " << (*iter).layer->input_layers[j] << std::endl; + // std::cout << (*iter).index << " : " << (*iter).layer->getName() + // << std::endl; + // } return status; } @@ -409,8 +426,18 @@ int NetworkGraph::setEdge() { for (unsigned int i = 0; i < adj.size(); ++i) { std::list::iterator iter; - std::cout << i << " : " << getLayerNode(i).layer->getName() << std::endl; - ; + std::cout << i << " : " << getLayerNode(i).layer->getName() << " (" + << getLayerNode(i).layer->num_inputs << " "; + for (unsigned int j = 0; j < getLayerNode(i).layer->input_layers.size(); + ++j) + std::cout << getLayerNode(i).layer->input_layers[j] << ", "; + + std::cout << " --> " << getLayerNode(i).layer->num_outputs << " "; + for (unsigned int j = 0; j < getLayerNode(i).layer->output_layers.size(); + ++j) + std::cout << getLayerNode(i).layer->output_layers[j] << ", "; + + std::cout << " )" << std::endl; for (iter = std::next(adj[i].begin()); iter != adj[i].end(); ++iter) { std::cout << " " << (*iter).layer->getName(); -- 2.7.4