Разница в типе массива с использованием NumPy и Cupy - PullRequest
0 голосов
/ 21 ноября 2018

Я использую библиотеку цепочек для своей модели и сталкиваюсь со следующей проблемой: скажем, у меня есть файл тестовых данных, содержащий 3 функции и метку (последний столбец) с ними.Импортируется в виде списка.например,

test_set = [[1,0,9,1],[7,0,8,1],[7,0,2,0],[8,0,1,0]]

Затем я беру метки, конвертируя данные в массив с пустыми значениями и беря столбец меток, который я позже преобразовываю в список для сравнения с предсказанными метками, скажем, y_pred = [1,1,1,0].т.е.

import numpy as np
y_true_np = list(np.array(test_set)[:,3])
print(y_true_np)
[1, 1, 0, 0]

Меня беспокоит то, что когда я запускаю свою модель в графическом процессоре, она использует Cuda.cupy вместо numpy, когда я использую библиотеку цепей, и когда я получаю истинные метки, я получаю их как:

Там в Cupy:

import cupy as cp
y_true_cp = list(cp.array(test_set)[:,3]) Or
y_true_cp = list(cuda.cp.array(test_set)[:,3])

Оба возвращают список массивов:

y_true_cp: [array(1), array(1), array(0), array(0)]

В качестве обходного пути я использую numpy в этом конкретном месте.Я что-то не так делаю при использовании cupy, из-за чего я не получаю значения правильно?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

В то время как NumPy преобразует 0-мерные массивы в скаляры, CuPy - нет.https://docs -cupy.chainer.org / ru / stable / reference / diff.html # нульмерный массив

В результате [array(1), array(1), array(0), array(0)] все данные массивов включеныGPU.Я бы использовал cupy.asnumpy, если требуется эффективный массив ЦП.

y_true_cp = list(cp.asnumpy(cp.array(test_set)[:,3]))

0 голосов
/ 22 ноября 2018

Нет необходимости проходить через numpy.

Вход

import cupy as cp

test_set = [[1,0,9,1],[7,0,8,1],[7,0,2,0],[8,0,1,0]]
test_set = cp.array(test_set)

x_true = test_set[:, :3]
y_true = test_set[:, 3]
print("x_true:\n".format(x_true))
print("y_true:\n".format(y_true))

Выход

x_true:
[[1 0 9]
 [7 0 8]
 [7 0 2]
 [8 0 1]]
y_true:
[1 1 0 0]
0 голосов
/ 22 ноября 2018

Как вы писали, кажется, что поведение при переносе по list отличается

import numpy as np
import cupy as cp

print(list(np.arange(3))  # --> [0, 1, 2]
print(list(cp.arange(3))  # --> [array(0), array(1), array(2)]

Однако в вашем случае, я думаю, вы можете просто использовать массив numpy или cupy безпреобразование list.

y_true = test_set[:, 3]  # it should work for both numpy & cupy
y_true_np = cuda.to_cpu(y_true)  # If you want to convert the array to numpy
...