web-dev-qa-db-fra.com

Pytorch débutant: méthode tensor.new

tout le monde, j'ai une petite question.

Quel est le but de la méthode tensor.new(..) dans Pytorch, je n'ai rien trouvé dans la documentation. Il semble qu'il crée un nouveau tenseur (comme son nom l'indique), mais pourquoi nous n'utilisons pas simplement torch.Tensor constructeurs au lieu d'utiliser cette nouvelle méthode qui nécessite un tenseur existant.

Merci d'avance.

13
abcdaire

Comme le dit la documentation de tensor.new () :

Construit un nouveau tenseur du même type de données que auto tenseur.

Notez également:

Pour les tenseurs CUDA, cette méthode créera un nouveau tenseur sur le même appareil que ce tenseur.

13
Wasi Ahmad

Voici un cas d'utilisation simple et un exemple utilisant new(), car sans cela l'utilité de cette fonction n'est pas très claire.

Supposons que vous souhaitiez ajouter du bruit gaussien à un tenseur (ou variable) sans savoir a priori de quel type de données il s'agit.

Cela créera un tenseur de bruit gaussien, de la même forme et du même type de données qu'une variable X:

 noise_like_grad = X.data.new(X.size()).normal_(0,0.01)

Cet exemple illustre également l'utilisation de new(size), de sorte que nous obtenons un tenseur de même type et de même taille que X.

2
AruniRC

Il semble que dans les nouvelles versions de PyTorch, il existe un tas de différentes méthodes new_* Qui sont destinées à remplacer cette méthode "héritée" new.

Donc, si vous avez un tenseur t = torch.randn((3, 4)), vous pouvez en construire un nouveau avec le même type et le même périphérique en utilisant l'une de ces méthodes, en fonction de vos objectifs:

t = torch.randn((3, 4))
a = t.new_tensor([1, 2, 3])  # same type, device, new data
b = t.new_empty((3, 4))      # same type, device, non-initialized
c = t.new_zeros((2, 3))      # same type, device, filled with zeros
... 
for x in (t, a, b, c):
    print(x.type(), x.device, x.size())
# torch.FloatTensor cpu torch.Size([3, 4])
# torch.FloatTensor cpu torch.Size([3])
# torch.FloatTensor cpu torch.Size([3, 4])
# torch.FloatTensor cpu torch.Size([2, 3])
2
devforfu

J'ai trouvé une réponse. Il est utilisé pour créer un nouveau tenseur du même type.

1
abcdaire