torch.Tensor와 torch.tensor의 차이

mincheol2·2022년 1월 28일
4

Pytorch

목록 보기
4/6
post-custom-banner

torch.Tensor / torch.tensor

둘다 data(input)에 대해서 Tensor 객체로 만들어 주는 기능은 동일하다.
하지만 의미적으로나 구조적으로 차이점이 있다.

우선 Docs를 보자


pythorch 공식문서에 tensor를 검색해보면 tensor , Tensor 2가지를 볼 수 있다.
기본적인 차이는

  • tensor.torch() : function
  • tensor.Torch() : class

이라는 것이다.

torch.tensor()의 Documentation

torch.tensor(data) -> Tensordata를 input으로 받아 Tensor 객체를 생성하게 된다.

주의할 점에는 torch.tensor는 항상 data를 복사한다고 되어 있다.
이에 따라 datatorch.tensor(data)의 필수 argument 이기 때문에
data를 넣지 않으면 TypeError가 발생하게 된다.

torch.Tensor()의 Documentation

torch.TensorClass이다.

이미 존재하는 데이터를 tesor로 바꾸고 싶을 때 torch.tenseor()를 사용하라고 한다.
이는 torch.tenseor()는 Tesor 객체를 만들어주는 함수로 생각하라는 의미로 받아들이면 될 것 같다.
또한 빈 Tensor 객체를 만들기 위해 사용할 수 있다.

이외 차이점

  • torch.tensor

    • int 입력시 int 그대로 입력
    • 입력받은 데이터를 새로운 메모리 공간에 복사해 Tensor 객체 생성 (call by value)
  • torch.Tensor

    • int 입력시 float으로 변환
    • 데이터 입력 시(Tensor 객체로) 입력 받은 메모리 공간을 그대로 사용 (call by reference)
    • 데이터 입력 시(listnumpy 로) 입력 받은 값을 복사하여 Tensor 객체 생성(call by value)

코드로 보면 이해하기 쉽다.

torch.Tensor

# torch.Tensor은 Tensor 객체를 받으면 메모리 주소값을 복사해 온다.

original_data = torch.Tensor([1])
new_data = torch.Tensor(original_data)
print(f"original : {original_data} new : {new_data}")
 
# original data를 수정
original_data[0] = 2
print(f"original : {original_data} new : {new_data}")


>>> original : tensor([1.]) new : tensor([1.])
    original : tensor([2.]) new : tensor([2.])
  • intfloat형으로 바뀐 것을 볼 수 있다

  • input이 Tensor객체인 경우 original Tensor 값을 변경하니 new Tensor 값도 덩달아 바뀐 것을 볼 수 있다

    • 이해가 잘 안간다면 call by reference얕은복사(shallow copy) 개념을 보면 될 것이다.
# torch.Tensor은 list나 numpy를 받으면 값을 복사해온다

original_data = [1]
new_data = torch.Tensor(original_data)
print(f"original : {original_data} new : {new_data}")

# original data를 수정하자
original_data[0] = 2
print(f"original : {original_data} new : {new_data}")

>>>> original : [1] new : tensor([1.])
     original : [2] new : tensor([1.])
  • input이 listnumpy인 경우, original list 값을 변경해도, new Tensor의 값은 바뀌지 않은 것을 볼수 있다.
    • 이해가 잘 안간다면 call by value깊은복사(deep copy) 개념을 보면 될 것이다.

torch.tensor

# torch.torch의 경우 값을 복사해 Tensor 생성

original_data = torch.tensor([1])
new_data = torch.tensor(original_data)
print(f"original : {original_data} new : {new_data}")

# data를 수정하자
original_data[0] = 2
print(f"original : {original_data} new : {new_data}")

>>> original : tensor([1]) new : tensor([1])
    original : tensor([2]) new : tensor([1])
  • int로 받아 int로 생성된 것을 볼 수 있다.
  • original data를 바꿔도 new Tensor의 값은 바뀌지 않는다.
profile
옹오옹오오오옹ㅇㅇ
post-custom-banner

0개의 댓글