다시 이음

Pytorch - 기초 구조 본문

Pre_Onboarding by Wanted(자연어 처리)

Pytorch - 기초 구조

Taeho(Damon) 2022. 3. 1. 17:33

안녕하세요.

 

오늘은 Pytorch를 이해하기 위해 기초인 텐서와 구조에 대해 알아보려고 합니다.

 

Pytorch🔥

 

텐서 변환

 

  • 리스트 >> 텐서
  • numpy.array >> 텐서
x = [[1],[2]]
print(f"x data type: {type(x)}")

#리스트 >> 텐서
x_tensor = torch.tensor(x)
print(f"x_tensor data type: {type(x_tensor)}")

#array 생성
x_np = np.array(x)
print(f"x_np data type: {type(x_np)}")

#array >> 텐서
x_tensor = torch.from_numpy(x_np)
print(f"x_tensor data type: {type(x_tensor)}")

 

텐서 생성(0,1,난수)

 

  • 0,1로 이루어진 랜덤 배열 텐서 생성
  • [0,1] 범위의 균등 분포에서 랜덤 추출 생성
  • 정규분포에서 랜덤 추출 생성
  • 설정 범위의 int 값을 랜덤 추출 생성
# shape -> tensor
shape = (2,3,)

zero_tensor = torch.zeros(shape)
print(f"zero tensor: {zero_tensor}, shape: {(zero_tensor.shape)}")

one_tensor = torch.ones(shape)
print(f"one tensor: {one_tensor}, shape: {(one_tensor.shape)}")

rand_tensor = torch.rand(shape) # [0,1) 범위의 균등 분포에서 임의의 값 추출
print(f"random tensor: {rand_tensor}, shape: {(rand_tensor.shape)}")

rand_dis_tensor = torch.randn(shape) # 정규분포에서 임의 값 추출
print(f"random distribution tensor: {rand_dis_tensor}, shape: {(rand_dis_tensor.shape)}")

rand_int_tensor = torch.randint(10, shape) # [low,high) 범위의 int 값을 임의 추출 
print(f"random int tensor: {rand_int_tensor}, shape: {(rand_int_tensor.shape)}")

 

텐서 구조

 

  • rank
    • dimension 개수
  • shape
    • 각 dimension의 value 개수
  • axis
    • 특정 dimension 지칭

 

텐서 구조 변경

 

  •  Shape 변경

view 메소드를 사용하여 -1로 설정한 부분의 axis를 임의로 변경할 수 있도록 허용합니다.

# shape 변경
x = torch.rand(4,3,2)
print(x.view(-1,2,2).shape)

xx = x.view(4,6,-1)
xx.shape

#output
torch.Size([6, 2, 2])
torch.Size([4, 6, 1])

 

  • Rank 변경
# rank 변경
xx.shape = torch.Size([4, 6, 1])

xxx = xx.squeeze()
print(xxx.shape)
print(xxx.unsqueeze(dim=-1).shape)

#output
torch.Size([4, 6])
torch.Size([4, 6, 1])

 

텐서 인덱싱

파이썬에서 list 인덱싱과 흡사합니다.

 

 

텐서 연산

  • 덧셈

sum 함수를 사용하여 아래와 같은 형식으로 사용합니다.

x.sum(dim=0, keepdim=True)
*dim = 설정한 axis를 기준으로 덧셈을 합니다.

 

  • 곱셈

- matmul : 일반적인 행렬의 곱으로 행렬의 사이즈가 일치하여야 곱셈이 가능합니다. ex. 2x1 * 1x2

- mul : 같은 위치에 있는 수끼리 곱하는 것으로 Transpose하면 matmul과 같습니다. 

 

  • 내적(dot)
1d vector의 곱 연산의 합 -> output: scalar