티스토리 뷰
토치를 사용하다 보면 가장 많이 사용하게 되는게 tensor()이다. 그런데, 공부하다 보니 tensor()가 있고, Tensor()가 있는데 이 둘의 차이는 뭘까...??
두 함수의 차이를 살펴보고 나름대로 정리를 해보려한다.
https://stackoverflow.com/questions/51911749/what-is-the-difference-between-torch-tensor-and-torch-tensor
채택된 답변을 보면 도움이 될 것이다.
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()를 사용하면 편하겠다!
'Pytorch' 카테고리의 다른 글
[pytorch] gpu가 cpu보다 느리거나 같을 때. (0) | 2023.01.09 |
---|---|
[pytorch] LSTM 내부구조 이해하기 (0) | 2023.01.05 |
[pytorch] RNN 이해하기 (0) | 2023.01.04 |
[pytorch] 파라미터 dim = ?의 의미... (0) | 2022.12.27 |
[pytorch] tensor concat / stack 차이점 (0) | 2022.12.27 |
- Total
- Today
- Yesterday
- 이미지
- 딥러닝
- V11
- java
- 자바
- 오블완
- 티스토리챌린지
- 알고리즘
- c3k2
- 깃
- YOLOv8
- 디텍션
- CNN
- 도커
- yolov11
- 어탠션
- 욜로
- github
- GIT
- Tree
- 오류
- DeepLearning
- python
- 초보자
- 백준
- GNN
- YOLO
- 정리
- docker
- 뜯어보기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |