오늘은 파이토치(PyYorch)에서 가장 기본으로 사용되는 텐서(Tensor)에 대해서 알아보겠습니다.
텐서(Tensor)는 배열 및 행렬과 매우 유사한 특수 데이터 구조입니다
행렬을 배열처럼 사용할 수 있어서 복잡한 행렬 계산을 빠르게 진행할 수 있습니다.
텐서(Tensor)는 GPU또는 기타 하드웨어 가속기에서 실행할 수 있는 점을 제외하고는 NumPy의 ndarray와 유사합니다.
또한 텐서(Tensor)는 자동 미분에 최적화되어 있습니다.
먼저 텐서(Tensor)에 초기화에 대해서 알아보겠습니다.
def tensorEx1():
data = [[1,2],[3,4]]
x_data = torch.tensor(data)
x_ones = torch.ones_like(x_data)
print(f"Ones Tensor: \n{x_ones} \n")
x_rand = torch.rand_like(x_data, dtype=torch.float)
print(f"Random Tensor: \n {x_rand} \n")
간단한 코드를 사용해서 텐서(Tensor)를 초기화 할 수 있습니다.
결과 값은 초기화된 정보가 행렬로 저장되어 있습니다.
텐서(Tensor)는 명시적으로 재정의하지 않는 한 인수 텐서의 속성을 그대로 유지합니다.
텐서(Tensor)는 rand, ones, zeros를 사용해서 명시적으로 초기화가 가능합니다.
def tensorEx2():
shape = (4,5,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)
print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor} \n")
print(f"Shape of Tensor : { rand_tensor.shape}")
print(f"Datatype of Tensor : { rand_tensor.dtype}")
print(f"Device Tensor is stored on : { rand_tensor.device}")
shape는 텐서(Tensor) 차원의 듀플입니다.
rand를 사용하면 랜덤 한 설정으로 초기화됩니다.
ones는 모두 1로 초기화되며, zeros는 모두 0으로 초기화됩니다.
텐서(Tensor)는 속성 메서드를 사용해서 정보를 확인할 수 있습니다.
shape, dtype, device 속성 정보 확인이 가능합니다.
출력 결과 초기화된 정보 및 속성 정보를 확인할 수 있습니다.
텐서(Tensor)는 산술, 선형대수, 행렬 조작, 샘플링 등을 포함한 100개 이상의 연산이 가능합니다.
모든 연산 정보는 아래 사이트를 확인해주세요.
https://pytorch.org/docs/stable/torch.html
텐서(Tensor) 연산은 GPU에서 실행이 가능하여 일반적인 CPU 보다 빠른 속도 연산이 가능합니다.
기본은 CPU에서 연산이 진행되며 .to 메서드를 사용해서 GPU로 이동이 가능합니다.
간단하게 행렬에 접근하는 방법을 알아보겠습니다.
def tensorEx3():
tensor = torch.ones(5,5)
print('\n')
print(tensor)
print('First row: ', tensor[0])
print('First column: ', tensor[:0])
print('Last column:', tensor[...,-1])
tensor[:,1] = 4
print(tensor)
텐서(Tensor) 행렬에 원하는 위치 정보를 출력할 수 있거나 행에 포함된 모든 정보를 한 번에 변경이 가능합니다.
또한 처음, 마지막 접근이 가능합니다.
출력 결과 두 번째 위치 컬럼을 4로 초기화했습니다.
행렬이면서 배열과 동일하게 사용할 수 있어 정말 편리합니다.
텐서(Tensor)는 간단하게 행렬을 합할 수 있습니다.
tensor = torch.ones(5,5)
t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(f"\n{t1}\n")
cat 메서드를 사용하면 3개의 텐서(Tensor)를 합할 수 있습니다.
출력 결과 15개의 행렬을 확인할 수 있습니다.
텐서(Tensor)는 다양한 산술 연산이 가능합니다.
tensor1 = tensor + tensor
print(f"\n{tensor1} \n")
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)
y3 = torch.rand_like(tensor)
torch.matmul(tensor, tensor.T, out=y3)
print(f"\n {y3} \n")
z1 = tensor * tensor
z2 = tensor.mul(tensor)
z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)
print(f"\n {z3} \n")
agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))
산순 연산을 사용해서 텐서(Tensor)를 다양고 쉽게 사용할 수 있습니다.
텐서(Tensor)는 copy를 사용해서 복사가 가능합니다.
복사를 하지 않을 경우는 동일한 객체로 인식되어 수정 시 모든 객체에 수정이 반영됩니다.
copy = torch.ones(5,5)
tensor.copy_(copy)
tensor.add_(7)
print(f"\n{copy} \n")
print(f"\n{tensor} \n")
복사를 하게되면 복사된 정보는 새로운 객체로 인식되어 별도 수정이 가능합니다.
출력 결과 복사된 정보를 변경하면 이전 정보에 반영되지 않습니다.
텐서(Tensor)는 NumPy 배열로 변경이 가능합니다.
def tensorEx5():
t = torch.ones(7)
print(f"\n t : {t} \n")
n = t.numpy()
print(f"\n n: {n} \n")
t.add_(2)
print(f"\n t : {t} \n")
print(f"\n n: {n} \n")
텐서(Tensor)에 변경된 내용이 NumPy 배열에 반영되는 것을 확인할 수 있습니다.
반대로 NumPy 배열을 텐서(Tensor)로 이동이 가능합니다.
def tensorEx6():
n = np.ones(8)
t = torch.from_numpy(n)
np.add(n,1, out=n)
print(f"\n t : {t} \n")
print(f"\n n: {n} \n")
출력 결과 NumPy배열의 변경 내용이 텐서(Tensor)에 반영되었습니다.
텐서(Tensor)는 팁 러닝에 기본이 되는 배열 및 행렬과 매우 유사한 특수 데이터 구조로 빠른 계산 및 가독성이 매우 좋습니다.
일반적인 언어에서 어렵게 계산해야 하는 행렬을 단 몇 줄 코드로 계산이 가능합니다.
또한 GPU를 사용할 수 있어 복잡한 계산을 더욱더 빠르게 연산할 수 있습니다.
파이토치(PyTouch)를 사용하기 위해서는 기본 객체이기 때문에 반드시 사용법을 확인해주세요.
감사합니다.
https://believecom.tistory.com/736?category=1197289
'IT 나라 > 파이썬(python)' 카테고리의 다른 글
[python] 파이썬 파이토치 신경망 활용하기 (0) | 2021.07.23 |
---|---|
[python] 파이썬 파이토치 데이터 세트 활용하기 (0) | 2021.07.22 |
[python] 파이썬 파이 토치 PyTorch 설치하기 (0) | 2021.07.16 |
[python] 파이썬 그래프 타입 알아보기 (0) | 2021.07.15 |
[python] 파이썬 폴더 파일 검색 및 파일 이름 변경하기 (0) | 2021.06.30 |