-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbase_utils.py
More file actions
59 lines (49 loc) · 1.94 KB
/
base_utils.py
File metadata and controls
59 lines (49 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# -*- coding: utf-8 -*-
# @Author : morningstarwang
# @FileName: base_utils.py
# @Blog: wangchenxing.com
import tensorflow as tf
import numpy as np
def lr_fn(n_epoch, lr_reduce, base_lr=1e-2):
if n_epoch % 5 == 0 and n_epoch // 5 > 0:
return base_lr * lr_reduce
else:
return base_lr
def masked_mae_tf(preds, labels, null_val=np.nan):
if np.isnan(null_val):
mask = ~tf.math.is_nan(labels)
else:
mask = tf.not_equal(labels, null_val)
mask = tf.cast(mask, tf.float32)
mask /= tf.reduce_mean(mask)
mask = tf.where(tf.math.is_nan(mask), tf.zeros_like(mask), mask)
loss = tf.abs(tf.subtract(preds, labels))
loss = loss * mask
loss = tf.where(tf.math.is_nan(loss), tf.zeros_like(loss), loss)
return tf.reduce_mean(loss)
def masked_mse_tf(preds, labels, null_val=np.nan):
if np.isnan(null_val):
mask = ~tf.math.is_nan(labels)
else:
mask = tf.not_equal(labels, null_val)
mask = tf.cast(mask, tf.float32)
mask /= tf.reduce_mean(mask)
mask = tf.where(tf.math.is_nan(mask), tf.zeros_like(mask), mask)
loss = tf.square(tf.subtract(preds, labels))
loss = loss * mask
loss = tf.where(tf.math.is_nan(loss), tf.zeros_like(loss), loss)
return tf.reduce_mean(loss)
def masked_rmse_tf(preds, labels, null_val=np.nan):
return tf.sqrt(masked_mse_tf(preds=preds, labels=labels, null_val=null_val))
def masked_mape_tf(preds, labels, null_val=np.nan):
if np.isnan(null_val):
mask = ~tf.math.is_nan(labels)
else:
mask = tf.not_equal(labels, null_val)
mask = tf.cast(mask, tf.float32)
mask /= tf.reduce_mean(mask)
mask = tf.where(tf.math.is_nan(mask), tf.zeros_like(mask), mask)
loss = tf.abs(tf.math.divide_no_nan(tf.subtract(preds, labels), labels))
loss = loss * mask
loss = tf.where(tf.math.is_nan(loss), tf.zeros_like(loss), loss)
return tf.reduce_mean(loss)