Guest User

Untitled

a guest
Feb 21st, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.35 KB | None | 0 0
  1. from keras.objectives import *
  2. import keras_contrib.backend as KC
  3.  
  4. class DSSIM_TD():
  5. def __init__(self, k1=0.01, k2=0.03, kernel_size=3, max_value=1.0,n_imgs=0):
  6. """
  7. A Timedistributed Version Difference of Structural Similarity (DSSIM loss function). Clipped between 0 and 0.5
  8. Note : You should add a regularization term like a l2 loss in addition to this one.
  9. Note : In theano, the `kernel_size` must be a factor of the output size. So 3 could
  10. not be the `kernel_size` for an output of 32.
  11. # Arguments
  12. k1: Parameter of the SSIM (default 0.01)
  13. k2: Parameter of the SSIM (default 0.03)
  14. kernel_size: Size of the sliding window (default 3)
  15. max_value: Max value of the output (default 1.0)
  16. n_imgs: Number of prediected Images in each sample
  17. """
  18. self.__name__ = 'DSSIMObjective_TD'
  19. self.kernel_size = kernel_size
  20. self.k1 = k1
  21. self.k2 = k2
  22. self.max_value = max_value
  23. self.c1 = (self.k1 * self.max_value) ** 2
  24. self.c2 = (self.k2 * self.max_value) ** 2
  25. self.dim_ordering = K.image_data_format()
  26. self.backend = KC.backend()
  27. self.n_imgs=n_imgs
  28. if n_imgs==0:
  29. raise ValueError('n_imgs can\'t equal zero,use DSSIMObjective instead')
  30.  
  31. def __int_shape(self, x):
  32. return KC.int_shape(x) if self.backend == 'tensorflow' else KC.shape(x)
  33.  
  34. def __call__(self, y_true_o, y_pred_o):
  35.  
  36. # There are additional parameters for this function
  37. # Note: some of the 'modes' for edge behavior do not yet have a gradient definition in the Theano tree
  38. # and cannot be used for learning
  39.  
  40. kernel = [self.kernel_size, self.kernel_size]
  41. ks=[]
  42.  
  43. total_t=self.max_value*self.n_imgs
  44.  
  45. for in_image in range(0,self.n_imgs):
  46. y_true=y_true_o[:,in_image]
  47. y_pred=y_pred_o[:,in_image]
  48.  
  49. y_true = KC.reshape(y_true, [-1] + list(self.__int_shape(y_pred)[1:]))
  50. y_pred = KC.reshape(y_pred, [-1] + list(self.__int_shape(y_pred)[1:]))
  51.  
  52.  
  53. patches_pred = KC.extract_image_patches(y_pred, kernel, kernel, 'valid', self.dim_ordering)
  54. patches_true = KC.extract_image_patches(y_true, kernel, kernel, 'valid', self.dim_ordering)
  55.  
  56. # Reshape to get the var in the cells
  57. bs, w, h, c1, c2, c3 = self.__int_shape(patches_pred)
  58. patches_pred = KC.reshape(patches_pred, [-1, w, h, c1 * c2 * c3])
  59. patches_true = KC.reshape(patches_true, [-1, w, h, c1 * c2 * c3])
  60. # Get mean
  61. u_true = KC.mean(patches_true, axis=-1)
  62. u_pred = KC.mean(patches_pred, axis=-1)
  63. # Get variance
  64. var_true = K.var(patches_true, axis=-1)
  65. var_pred = K.var(patches_pred, axis=-1)
  66. # Get std dev
  67. covar_true_pred = K.mean(patches_true * patches_pred, axis=-1) - u_true * u_pred
  68.  
  69. ssim = (2 * u_true * u_pred + self.c1) * (2 * covar_true_pred + self.c2)
  70. denom = (K.square(u_true) + K.square(u_pred) + self.c1) * (var_pred + var_true + self.c2)
  71. ssim /= denom # no need for clipping, c1 and c2 make the denom non-zero
  72. ks.append(K.mean((1.0 - ssim) / 2.0))
  73. all_summed=0
  74. for i in ks:
  75. all_summed+=i
  76. return all_summed/total_t
Add Comment
Please, Sign In to add comment