41 lines
762 B
Python
41 lines
762 B
Python
# coding:utf-8
|
|
import numpy as np
|
|
|
|
EPSILON = 10e-8
|
|
|
|
|
|
class Constraint(object):
|
|
def clip(self, p):
|
|
return p
|
|
|
|
|
|
class MaxNorm(object):
|
|
def __init__(self, m=2, axis=0):
|
|
self.axis = axis
|
|
self.m = m
|
|
|
|
def clip(self, p):
|
|
norms = np.sqrt(np.sum(p**2, axis=self.axis))
|
|
desired = np.clip(norms, 0, self.m)
|
|
p = p * (desired / (EPSILON + norms))
|
|
return p
|
|
|
|
|
|
class NonNeg(object):
|
|
def clip(self, p):
|
|
p[p < 0.0] = 0.0
|
|
return p
|
|
|
|
|
|
class SmallNorm(object):
|
|
def clip(self, p):
|
|
return np.clip(p, -5, 5)
|
|
|
|
|
|
class UnitNorm(Constraint):
|
|
def __init__(self, axis=0):
|
|
self.axis = axis
|
|
|
|
def clip(self, p):
|
|
return p / (EPSILON + np.sqrt(np.sum(p**2, axis=self.axis)))
|