Python math.log() Examples
The following are 30
code examples of math.log().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
math
, or try the search function
.
Example #1
Source File: id3.py From decisiontrees with MIT License | 6 votes |
def entropy(self, subset, attr, value, base=False): """ Calculate the entropy of the given attribute/value pair from the given subset. Args: subset: the subset with which to calculate entropy. attr: the attribute of the value. value: the value used in calculation. base: whether or not to calculate base entropy based solely on the dependent value (default False). Returns: A float of the entropy of the given value. """ counts = self.value_counts(subset, attr, value, base) total = float(sum(counts.values())) # Coerce to float division entropy = 0 for dv in counts: # For each dependent value proportion = counts[dv] / total entropy += -(proportion*math.log(proportion, 2)) return entropy
Example #2
Source File: accountant.py From DOTA_models with Apache License 2.0 | 6 votes |
def _compute_delta(self, log_moments, eps): """Compute delta for given log_moments and eps. Args: log_moments: the log moments of privacy loss, in the form of pairs of (moment_order, log_moment) eps: the target epsilon. Returns: delta """ min_delta = 1.0 for moment_order, log_moment in log_moments: if math.isinf(log_moment) or math.isnan(log_moment): sys.stderr.write("The %d-th order is inf or Nan\n" % moment_order) continue if log_moment < moment_order * eps: min_delta = min(min_delta, math.exp(log_moment - moment_order * eps)) return min_delta
Example #3
Source File: sampler.py From dynamic-training-with-apache-mxnet-on-aws with Apache License 2.0 | 6 votes |
def draw(self, true_classes): """Draw samples from log uniform distribution and returns sampled candidates, expected count for true classes and sampled classes.""" range_max = self.range_max num_sampled = self.num_sampled ctx = true_classes.context log_range = math.log(range_max + 1) num_tries = 0 true_classes = true_classes.reshape((-1,)) sampled_classes, num_tries = self.sampler.sample_unique(num_sampled) true_cls = true_classes.as_in_context(ctx).astype('float64') prob_true = ((true_cls + 2.0) / (true_cls + 1.0)).log() / log_range count_true = self._prob_helper(num_tries, num_sampled, prob_true) sampled_classes = ndarray.array(sampled_classes, ctx=ctx, dtype='int64') sampled_cls_fp64 = sampled_classes.astype('float64') prob_sampled = ((sampled_cls_fp64 + 2.0) / (sampled_cls_fp64 + 1.0)).log() / log_range count_sampled = self._prob_helper(num_tries, num_sampled, prob_sampled) return [sampled_classes, count_true, count_sampled]
Example #4
Source File: loss.py From torch-toolbox with BSD 3-Clause "New" or "Revised" License | 6 votes |
def __init__( self, classes, alpha, p=0.9, from_normx=False, weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean'): super(L2Softmax, self).__init__( weight, size_average, reduce, reduction) alpha_low = math.log(p * (classes - 2) / (1 - p)) assert alpha > alpha_low, "For given probability of p={}, alpha should higher than {}.".format( p, alpha_low) self.ignore_index = ignore_index self.alpha = alpha self.from_normx = from_normx
Example #5
Source File: gaussian_moments.py From DOTA_models with Apache License 2.0 | 6 votes |
def _compute_delta(log_moments, eps): """Compute delta for given log_moments and eps. Args: log_moments: the log moments of privacy loss, in the form of pairs of (moment_order, log_moment) eps: the target epsilon. Returns: delta """ min_delta = 1.0 for moment_order, log_moment in log_moments: if moment_order == 0: continue if math.isinf(log_moment) or math.isnan(log_moment): sys.stderr.write("The %d-th order is inf or Nan\n" % moment_order) continue if log_moment < moment_order * eps: min_delta = min(min_delta, math.exp(log_moment - moment_order * eps)) return min_delta
Example #6
Source File: util.py From text-rank with MIT License | 6 votes |
def get_similarity(word_list1, word_list2): """默认的用于计算两个句子相似度的函数。 Keyword arguments: word_list1, word_list2 -- 分别代表两个句子,都是由单词组成的列表 """ words = list(set(word_list1 + word_list2)) vector1 = [float(word_list1.count(word)) for word in words] vector2 = [float(word_list2.count(word)) for word in words] vector3 = [vector1[x]*vector2[x] for x in xrange(len(vector1))] vector4 = [1 for num in vector3 if num > 0.] co_occur_num = sum(vector4) if abs(co_occur_num) <= 1e-12: return 0. denominator = math.log(float(len(word_list1))) + math.log(float(len(word_list2))) # 分母 if abs(denominator) < 1e-12: return 0. return co_occur_num / denominator
Example #7
Source File: gaussian_moments.py From DOTA_models with Apache License 2.0 | 6 votes |
def _compute_eps(log_moments, delta): """Compute epsilon for given log_moments and delta. Args: log_moments: the log moments of privacy loss, in the form of pairs of (moment_order, log_moment) delta: the target delta. Returns: epsilon """ min_eps = float("inf") for moment_order, log_moment in log_moments: if moment_order == 0: continue if math.isinf(log_moment) or math.isnan(log_moment): sys.stderr.write("The %d-th order is inf or Nan\n" % moment_order) continue min_eps = min(min_eps, (log_moment - math.log(delta)) / moment_order) return min_eps
Example #8
Source File: gaussian_moments.py From DOTA_models with Apache License 2.0 | 6 votes |
def get_privacy_spent(log_moments, target_eps=None, target_delta=None): """Compute delta (or eps) for given eps (or delta) from log moments. Args: log_moments: array of (moment_order, log_moment) pairs. target_eps: if not None, the epsilon for which we would like to compute corresponding delta value. target_delta: if not None, the delta for which we would like to compute corresponding epsilon value. Exactly one of target_eps and target_delta is None. Returns: eps, delta pair """ assert (target_eps is None) ^ (target_delta is None) assert not ((target_eps is None) and (target_delta is None)) if target_eps is not None: return (target_eps, _compute_delta(log_moments, target_eps)) else: return (_compute_eps(log_moments, target_delta), target_delta)
Example #9
Source File: common_layers.py From fine-lm with MIT License | 6 votes |
def get_timing_signal(length, min_timescale=1, max_timescale=1e4, num_timescales=16): """Create Tensor of sinusoids of different frequencies. Args: length: Length of the Tensor to create, i.e. Number of steps. min_timescale: a float max_timescale: a float num_timescales: an int Returns: Tensor of shape (length, 2*num_timescales) """ positions = tf.to_float(tf.range(length)) log_timescale_increment = ( math.log(max_timescale / min_timescale) / (num_timescales - 1)) inv_timescales = min_timescale * tf.exp( tf.to_float(tf.range(num_timescales)) * -log_timescale_increment) scaled_time = tf.expand_dims(positions, 1) * tf.expand_dims(inv_timescales, 0) return tf.concat([tf.sin(scaled_time), tf.cos(scaled_time)], axis=1)
Example #10
Source File: models.py From cvpr2018-hnd with MIT License | 6 votes |
def __init__(self, T, opts): super(LOOLoss, self).__init__() self.gpu = opts.gpu self.loo = opts.loo if 'LOO' in opts.method else 0. self.label_smooth = opts.label_smooth self.kld_u_const = math.log(len(T['wnids'])) self.relevant = [torch.from_numpy(rel) for rel in T['relevant']] self.labels_relevant = torch.from_numpy(T['labels_relevant'].astype(np.uint8)) ch_slice = T['ch_slice'] if opts.class_wise: num_children = T['num_children'] num_supers = len(num_children) self.class_weight = torch.zeros(ch_slice[-1]) for m, num_ch in enumerate(num_children): self.class_weight[ch_slice[m]:ch_slice[m+1]] = 1. / (num_ch * num_supers) else: self.class_weight = torch.ones(ch_slice[-1]) / ch_slice[-1]
Example #11
Source File: blocks_entropy_coding_test.py From DOTA_models with Apache License 2.0 | 6 votes |
def testCodeLength(self): shape = [2, 4] proba_feed = [[0.65, 0.25, 0.70, 0.10], [0.28, 0.20, 0.44, 0.54]] symbol_feed = [[1.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]] mean_code_length = - ( (math.log(0.65) + math.log(0.75) + math.log(0.70) + math.log(0.90) + math.log(0.72) + math.log(0.80) + math.log(0.56) + math.log(0.54)) / math.log(2.0)) / (shape[0] * shape[1]) symbol = tf.placeholder(dtype=tf.float32, shape=shape) proba = tf.placeholder(dtype=tf.float32, shape=shape) code_length_calculator = blocks_entropy_coding.CodeLength() code_length = code_length_calculator(symbol, proba) with self.test_session(): tf.global_variables_initializer().run() code_length_eval = code_length.eval( feed_dict={symbol: symbol_feed, proba: proba_feed}) self.assertAllClose(mean_code_length, code_length_eval)
Example #12
Source File: utility.py From soccer-matlab with BSD 2-Clause "Simplified" License | 5 votes |
def diag_normal_logpdf(mean, logstd, loc): """Log density of a normal with diagonal covariance.""" constant = -0.5 * math.log(2 * math.pi) - logstd value = -0.5 * ((loc - mean) / tf.exp(logstd)) ** 2 return tf.reduce_sum(constant + value, -1)
Example #13
Source File: random_resized_crop.py From argus-freesound with MIT License | 5 votes |
def get_params(img, scale, ratio): """Get parameters for ``crop`` for a random sized crop. Args: img (PIL Image): Image to be cropped. scale (tuple): range of size of the origin size cropped ratio (tuple): range of aspect ratio of the origin aspect ratio cropped Returns: tuple: params (i, j, h, w) to be passed to ``crop`` for a random sized crop. """ area = img.size[0] * img.size[1] for attempt in range(10): target_area = random.uniform(*scale) * area log_ratio = (math.log(ratio[0]), math.log(ratio[1])) aspect_ratio = math.exp(random.uniform(*log_ratio)) w = int(round(math.sqrt(target_area * aspect_ratio))) h = int(round(math.sqrt(target_area / aspect_ratio))) if w <= img.size[0] and h <= img.size[1]: i = random.randint(0, img.size[1] - h) j = random.randint(0, img.size[0] - w) return i, j, h, w # Fallback to central crop in_ratio = img.size[0] / img.size[1] if (in_ratio < min(ratio)): w = img.size[0] h = w / min(ratio) elif (in_ratio > max(ratio)): h = img.size[1] w = h * max(ratio) else: # whole image w = img.size[0] h = img.size[1] i = (img.size[1] - h) // 2 j = (img.size[0] - w) // 2 return i, j, h, w
Example #14
Source File: dcgan.py From DeepLab_v3 with MIT License | 5 votes |
def _validate_image_inputs(inputs): inputs.get_shape().assert_has_rank(4) inputs.get_shape()[1:3].assert_is_fully_defined() if inputs.get_shape()[1] != inputs.get_shape()[2]: raise ValueError('Input tensor does not have equal width and height: ', inputs.get_shape()[1:3]) width = inputs.get_shape().as_list()[1] if log(width, 2) != int(log(width, 2)): raise ValueError('Input tensor `width` is not a power of 2: ', width) # TODO(joelshor): Use fused batch norm by default. Investigate why some GAN # setups need the gradient of gradient FusedBatchNormGrad.
Example #15
Source File: lr_scheduler.py From argus-freesound with MIT License | 5 votes |
def step(self, epoch=None): """Step could be called after every update, i.e. if one epoch has 10 iterations (number_of_train_examples / batch_size), we should call SGDR.step(0.1), SGDR.step(0.2), etc. This function can be called in an interleaved way. Example: >>> scheduler = SGDR(optimizer, T_0, T_mult) >>> for epoch in range(20): >>> scheduler.step() >>> scheduler.step(26) >>> scheduler.step() # scheduler.step(27), instead of scheduler(20) """ if epoch is None: epoch = self.last_epoch + 1 self.T_cur = self.T_cur + 1 if self.T_cur >= self.T_i: self.T_cur = self.T_cur - self.T_i self.T_i = self.T_i * self.T_mult else: if epoch >= self.T_0: if self.T_mult == 1: self.T_cur = epoch % self.T_0 else: n = int(math.log((epoch / self.T_0 * (self.T_mult - 1) + 1), self.T_mult)) self.T_cur = epoch - self.T_0 * (self.T_mult ** n - 1) / (self.T_mult - 1) self.T_i = self.T_0 * self.T_mult ** (n) else: self.T_i = self.T_0 self.T_cur = epoch self.last_epoch = math.floor(epoch) for param_group, lr in zip(self.optimizer.param_groups, self.get_lr()): param_group['lr'] = lr
Example #16
Source File: losses_test.py From object_detector_app with MIT License | 5 votes |
def testReturnsCorrectAnchorWiseLoss(self): prediction_tensor = tf.constant([[[-100, 100, -100], [100, -100, -100], [0, 0, -100], [-100, -100, 100]], [[-100, 0, 0], [-100, 100, -100], [-100, 100, -100], [100, -100, -100]]], tf.float32) target_tensor = tf.constant([[[0, 1, 0], [1, 0, 0], [1, 0, 0], [0, 0, 1]], [[0, 0, 1], [0, 1, 0], [0, 1, 0], [1, 0, 0]]], tf.float32) weights = tf.constant([[1, 1, .5, 1], [1, 1, 1, 0]], tf.float32) loss_op = losses.WeightedSoftmaxClassificationLoss(True) loss = loss_op(prediction_tensor, target_tensor, weights=weights) exp_loss = np.matrix([[0, 0, - 0.5 * math.log(.5), 0], [-math.log(.5), 0, 0, 0]]) with self.test_session() as sess: loss_output = sess.run(loss) self.assertAllClose(loss_output, exp_loss)
Example #17
Source File: losses_test.py From object_detector_app with MIT License | 5 votes |
def testReturnsCorrectLoss(self): prediction_tensor = tf.constant([[[-100, 100, -100], [100, -100, -100], [0, 0, -100], [-100, -100, 100]], [[-100, 0, 0], [-100, 100, -100], [-100, 100, -100], [100, -100, -100]]], tf.float32) target_tensor = tf.constant([[[0, 1, 0], [1, 0, 0], [1, 0, 0], [0, 0, 1]], [[0, 0, 1], [0, 1, 0], [0, 1, 0], [1, 0, 0]]], tf.float32) weights = tf.constant([[1, 1, .5, 1], [1, 1, 1, 0]], tf.float32) loss_op = losses.WeightedSoftmaxClassificationLoss() loss = loss_op(prediction_tensor, target_tensor, weights=weights) exp_loss = - 1.5 * math.log(.5) with self.test_session() as sess: loss_output = sess.run(loss) self.assertAllClose(loss_output, exp_loss)
Example #18
Source File: losses_test.py From object_detector_app with MIT License | 5 votes |
def testReturnsCorrectLossWithClassIndices(self): prediction_tensor = tf.constant([[[-100, 100, -100, 100], [100, -100, -100, -100], [100, 0, -100, 100], [-100, -100, 100, -100]], [[-100, 0, 100, 100], [-100, 100, -100, 100], [100, 100, 100, 100], [0, 0, -1, 100]]], tf.float32) target_tensor = tf.constant([[[0, 1, 0, 0], [1, 0, 0, 1], [1, 0, 0, 0], [0, 0, 1, 1]], [[0, 0, 1, 0], [0, 1, 0, 0], [1, 1, 1, 0], [1, 0, 0, 0]]], tf.float32) weights = tf.constant([[1, 1, 1, 1], [1, 1, 1, 0]], tf.float32) # Ignores the last class. class_indices = tf.constant([0, 1, 2], tf.int32) loss_op = losses.WeightedSigmoidClassificationLoss(True) loss = loss_op(prediction_tensor, target_tensor, weights=weights, class_indices=class_indices) exp_loss = np.matrix([[0, 0, -math.log(.5), 0], [-math.log(.5), 0, 0, 0]]) with self.test_session() as sess: loss_output = sess.run(loss) self.assertAllClose(loss_output, exp_loss)
Example #19
Source File: losses_test.py From object_detector_app with MIT License | 5 votes |
def testReturnsCorrectAnchorWiseLoss(self): prediction_tensor = tf.constant([[[-100, 100, -100], [100, -100, -100], [100, 0, -100], [-100, -100, 100]], [[-100, 0, 100], [-100, 100, -100], [100, 100, 100], [0, 0, -1]]], tf.float32) target_tensor = tf.constant([[[0, 1, 0], [1, 0, 0], [1, 0, 0], [0, 0, 1]], [[0, 0, 1], [0, 1, 0], [1, 1, 1], [1, 0, 0]]], tf.float32) weights = tf.constant([[1, 1, 1, 1], [1, 1, 1, 0]], tf.float32) loss_op = losses.WeightedSigmoidClassificationLoss(True) loss = loss_op(prediction_tensor, target_tensor, weights=weights) exp_loss = np.matrix([[0, 0, -math.log(.5), 0], [-math.log(.5), 0, 0, 0]]) with self.test_session() as sess: loss_output = sess.run(loss) self.assertAllClose(loss_output, exp_loss)
Example #20
Source File: losses_test.py From object_detector_app with MIT License | 5 votes |
def testReturnsCorrectLossHardBootstrapping(self): prediction_tensor = tf.constant([[[-100, 100, 0], [100, -100, -100], [100, -100, -100], [-100, -100, 100]], [[-100, -100, 100], [-100, 100, -100], [100, 100, 100], [0, 0, -1]]], tf.float32) target_tensor = tf.constant([[[0, 1, 0], [1, 0, 0], [1, 0, 0], [0, 0, 1]], [[0, 0, 1], [0, 1, 0], [1, 1, 1], [1, 0, 0]]], tf.float32) weights = tf.constant([[1, 1, 1, 1], [1, 1, 1, 0]], tf.float32) alpha = tf.constant(.5, tf.float32) loss_op = losses.BootstrappedSigmoidClassificationLoss( alpha, bootstrap_type='hard') loss = loss_op(prediction_tensor, target_tensor, weights=weights) exp_loss = -math.log(.5) with self.test_session() as sess: loss_output = sess.run(loss) self.assertAllClose(loss_output, exp_loss)
Example #21
Source File: kaldi.py From audio with BSD 2-Clause "Simplified" License | 5 votes |
def mel_scale(freq: Tensor) -> Tensor: return 1127.0 * (1.0 + freq / 700.0).log()
Example #22
Source File: kaldi.py From audio with BSD 2-Clause "Simplified" License | 5 votes |
def _get_log_energy(strided_input: Tensor, epsilon: Tensor, energy_floor: float) -> Tensor: r"""Returns the log energy of size (m) for a strided_input (m,*) """ device, dtype = strided_input.device, strided_input.dtype log_energy = torch.max(strided_input.pow(2).sum(1), epsilon).log() # size (m) if energy_floor == 0.0: return log_energy return torch.max( log_energy, torch.tensor(math.log(energy_floor), device=device, dtype=dtype))
Example #23
Source File: common_layers.py From fine-lm with MIT License | 5 votes |
def inverse_exp_decay(max_step, min_value=0.01): """Inverse-decay exponentially from 0.01 to 1.0 reached at max_step.""" inv_base = tf.exp(tf.log(min_value) / float(max_step)) step = tf.to_float(tf.train.get_global_step()) return inv_base**tf.maximum(float(max_step) - step, 0.0)
Example #24
Source File: utility.py From soccer-matlab with BSD 2-Clause "Simplified" License | 5 votes |
def diag_normal_entropy(mean, logstd): """Empirical entropy of a normal with diagonal covariance.""" constant = mean.shape[-1].value * math.log(2 * math.pi * math.e) return (constant + tf.reduce_sum(2 * logstd, 1)) / 2
Example #25
Source File: wikisum.py From fine-lm with MIT License | 5 votes |
def _rank_reference_paragraphs(wiki_title, references_content): """Rank and return reference paragraphs by tf-idf score on title tokens.""" title_tokens = _tokens_to_score(set( tokenizer.encode(text_encoder.native_to_unicode(wiki_title)))) ref_paragraph_info = [] doc_counts = collections.defaultdict(int) for ref in references_content: for paragraph in ref.split("\n"): paragraph = _normalize_text(paragraph) if cc_utils.filter_paragraph(paragraph): # Skip paragraph continue counts = _token_counts(paragraph, title_tokens) for token in title_tokens: if counts[token]: doc_counts[token] += 1 info = {"content": paragraph, "counts": counts} ref_paragraph_info.append(info) for info in ref_paragraph_info: score = 0. for token in title_tokens: term_frequency = info["counts"][token] inv_doc_frequency = ( float(len(ref_paragraph_info)) / max(doc_counts[token], 1)) score += term_frequency * math.log(inv_doc_frequency) info["score"] = score ref_paragraph_info.sort(key=lambda el: el["score"], reverse=True) return [info["content"] for info in ref_paragraph_info]
Example #26
Source File: models.py From cvpr2018-hnd with MIT License | 5 votes |
def __init__(self, T, opts): super(TDLoss, self).__init__() self.gpu = opts.gpu self.label_smooth = opts.label_smooth self.ex_smooth = opts.ex_smooth if opts.method == 'TD' else 0. self.class_wise = opts.class_wise self.novel_score = opts.novel_score self.labels_ch = torch.from_numpy(T['labels_ch']) self.labels_in = torch.from_numpy(T['labels_in'].astype(np.uint8)) self.labels_out = torch.from_numpy(T['labels_out'].astype(np.uint8)) self.root = T['root'] - len(T['wnids_leaf']) self.num_children = T['num_children'] self.ch_slice = T['ch_slice'] self.kld_u_const = [math.log(num_ch) for num_ch in self.num_children]
Example #27
Source File: common_attention.py From fine-lm with MIT License | 5 votes |
def attention_bias_proximal(length): """Bias for self-attention to encourage attention to close positions. Args: length: an integer scalar. Returns: a Tensor with shape [1, 1, length, length] """ r = tf.to_float(tf.range(length)) diff = tf.expand_dims(r, 0) - tf.expand_dims(r, 1) return tf.expand_dims(tf.expand_dims(-tf.log(1 + tf.abs(diff)), 0), 0)
Example #28
Source File: document2vec.py From Document2Vec with MIT License | 5 votes |
def _expand_from(self, corpus, prefix=None, labels=None): """ Pass through the dataset once to add the new labels to the model. These labels stand in one for each document/sentence and not for new vocabulary. """ if prefix is None: prefix = 'SENT' num_lines = sum(1 for _ in corpus) # Expand syn0 shape = (self.syn0.shape[0] + num_lines, self.syn0.shape[1]) syn0 = (np.random.random(shape).astype(self.syn0.dtype) - 0.5) syn0 /= self.layer1_size syn0[:self.syn0.shape[0]] = self.syn0 self.syn0 = syn0 index2word_start = len(self.index2word) for j, line_no in enumerate(range(num_lines)): # Expand vocab newvocab = gensim.models.doc2vec.Vocab() newvocab.index = len(self.index2word) newvocab.sample_probability = 1.0 # We insert each sentence at the root of the # Huffman tree. It's a hack. newvocab.code = [1, ] * int(math.log(line_no + 1, 2) + 1) label = Document2Vec._make_label(prefix, str(j)) self.vocab[label] = newvocab # Expand index2word self.index2word.append(label) assert len(self.index2word) == newvocab.index + 1 return index2word_start
Example #29
Source File: common_attention.py From fine-lm with MIT License | 5 votes |
def add_timing_signal_1d_given_position(x, position, min_timescale=1.0, max_timescale=1.0e4): """Adds sinusoids of diff frequencies to a Tensor, with timing position given. Args: x: a Tensor with shape [batch, length, channels] position: a Tensor with shape [batch, length] min_timescale: a float max_timescale: a float Returns: a Tensor the same shape as x. """ channels = common_layers.shape_list(x)[2] num_timescales = channels // 2 log_timescale_increment = ( math.log(float(max_timescale) / float(min_timescale)) / (tf.to_float(num_timescales) - 1)) inv_timescales = min_timescale * tf.exp( tf.to_float(tf.range(num_timescales)) * -log_timescale_increment) scaled_time = ( tf.expand_dims(tf.to_float(position), 2) * tf.expand_dims( tf.expand_dims(inv_timescales, 0), 0)) signal = tf.concat([tf.sin(scaled_time), tf.cos(scaled_time)], axis=2) signal = tf.pad(signal, [[0, 0], [0, 0], [0, tf.mod(channels, 2)]]) signal = common_layers.cast_like(signal, x) return x + signal
Example #30
Source File: common_layers.py From fine-lm with MIT License | 5 votes |
def relu_density_logit(x, reduce_dims): """logit(density(x)). Useful for histograms. Args: x: a Tensor, typically the output of tf.relu reduce_dims: a list of dimensions Returns: a Tensor """ frac = tf.reduce_mean(tf.to_float(x > 0.0), reduce_dims) scaled = tf.log(frac + math.exp(-10)) - tf.log((1.0 - frac) + math.exp(-10)) return scaled