Обычно вы придерживаетесь правильного подхода, за исключением того, что numpy astype
не на месте Так что вместо
Y_train_class.astype(np.float32)
вам нужно иметь
Y_train_class = Y_train_class.astype(np.float32)
(в настоящее время ваш исходный Y_train_class.astype(np.float32)
не может быть эффективно выполнен).
Если ваша цель состоит в том, чтобы тренироваться с такими функциями потерь, как nn.BinaryCrossEntropy
, ваш подход к бросанию на плаву правильный, так как они ожидают, что классы 0/1 будут float32
в любом случае. В общем случае PyTorch использует uint8
тензоры вместо булевых тензоров, поэтому для получения функционального эквивалента вашего оригинального тензорного тензора вы должны использовать torch.from_numpy(Y_train_class.astype(np.uint8))
- тогда он правильно поддерживает операции маскирования, как в numpy, пример ниже
import torch
import numpy as np
test_vals = np.array([1, 3, 3])
array = np.array([True, True, False], dtype=np.bool)
print(test_vals[array])
test_vals = torch.from_numpy(test_vals)
tensor = torch.from_numpy(array.astype(np.uint8))
print(test_vals[tensor])
Наконец, насколько мне известно, в будущих версиях PyTorch появятся булевы тензоры.