Как сделать функцию потерь для двух координат в сфере (используя расстояние большого круга) - PullRequest
0 голосов
/ 01 марта 2020

Я хочу сделать прогноз траектории на карте. Траектории сформированы (long, lat). Поэтому я определил функцию потерь самостоятельно. Код выглядит следующим образом (с использованием RNN в Pytorch):

def hav(self, theta):
    s = torch.sin(theta / 2)
    return s * s

def get_distance_hav(self, lng0, lat0, lng1, lat1):
    EARTH_RADIUS = 6371.   

    lat0 = lat0 * np.pi / 180
    lat1 = lat1 * np.pi / 180
    lng0 = lng0 * np.pi / 180
    lng1 = lng1 * np.pi / 180

    dlng = torch.abs(lng0 - lng1)
    dlat = torch.abs(lat0 - lat1)
    h = self.hav(dlat) + torch.cos(lat0) * torch.cos(lat1) * self.hav(dlng)
    return h

def GCDLoss(self, x, y):
    x = 100 * x; y = 100 * y
    DisTotal = torch.tensor(0., requires_grad=True)
    dis = self.get_distance_hav(x[:, :, 0], x[:, :, 1], y[:, :, 0], y[:, :, 1]).sum()
    DisTotal = DisTotal + dis 

    return DisTotal

Я использую оптимизатор Adam, но потери легко go NAN. И я всегда становлюсь все больше и больше с эпохами. Как решить эту проблему? Thx!

...