RuntimeError: Невозможно вызвать numpy () для переменной, для которой требуется grad. Используйте взамен var.detach (). numpy () - PullRequest
0 голосов
/ 17 марта 2020

Я новичок в pytorch. Я пытаюсь реализовать пользовательскую функцию потерь, вычисляя абсолютное и относительное расстояние и объединяя их.

def distance(p1, p2,labels):
        """
        Returns the distance between the point sets p1 and p2
        p1 = m by d matrix containing a set of points
        p2 = m by d matrix containing a different set of points

        returns: an m-length vector containing the  distance from each point in
            p1 to the corresponding point in p2
        """
        if not np.all(p1.shape == p2.shape):
            raise ValueError("p1 and p2 must be the same shape.")
        d = p1.shape[1]

        features = np.zeros(dtype=np.float32, shape=(p1.shape[0], d * 2))
        features[:, :d] = np.abs(p1 - p2)
        features[:, d:] = (p1 + p2) / 2

        return  features 

Проблема появляется, когда я пытаюсь запустить ее, и я получаю следующую ошибку:

Файл "... строка 34, на расстоянии

features[:, :d] = np.abs(p1 - p2)

Файл "... \ Anaconda2 \ envs \ensorflow_gpuenv \ lib \ site-packages \ensorflow \ python \ util \ dispatch.py", строка 180, в целевом объекте возврата оболочки (* args, ** kwargs)

Файл "... \ lib \ site-packages \ tenorflow \ python \ ops \ math_ops.py", строка 266, в abs x = ops.convert_to_tensor (x, name = "x")

File " ... \ lib \ site-packages \ tenorflow \ python \ framework \ ops.py ", строка 1087, в convert_to_tensor, возвращать convert_to_tensor_v2 (значение, dtype, предпочитаемый_dtype, имя)

RuntimeError: Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead.

1 Ответ

0 голосов
/ 17 марта 2020

Ошибка говорит вам точно, что идет не так. Вам необходимо сначала преобразовать тензор pytorch в массив numpy. Вы можете сделать это, используя .detach (). numpy ()

Таким образом, внутри вашей функции вы можете поместить:

def distance(p1, p2, labels):
    p1 = p1.detach().numpy()
    p2 = p2.detach().numpy()
    labels = labels.detach().numpy()

Даже если учтите, что тензор предназначен для ускорения вычислений преобразование их в массив означает увеличение времени вычислений. Так что рассмотрение функций pytorch, как предлагается в комментариях, безусловно, лучший подход для подражания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...