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)
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)
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
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