티스토리 뷰

728x90


토치를 사용하다 보면 가장 많이 사용하게 되는게 tensor()이다. 그런데, 공부하다 보니 tensor()가 있고, Tensor()가 있는데 이 둘의 차이는 뭘까...??

두 함수의 차이를 살펴보고 나름대로 정리를 해보려한다.
https://stackoverflow.com/questions/51911749/what-is-the-difference-between-torch-tensor-and-torch-tensor

What is the difference between torch.tensor and torch.Tensor?

Since version 0.4.0, it is possible to use torch.tensor and torch.Tensor What is the difference? What was the reasoning for providing these two very similar and confusing alternatives?

stackoverflow.com

채택된 답변을 보면 도움이 될 것이다.

1. defalut type의 차이
torch.Tensor()
torch.Tensor is an alias for the default tensor type (torch.FloatTensor).
레퍼런스에 보면 이런 설명이 있다. 즉, torch.Tensor() == torch.FloatTensor() 이다.

즉, 위에 사진처럼 두개의 결과값이 동일하다는 뜻이다. type은 Float32로 지정된 것을 볼 수 있다.

torch.tensor()
torch.tensor()를 봐보자.

같은 데이터를 넣었는데 조금 다른 상황이 발생한 것을 볼 수 있다. tensor는 입력되는 데이터에 맞게 type이 지정되는 것을 볼 수 있다. 여기서는 [1,2]를 넣었기때문에 int로 되는것이고, 만약 [1.,2.]으로 넣는다면 float가 될것이다.

*즉 첫번째 차이점은 Tensor()는 type를 Float 고정이며, tensor()는 입력 데이터에 따라 type이 변하게 된다.

2. Scalar 값이 들어갔을 때 차이
torch.Tensor()를 먼저 살펴보면.. 위에는 리스트로 값을 넣었지만, 밑에 사진처럼 스칼라값 한개만 넣게되면... 리스트 안에 n개의 데이터가 랜덤으로 들어가는 것을 볼 수 있다.

하지만 torch.tensor()는... 단순 스칼라 값도 하나의 데이터로 인식을 하는 것을 볼 수 있다.

* 즉, Tensor와 tensor는 스칼라 값을 입력받을 때, 서로 다른 output을 내기에 조심해야 한다.

3. requires_grad 차이
자동 미분을 이용하기 위해 requires_grad를 사용해야 하는 경우가 상당히 많은데, 이 경우를 살펴보겠다.
일단 torch.Tensor()를 살펴보자.

이처럼, requires_grad를 사용했을때 오류가 발생하는 것을 볼 수 있다.

그에 반에, torch.tensor()는 같은 입력이라도 requires_grad를 사용할 수 있다.

*즉, Tensor안에는 requires_grad 파라미터가 존재하지 않고, tensor에는 존재한다.

--추가로 만약 Tensor로 만들고, requires_grad = True를 넣고 싶으면 어떻게 해야할까?

이처럼, 파라미터에는 없지만, 함수는 존재하므로 위와같이 선언해주면 된다.

4. Tensor vs tensor
위에 내용을 살펴보면, Tensor를 굳이 사용해야할 이유가 없는데 왜 Tensor와 tensor 둘다 존재하는것일까?
대답은, 데이터가 없을때 차이가 난다.
torch.Tesnor()에 데이터가 없는 경우를 가정하면...

빈 tensor를 만드는 것을 볼 수 있다.
하지만 torch.tensor()에 데이터가 없는 경우에는...

에러가 나오는데, 반드시 data가 존재해야 한다고 한다.

*즉, Tensor는 data가 없어도 만들 수 있지만, tensor는 data가 반드시 존재해야 만들 수 있는것이다.

이 결론을 잘 생각해보면 왜 requires_grad가 파라미터로 존재해야 하는지 알 수 있는 것 같다.
torch.Tensor()는 data가 없어도 생성이 가능하기 때문에, 만약 데이터가 없는 상태로 requires_grad = True 의 파라미터가 존재한다면, 기울기를 추적할 것이 없다. 반대로 torch.tensor()는 반드시 data가 존재해야 하므로 기울기 추적을 반드시 할 수 있기에 파라미터로 존재한다고 생각한다.

하지만, torch.Tensor()에 데이터가 없어도 함수를 통해 강제로 requires_grad = True로 만들어 줄 수 있다.

이처럼 할수는 있지만.. 기울기를 추적할 데이터가 없기에 사용하나마나의 상황이 나올 것이다.


**마지막으로 torch.Tensor는 메인 tensor Class라고 한다. 즉, torch.tensor()는 Tensor()를 기반으로 만들어 진다는 것이다.

한마디로 torch.Tensor()와 torch.tensor()는 결국 torch.Tensor이지만, torch.tensor()는 여러 규칙을 준수하여 만들 수 있도록(반드시 데이터가 들어가야함, require_grad 설정가능) 제공하는 단순한 함수에 불과하다.

그러니, Tensor()와 tensor()중 어떤것을 써야할지 모를땐... .tensor()를 사용하면 편하겠다!

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함