提交 86543f7f 编写于 作者: Y yangyaming

Follow comments.

上级 3a0919ba
...@@ -478,6 +478,6 @@ Detection output Layer ...@@ -478,6 +478,6 @@ Detection output Layer
====================== ======================
detection_output detection_output
--- ----------------
.. autoclass:: paddle.v2.layer.detection_output .. autoclass:: paddle.v2.layer.detection_output
:noindex: :noindex:
...@@ -22,14 +22,14 @@ limitations under the License. */ ...@@ -22,14 +22,14 @@ limitations under the License. */
namespace paddle { namespace paddle {
/** /**
* The detection output layer for a SSD detection task. This layer apply the * The detection output layer for a SSD detection task. This layer applies the
* Non-maximum suppression to the all predicted bounding box and keep the * Non-maximum suppression to the all predicted bounding box and keeps the
* Top-K bounding boxes. * Top-K bounding boxes.
* - Input: This layer needs three input layers: This first input layer * - Input: This layer needs three input layers: The first input layer
* is the priorbox layer. The rest two input layers are convolution * is the priorbox layer. The rest two input layers are convolution
* layers for generating bbox location offset and the classification * layers for generating bbox location offset and the classification
* confidence. * confidence.
* - Output: The predict bounding box location. * - Output: The predict bounding box locations.
*/ */
class DetectionOutputLayer : public Layer { class DetectionOutputLayer : public Layer {
......
...@@ -258,8 +258,7 @@ void MultiBoxLossLayer::forward(PassType passType) { ...@@ -258,8 +258,7 @@ void MultiBoxLossLayer::forward(PassType passType) {
} }
real loss = locLoss_ + confLoss_; real loss = locLoss_ + confLoss_;
MatrixPtr outV = getOutputValue(); MatrixPtr outV = getOutputValue();
std::vector<real> tmp(batchSize, loss); outV->assign(loss);
outV->copyFrom(&tmp[0], batchSize);
} }
void MultiBoxLossLayer::backward(const UpdateCallback& callback) { void MultiBoxLossLayer::backward(const UpdateCallback& callback) {
...@@ -336,6 +335,9 @@ void MultiBoxLossLayer::backward(const UpdateCallback& callback) { ...@@ -336,6 +335,9 @@ void MultiBoxLossLayer::backward(const UpdateCallback& callback) {
const MatrixPtr inLocG = getInputGrad(*getLocInputLayer(n)); const MatrixPtr inLocG = getInputGrad(*getLocInputLayer(n));
const MatrixPtr inConfG = getInputGrad(*getConfInputLayer(n)); const MatrixPtr inConfG = getInputGrad(*getConfInputLayer(n));
size_t height = getInput(*getLocInputLayer(n)).getFrameHeight(); size_t height = getInput(*getLocInputLayer(n)).getFrameHeight();
// only for unittest, there are no width and height information
// when constructing matrix in unittest, so we should
// set the shape in configuration
if (!height) height = layerConf.height(); if (!height) height = layerConf.height();
size_t width = getInput(*getLocInputLayer(n)).getFrameWidth(); size_t width = getInput(*getLocInputLayer(n)).getFrameWidth();
if (!width) width = layerConf.width(); if (!width) width = layerConf.width();
......
...@@ -30,7 +30,7 @@ namespace paddle { ...@@ -30,7 +30,7 @@ namespace paddle {
* The loss is composed by the location loss and the confidence loss. * The loss is composed by the location loss and the confidence loss.
* The location loss is a smooth L1 loss and the confidence loss is * The location loss is a smooth L1 loss and the confidence loss is
* a softmax loss. * a softmax loss.
* - Input: This layer need four input layers: This first input layer * - Input: This layer needs four input layers: The first input layer
* is the priorbox layer and the second layer is a label layer. * is the priorbox layer and the second layer is a label layer.
* The rest two input layers are convolution layers for generating * The rest two input layers are convolution layers for generating
* bbox location offset and the classification confidence. * bbox location offset and the classification confidence.
......
...@@ -1072,10 +1072,10 @@ def multibox_loss_layer(input_loc, ...@@ -1072,10 +1072,10 @@ def multibox_loss_layer(input_loc,
:param name: The Layer Name. :param name: The Layer Name.
:type name: basestring :type name: basestring
:param input_loc: The input predict location. :param input_loc: The input predict locations.
:type input_loc: LayerOutput :type input_loc: LayerOutput | List of LayerOutput
:param input_conf: The input priorbox confidence. :param input_conf: The input priorbox confidence.
:type input_conf: LayerOutput :type input_conf: LayerOutput | List of LayerOutput
:param priorbox: The input priorbox location and the variance. :param priorbox: The input priorbox location and the variance.
:type priorbox: LayerOutput :type priorbox: LayerOutput
:param label: The input label. :param label: The input label.
...@@ -1146,10 +1146,10 @@ def detection_output_layer(input_loc, ...@@ -1146,10 +1146,10 @@ def detection_output_layer(input_loc,
:param name: The Layer Name. :param name: The Layer Name.
:type name: basestring :type name: basestring
:param input_loc: The input predict location. :param input_loc: The input predict locations.
:type input_loc: LayerOutput :type input_loc: LayerOutput | List of LayerOutput.
:param input_conf: The input priorbox confidence. :param input_conf: The input priorbox confidence.
:type input_conf: LayerOutput :type input_conf: LayerOutput | List of LayerOutput.
:param priorbox: The input priorbox location and the variance. :param priorbox: The input priorbox location and the variance.
:type priorbox: LayerOutput :type priorbox: LayerOutput
:param num_classes: The number of the classification. :param num_classes: The number of the classification.
...@@ -1166,22 +1166,20 @@ def detection_output_layer(input_loc, ...@@ -1166,22 +1166,20 @@ def detection_output_layer(input_loc,
:type background_id: int :type background_id: int
:return: LayerOutput :return: LayerOutput
""" """
input_loc_num = 0
input_conf_num = 0
if isinstance(input_loc, LayerOutput): if isinstance(input_loc, LayerOutput):
input_loc = [input_loc] input_loc = [input_loc]
assert isinstance(input_loc, collections.Sequence) # list or tuple assert isinstance(input_loc, collections.Sequence) # list or tuple
for each in input_loc: for each in input_loc:
assert isinstance(each, LayerOutput) assert isinstance(each, LayerOutput)
input_loc_num += 1 input_loc_num = len(input_loc)
if isinstance(input_conf, LayerOutput): if isinstance(input_conf, LayerOutput):
input_conf = [input_conf] input_conf = [input_conf]
assert isinstance(input_conf, collections.Sequence) # list or tuple assert isinstance(input_conf, collections.Sequence) # list or tuple
for each in input_conf: for each in input_conf:
assert isinstance(each, LayerOutput) assert isinstance(each, LayerOutput)
input_conf_num += 1 input_conf_num = len(input_conf)
# Check the input layer number. # Check the input layer number.
assert input_loc_num == input_conf_num assert input_loc_num == input_conf_num
......
type: "nn"
layers {
name: "input_loc"
type: "data"
size: 16
active_type: ""
height: 16
width: 1
}
layers {
name: "input_conf"
type: "data"
size: 8
active_type: ""
height: 1
width: 8
}
layers {
name: "priorbox"
type: "data"
size: 32
active_type: ""
height: 4
width: 8
}
layers {
name: "test_detection_output"
type: "detection_output"
size: 1400
active_type: ""
inputs {
input_layer_name: "priorbox"
detection_output_conf {
num_classes: 21
nms_threshold: 0.45
nms_top_k: 400
background_id: 0
input_num: 1
keep_top_k: 200
confidence_threshold: 0.01
}
}
inputs {
input_layer_name: "input_loc"
}
inputs {
input_layer_name: "input_conf"
}
}
input_layer_names: "priorbox"
input_layer_names: "input_loc"
input_layer_names: "input_conf"
output_layer_names: "test_detection_output"
sub_models {
name: "root"
layer_names: "input_loc"
layer_names: "input_conf"
layer_names: "priorbox"
layer_names: "test_detection_output"
input_layer_names: "priorbox"
input_layer_names: "input_loc"
input_layer_names: "input_conf"
output_layer_names: "test_detection_output"
is_recurrent_layer_group: false
}
type: "nn"
layers {
name: "input_loc"
type: "data"
size: 16
active_type: ""
height: 16
width: 1
}
layers {
name: "input_conf"
type: "data"
size: 8
active_type: ""
height: 1
width: 8
}
layers {
name: "priorbox"
type: "data"
size: 32
active_type: ""
height: 4
width: 8
}
layers {
name: "label"
type: "data"
size: 24
active_type: ""
height: 4
width: 6
}
layers {
name: "test_multibox_loss"
type: "multibox_loss"
size: 1
active_type: ""
inputs {
input_layer_name: "priorbox"
multibox_loss_conf {
num_classes: 21
overlap_threshold: 0.5
neg_pos_ratio: 3.0
neg_overlap: 0.5
background_id: 0
input_num: 1
}
}
inputs {
input_layer_name: "label"
}
inputs {
input_layer_name: "input_loc"
}
inputs {
input_layer_name: "input_conf"
}
}
input_layer_names: "priorbox"
input_layer_names: "label"
input_layer_names: "input_loc"
input_layer_names: "input_conf"
output_layer_names: "test_multibox_loss"
sub_models {
name: "root"
layer_names: "input_loc"
layer_names: "input_conf"
layer_names: "priorbox"
layer_names: "label"
layer_names: "test_multibox_loss"
input_layer_names: "priorbox"
input_layer_names: "label"
input_layer_names: "input_loc"
input_layer_names: "input_conf"
output_layer_names: "test_multibox_loss"
is_recurrent_layer_group: false
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册