Exemplo n.º 1
0
 def _build_pos_and_neg_contribs(self):
     if (self.nonlinear_mxts_mode ==
             NonlinearMxtsMode.DeepLIFT_GenomicsDefault):
         preceding_linear_layer = self.get_inputs()
         while (type(preceding_linear_layer).__name__
                in ["BatchNormalization", "NoOp"]):
             preceding_linear_layer = preceding_linear_layer.get_inputs()
         if (self.verbose):
             print("For layer " + str(self.get_name()) +
                   " the preceding linear"
                   " layer is " + str(preceding_linear_layer.get_name()) +
                   " of"
                   " type " + type(preceding_linear_layer).__name__ + ";")
         if ("Conv" in type(preceding_linear_layer).__name__):
             if (self.verbose):
                 print("In accordance with nonlinear_mxts_mode=" +
                       self.nonlinear_mxts_mode +
                       " we are setting the NonlinearMxtsMode to " +
                       NonlinearMxtsMode.Rescale)
             self.nonlinear_mxts_mode = NonlinearMxtsMode.Rescale
         elif (type(preceding_linear_layer).__name__ == "Dense"):
             if (self.verbose):
                 print("In accordance with nonlinear_mxts_mode" +
                       self.nonlinear_mxts_mode +
                       " we are setting the NonlinearMxtsMode to " +
                       NonlinearMxtsMode.RevealCancel)
             self.nonlinear_mxts_mode = NonlinearMxtsMode.RevealCancel
         else:
             raise RuntimeError("Unsure how to resolve " +
                                self.nonlinear_mxts_mode + " when the"
                                " preceding linear layer is of type"
                                " " + type(preceding_linear_layer).__name__)
     if (self.nonlinear_mxts_mode == NonlinearMxtsMode.RevealCancel):
         input_pos_contribs, input_neg_contribs =\
             self._get_input_pos_and_neg_contribs()
         input_pos_contribs = hf.pseudocount_near_zero(input_pos_contribs)
         input_neg_contribs = hf.pseudocount_near_zero(input_neg_contribs)
         input_ref = self._get_input_reference_vars()
         pos_contribs = 0.5 * (
             (self._build_activation_vars(input_ref + input_pos_contribs) -
              self._build_activation_vars(input_ref)) +
             (self._build_activation_vars(input_ref + input_neg_contribs +
                                          input_pos_contribs) -
              self._build_activation_vars(input_ref + input_neg_contribs)))
         neg_contribs = 0.5 * (
             (self._build_activation_vars(input_ref + input_neg_contribs) -
              self._build_activation_vars(input_ref)) +
             (self._build_activation_vars(input_ref + input_pos_contribs +
                                          input_neg_contribs) -
              self._build_activation_vars(input_ref + input_pos_contribs)))
         return (pos_contribs, neg_contribs)
     else:
         scale_factor = self._get_naive_rescale_factor()
         input_pos_contribs, input_neg_contribs =\
             self._get_input_pos_and_neg_contribs()
         return (input_pos_contribs * scale_factor,
                 input_neg_contribs * scale_factor)
