-
Notifications
You must be signed in to change notification settings - Fork 42
/
Copy pathloss.py
47 lines (41 loc) · 1.68 KB
/
loss.py
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
#tensorflow 1.2.0 is needed
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import os
import time
import cv2
from scipy import io
import tensorflow as tf
import utils as utils
def smoothL1_loss(x, y, sigma=0.05):
x_y = tf.abs(x - y)
less_mask = tf.less(x_y, sigma)
greater_mask = tf.greater_equal(x_y, sigma)
loss = 0.5 * tf.reduce_mean(tf.square(tf.boolean_mask(x_y, less_mask))) + sigma * tf.reduce_mean(tf.boolean_mask(x_y - 0.5*sigma, greater_mask))
return loss
def compute_error(real,fake):
return tf.reduce_mean(tf.abs(fake-real))
def Lp_loss(x, y):
vgg_real = utils.build_vgg19(x * 255.0)
vgg_fake = utils.build_vgg19(y * 255.0,reuse=True)
p0=compute_error(vgg_real['input'] , vgg_fake['input'] )
p1=compute_error(vgg_real['conv1_2'] , vgg_fake['conv1_2'] ) / 2.6
p2=compute_error(vgg_real['conv2_2'] , vgg_fake['conv2_2'] ) / 4.8
p3=compute_error(vgg_real['conv3_2'] , vgg_fake['conv3_2'] ) / 3.7
p4=compute_error(vgg_real['conv4_2'] , vgg_fake['conv4_2']) / 5.6
p5=compute_error(vgg_real['conv5_2'] , vgg_fake['conv5_2']) * 10 / 1.5
return p0+p1+p2+p3+p4+p5
def RankDiverse_loss(x, y, num):
loss = []
for i in range(num):
loss.append(Lp_loss(x[:,:,:,3*i:3*i+3], y[:,:,:,3*i:3*i+3]))
return tf.reduce_min(loss) + tf.reduce_sum([0.01*pow(2, num-i)*loss[i] for i in range(num)])
def L1_loss(x, y):
return tf.reduce_mean(tf.abs(x-y))
def KNN_loss(out, KNN_idxs):
out = tf.reshape(out, [-1,3])
loss = []
for i in range(KNN_idxs.get_shape()[-1]):
loss.append(L1_loss(out, tf.gather_nd(out, KNN_idxs[:,i:i+1])))
return tf.reduce_mean(loss)