안녕하세요.

이번 포스팅에서 소개해드릴 내용은 torch.Tensor와 torch.tensor에 관련한 내용입니다.

Difference between torch.tensor and torch.Tensor

torch.Tensor() will convert your data type to Float (torch.float32). Actually, torch.Tensor and torch.FloatTensor both do same thing.

torch.tensor() will convert your data to tensor but you can select data type which is crucial in some methods.

기초 중의 기초이지만 헷갈리기도 하고 둘 다 코드 짜고 실행하는 데는 문제는 없는데 왜 따로 있을까?하는 찜찜함이 드는 부분입니다.

간단히 말해, torch.Tensor()는 dtype을 torch.float32로 출력하고, torch.tensor()는 입력된 data의 type을 따르거나 사용자가 지정할 수 있습니다. 그래서 여러 글들에서 torch.tensor 사용하는 것을 권장합니다.

코드 상에서 무슨 차이가 있는지 확인해보겠습니다.
실행 환경은 python 3.6.9/pytorch 1.7.0+cu101/google colab notebook 입니다.

torch.Tensor는 입력값(data)가 없이도 실행이 가능합니다.
반면에 torch.tensor는 꼭 입력값이 필요합니다. torch.Tensor() = torch.tensor([]) 를 확인할 수 있습니다.

>> torch.Tensor()
tensor([])
>> torch.tensor()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-ebc3ceaa76d2> in <module>()
----> 1 torch.tensor()
TypeError: tensor() missing 1 required positional arguments: "data"
>> torch.tensor([])
tensor([])

그럼 같은 입력값에 어떻게 출력이 다른지 확인해봅시다.

>> data_int = [1,2,3,4]
>> data_float = [1.,2.,3.,4.]
>> data_boolean = [True, False]

>> print(torch.Tensor(data_int), torch.Tensor(data_int).dtype)
>> print(torch.tensor(data_int), torch.tensor(data_int).dtype)

>> print(torch.Tensor(data_float), torch.Tensor(data_float).dtype)
>> print(torch.tensor(data_float), torch.tensor(data_float).dtype)

>> print(torch.Tensor(data_boolean), torch.Tensor(data_boolean).dtype)
>> print(torch.tensor(data_boolean), torch.tensor(data_boolean).dtype)

tensor([1., 2., 3., 4.]) torch.float32
tensor([1, 2, 3, 4]) torch.int64

tensor([1., 2., 3., 4.]) torch.float32
tensor([1., 2., 3., 4.]) torch.float32

tensor([1., 0.]) torch.float32
tensor([ True, False]) torch.bool

(가독성을 위해 결과값에도 new line을 추가했습니다.)

torch.Tensor의 출력값의 dtype은 torch.float32인 반면, torch.tensor의 출력값은 data의 type에 따라 변한다는 것을 확인할 수 있습니다.

>> print(torch.tensor(data_int, dtype=torch.float32), torch.tensor(data_int, dtype=torch.float32).dtype)
>> print(torch.tensor(data_int, dtype=torch.long), torch.tensor(data_int, dtype=torch.long).dtype)

tensor([1., 2., 3., 4.]) torch.float32
tensor([1, 2, 3, 4]) torch.int64

 사용자가 직접 설정할 수도 있습니다. 참고로 torch.long은 torch.int64와 같습니다.

torch.Tensor의 경우 dtype이 없습니다. (dtype을 지정할 수가 없습니다.)

뒤에 long(), int() 등을 붙여 dtype을 변경할 수는 있습니다.

>> print(torch.Tensor(data_int).int(), torch.Tensor(data_int).int().dtype)
>> print(torch.Tensor(data_int).long(), torch.Tensor(data_int).long().dtype)

tensor([1, 2, 3, 4], dtype=torch.int32) torch.int32
tensor([1, 2, 3, 4]) torch.int64

그럼 속도를 체크해보겠습니다.

>> data = [[1]*1000]*1000

>> %timeit torch.Tensor(1000,1000)
>> %timeit torch.Tensor(data)
>> %timeit torch.tensor(data, dtype=torch.float32)
>> %timeit torch.tensor(data)

>> %timeit torch.empty(1000,1000)
>> %timeit torch.zeros(1000,1000)
>> %timeit torch.randn(1000,1000)

10000 loops, best of 3: 23.4 µs per loop
10 loops, best of 3: 20.9 ms per loop
10 loops, best of 3: 21 ms per loop
10 loops, best of 3: 39.3 ms per loop

10000 loops, best of 3: 22.3 µs per loop
1000 loops, best of 3: 404 µs per loop
100 loops, best of 3: 10 ms per loop

 torch.Tensor(data) 와torch.tensor(data, dtype=torch.float32) 를 비교해보면 속도 상 큰 차이가 없습니다. 이 둘은 결과도 같고 속도도 같습니다. torch.tensor(data) (4번째)는 속도가 다소 늦어지는 것을 확인할 수 있습니다. 특이한 부분은 torch.Tensor(1000, 1000)과 torch.empty(1000,1000)이 같은 기능을 한다는 점입니다. 속도도 비슷합니다. torch.Tensor 는 (torch.tensor + torch.empty) 와 비슷한 기능을 합니다.

이번 포스팅은 여기까지입니다.

감사합니다. 

참고 자료:

https://blog.naver.com/khw11044/222118238444

https://discuss.pytorch.org/t/difference-between-torch-tensor-and-torch-tensor/30786/4

https://stackoverflow.com/questions/51911749/what-is-the-difference-between-torch-tensor-and-torch-tensor

https://pytorch.org/docs/stable/generated/torch.tensor.html

https://pytorch.org/docs/stable/tensors.html