Exemplo n.º 2
0
 def _build_pos_and_neg_contribs(self):
     if (self.nonlinear_mxts_mode==
          NonlinearMxtsMode.DeepLIFT_GenomicsDefault):
         preceding_linear_layer = self.get_inputs()
         while (type(preceding_linear_layer).__name__ in [
                "BatchNormalization", "NoOp"]):
             preceding_linear_layer = preceding_linear_layer.get_inputs()
         if (self.verbose):
             print("For layer "+str(self.get_name())+" the preceding linear"
                   " layer is "+str(preceding_linear_layer.get_name())+" of"
                   " type "+type(preceding_linear_layer).__name__+";")
         if ("Conv" in type(preceding_linear_layer).__name__):
             if (self.verbose):
                 print("In accordance with nonlinear_mxts_mode="
                       +self.nonlinear_mxts_mode+
                       " we are setting the NonlinearMxtsMode to "+
                       NonlinearMxtsMode.Rescale) 
             self.nonlinear_mxts_mode=NonlinearMxtsMode.Rescale
         elif (type(preceding_linear_layer).__name__=="Dense"):
             if (self.verbose):
                 print("In accordance with nonlinear_mxts_mode"
                       +self.nonlinear_mxts_mode+
                       " we are setting the NonlinearMxtsMode to "+
                       NonlinearMxtsMode.RevealCancel) 
             self.nonlinear_mxts_mode=NonlinearMxtsMode.RevealCancel
         else:
             raise RuntimeError("Unsure how to resolve "
                                +self.nonlinear_mxts_mode+" when the"
                                " preceding linear layer is of type"
                                " "+type(preceding_linear_layer).__name__)
     if (self.nonlinear_mxts_mode == NonlinearMxtsMode.RevealCancel): 
         input_pos_contribs, input_neg_contribs =\
             self._get_input_pos_and_neg_contribs()
         input_pos_contribs = hf.pseudocount_near_zero(input_pos_contribs)
         input_neg_contribs = hf.pseudocount_near_zero(input_neg_contribs)
         input_ref = self._get_input_reference_vars() 
         pos_contribs = 0.5*(
             (self._build_activation_vars(input_ref+input_pos_contribs)
              - self._build_activation_vars(input_ref))
            +(self._build_activation_vars(
               input_ref+input_neg_contribs+input_pos_contribs)
              - self._build_activation_vars(input_ref+input_neg_contribs)))
         neg_contribs = 0.5*(
             (self._build_activation_vars(input_ref+input_neg_contribs)
              - self._build_activation_vars(input_ref))
            +(self._build_activation_vars(
               input_ref+input_pos_contribs+input_neg_contribs)
              - self._build_activation_vars(input_ref+input_pos_contribs)))
         return (pos_contribs, neg_contribs)
     else:
         scale_factor = self._get_naive_rescale_factor() 
         input_pos_contribs, input_neg_contribs =\
             self._get_input_pos_and_neg_contribs()
         return (input_pos_contribs*scale_factor,
                 input_neg_contribs*scale_factor)
Exemplo n.º 3
0
 def _get_mxts_increments_for_inputs(self):
     if (self.nonlinear_mxts_mode == NonlinearMxtsMode.DeconvNet):
         #apply the given nonlinearity in reverse
         pos_mxts = self._build_activation_vars(self.get_pos_mxts())
         neg_mxts = self._build_activation_vars(self.get_neg_mxts())
     else:
         #all the other ones here are of the form:
         # scale_factor*self.get_mxts()
         # recall that for all modes except RevealCancel, the treatment
         # of positive and negative terms is the same (and if RevealCancel
         # occurs nowhere, then pos_mxts=neg_mxts
         if (self.nonlinear_mxts_mode == NonlinearMxtsMode.Rescale):
             scale_factor = self._get_naive_rescale_factor()
             pos_scale_factor = scale_factor
             neg_scale_factor = scale_factor
         elif (self.nonlinear_mxts_mode ==
               NonlinearMxtsMode.GuidedBackpropRescale):
             naive_scale_factor = self._get_naive_rescale_factor()
             pos_scale_factor = (naive_scale_factor *
                                 hf.gt_mask(self.get_pos_mxts(), 0.0))
             neg_scale_factor = (naive_scale_factor *
                                 hf.gt_mask(self.get_neg_mxts(), 0.0))
         elif (self.nonlinear_mxts_mode == NonlinearMxtsMode.Gradient):
             scale_factor = self._gradients_get_scale_factor()
             pos_scale_factor = scale_factor
             neg_scale_factor = scale_factor
         elif (self.nonlinear_mxts_mode == NonlinearMxtsMode.GuidedBackprop
               ):
             scale_factor = self._gradients_get_scale_factor()\
                             *hf.gt_mask(self.get_pos_mxts(),0.0)
             pos_scale_factor = scale_factor
             neg_scale_factor = scale_factor
         elif (self.nonlinear_mxts_mode == NonlinearMxtsMode.RevealCancel):
             pos_contribs, neg_contribs = self.get_pos_and_neg_contribs()
             input_pos_contribs, input_neg_contribs =\
                 self._get_input_pos_and_neg_contribs()
             pos_scale_factor = (
                 pos_contribs /
                 hf.pseudocount_near_zero(input_pos_contribs))
             neg_scale_factor = (
                 neg_contribs /
                 hf.pseudocount_near_zero(input_neg_contribs))
         elif (self.nonlinear_mxts_mode == NonlinearMxtsMode.PassThrough):
             pos_scale_factor = 1.0
             neg_scale_factor = 1.0
         else:
             raise RuntimeError("Unsupported nonlinear_mxts_mode: " +
                                str(self.nonlinear_mxts_mode))
         pos_mxts = pos_scale_factor * self.get_pos_mxts()
         neg_mxts = neg_scale_factor * self.get_neg_mxts()
     return pos_mxts, neg_mxts
