class_docstr: SSD model is like a Tree, except with additional handling for the output layer, and
  for the prior boxes
class_docstr_tok: ["SSD","model","is","like","a","Tree",",","except","with","additional","handling","for","the","output","layer",",","and","for","the","prior","boxes"]
code: def fprop(self, inputs, inference=False, beta=0.0):
      self._prior_box_fprop()
  
      # fprop through the model base
      x = super(SSD, self).fprop(inputs, inference=inference)
  
      for tensor in x:
          self.be.convert_data(tensor, False)
  
      x = self.unnest(x)  # reorder x
  
      # for mgpu, convert to singlenode tensor
      self.distribute_tensors(x, parallelism="Disabled")
  
      x = (
          self.concat_loc.fprop(x["mbox_loc"]),
          self.concat_conf.fprop(x["mbox_conf"]),
      )
  
      # TODO: inference and no-inference return different outputs, can we normalize this somehow?
      if inference:
          outputs = self.output_layer.fprop(
              (x, self.all_prior_boxes_dev)
          )
          self.revert_tensors(self.altered_tensors)
  
          return outputs
      else:
          return (x[0], x[1], self.all_prior_boxes)
  
imports: from neon.initializers import Constant, Xavier
  from neon.transforms import Rectlin
  from neon.layers import Conv, Pooling, BranchNode
  from layer import Normalize, PriorBox, DetectionOutput, ConcatTranspose
  import numpy
  from neon.util.persist import load_obj
  from neon.layers.container import Tree
  from neon.layers.layer import Layer
  from collections import OrderedDict
  import inspect
  import re
  from neon.data.datasets import Dataset
  import os
label_desc: Use image node_id 16 for calling the SSD obj's underlying member method code with example usage: obj.fprop(inputs, inference, beta) and returns: outputs, x,  x,  self