Exemplo n.º 4
0
 def _get_mxts_increments_for_inputs(self):
     if (self.nonlinear_mxts_mode==NonlinearMxtsMode.DeconvNet):
         #apply the given nonlinearity in reverse
         pos_mxts = self._build_activation_vars(self.get_pos_mxts())
         neg_mxts = self._build_activation_vars(self.get_neg_mxts())
     else:
         #all the other ones here are of the form:
         # scale_factor*self.get_mxts()
         # recall that for all modes except RevealCancel, the treatment
         # of positive and negative terms is the same (and if RevealCancel
         # occurs nowhere, then pos_mxts=neg_mxts
         if (self.nonlinear_mxts_mode==NonlinearMxtsMode.Rescale): 
             scale_factor = self._get_naive_rescale_factor()
             pos_scale_factor = scale_factor
             neg_scale_factor = scale_factor
         elif (self.nonlinear_mxts_mode==
               NonlinearMxtsMode.GuidedBackpropRescale):
             naive_scale_factor = self._get_naive_rescale_factor() 
             pos_scale_factor = (naive_scale_factor*
                                 hf.gt_mask(self.get_pos_mxts(),0.0))
             neg_scale_factor = (naive_scale_factor*
                                 hf.gt_mask(self.get_neg_mxts(),0.0))
         elif (self.nonlinear_mxts_mode==NonlinearMxtsMode.Gradient):
             scale_factor = self._gradients_get_scale_factor() 
             pos_scale_factor = scale_factor
             neg_scale_factor = scale_factor
         elif (self.nonlinear_mxts_mode==NonlinearMxtsMode.GuidedBackprop):
             scale_factor = self._gradients_get_scale_factor()\
                             *hf.gt_mask(self.get_pos_mxts(),0.0)
             pos_scale_factor = scale_factor
             neg_scale_factor = scale_factor
         elif (self.nonlinear_mxts_mode==NonlinearMxtsMode.RevealCancel):
             pos_contribs, neg_contribs = self.get_pos_and_neg_contribs()
             input_pos_contribs, input_neg_contribs =\
                 self._get_input_pos_and_neg_contribs()
             pos_scale_factor = (
              pos_contribs/hf.pseudocount_near_zero(input_pos_contribs)) 
             neg_scale_factor = (
              neg_contribs/hf.pseudocount_near_zero(input_neg_contribs))
         elif (self.nonlinear_mxts_mode==NonlinearMxtsMode.PassThrough):
             pos_scale_factor = 1.0 
             neg_scale_factor = 1.0
         else: 
             raise RuntimeError("Unsupported nonlinear_mxts_mode: "
                                +str(self.nonlinear_mxts_mode))
         pos_mxts = pos_scale_factor*self.get_pos_mxts()
         neg_mxts = neg_scale_factor*self.get_neg_mxts()
     return pos_mxts, neg_mxts