네이버 부스트캠프 🔗/⭐주간 학습 정리

[네이버 부스트 캠프 AI Tech] Pytorch 기본

Dobby98 2023. 3. 13. 23:42

본 글은 네이버 부스트 캠프 AI Tech 기간동안

개인적으로 배운 내용들을 주단위로 정리한 글입니다

 

본 글의 내용은 새롭게 알게 된 내용을 중심으로 정리하였고

복습 중요도를 선정해서 정리하였습니다

 

Week 2

목차

  1. Pytorch vs. Tensorflow (+ pytorch에서 조금더 발전한 프레임워크)
  2. Pytorch Basic
    1. Tensor 
    2. view vs. reshape
    3. squeeze() & unsqueeze()
    4. 연산
  3. Project Module

 


1. Pytorch vs. Tensorflow🎈

딥러닝을 할 때 처음부터 모든 코드를 구현한다면 

당신은 죽을 수도 있습니다...

 

이렇게요....

그렇다면 어떻게 해야 우리의 수명도 지키고 빠르고 간편하게(?!) 딥러닝을 수행할 수 있을까?

 

바로 프레임워크를 활용하면된다

 

이러한 프레임 워크에는 (딥러닝) 매우 다양한것들이 존재하고 있는데

이 중에서 독보적인 2개의 프레임 워크가 있다

 

바로 'Pytorch(파이토치)'와 'Tensorflow(텐서플로우)'이다.

공교롭게도 (현 메타)페이스북이 pytorch를 만들었고 구글이 tensorflow를 만들었는데

두 거대 공룡 IT 기업이 만든 프레임 워크가 현재 딥러닝시장에서 높은 점유율을 갖고 있는 것이다

 

둘의 가장 큰 차이점은 한 단어로 비교하면 아래와 같다

 

Pytorch : Define by run
Tensorflow : Define and run

쉽게 설명하자면 Pytorch의 경우 실행 시점에서 그래프를 형성하고 

Tensorflow는 그래프를 다 생성하고 실행한다

 

따라서 Pytorch가 실행과 메모리면서에서 효율적인 부분이 있다

 

*사실 둘다 장단점이 있다

 

그럼에도 불구하고 최근들어서 Pytorch의 이용이 급속도로 증가하였는데 

이 이유에는 Tensorflow에서 발생하는 오류의 원인을 직관적으로 판단하기 힘들다는 점이 있고

또한 Pytorch는 Pythonic한 프로그래밍이 가능해서 사람이 직관적으로 코드를 알아보기 쉽다는 장점이 있기 때문이다

 

또한 Pytorch의 단점이었던 예제부족은 최근 커뮤니티의 발전으로 많은 양의 예제들이 확보되고 있어

Pytorch의 장점을 더욱 살려고 주고 있다

 

사실 우리에게있어 Pytorch와 Tensorflow중 어느것을 선택할것인지는 중요하지않다

*그냥 업데이트 될때 더 좋아지는 프레임 워크로 한번씩 갈아타면 된다


 

+) Pytorch에서 조금 더 발전된 or 추가된 프레임워크

1. Pytorch geometry

 

예제를 통해 알아보는 PyTorch Geometric 5 Basic Concepts

다음 글은 PyTorch Geometric 라이브러리 설명서에 있는 Introduction by Example 를 참고하여 작성했습니다.

baeseongsu.github.io

2. Pytorch lightning 

 

우리가 PyTorch Lightning을 써야 하는 이유

다음 글은 PyTorch Lightning 라이브러리에 있는 여러 내용들을 참고하여 작성했습니다.

baeseongsu.github.io


2. Pytorch Basic - 복습중요도 : ⭐⭐⭐⭐

지금 부터는 이러한 Pytorch의 기본적인 문법에 대해서 알아보도록 하자

 

Pytorch는 Numpy와 AutoGrad-자동미분을 제공해준다. - Tensorflow도 마찬가지

따라서 Pytorch의 문법은 Numpy와 매우 유사한 점이 많으며 실제로 많은 기능이 비슷하다

 

Pytorch의 기본(?) 데이터형태는 Tensor다 -  많이 활용된다고 이해하자

 

Tensor 

#Numpy와 Pytorch 비교
import numpy as np
numpy_array = np.range(10).reshape(2,5)
print(numpy_array)

>>> [[0,1,2,3,4], [5,6,7,8,9]]

import torch
torch_array = torch.FloatTensor(numpy_array)
print(torch_array)

>>> [[0., 1., 2., 3., 4.], [5., 6., 7., 8., 9.]]

위 코드는 Pytorch와 Numpy을 비교한 코드로 사실상 같은 형태의 데이터 구조가 출력된다.

 

또한 numpy의 nparray와 일반적인 list를 활용해서도 Tensor를 생성할 수 있다.

import numpy as np
import torch


#list로 tensor 구현
data = [[3, 5], [10, 5]]
x_data = torch.tensor(data)
print(x_data)

>>> tensor([[ 3,  5],
        [10,  5]])

#ndarray to tensor
nd_array = np.array(data)
tensor_array = torch.from_numpy(nd_array)
print(tensor_array)

>>> tensor([[ 3,  5],
        [10,  5]], dtype=torch.int32)

 

⭐나만의 확인문제?! 

data = [1, 2, 3, 4, 5, 6] 형태의 데이터를 갖고 이를 'flot'형태의 tensor로 생성해라

import torch
data =[[1, 2, 3], [4, 5, 6]]

data_t = torch.tensor(data, dtype=float)

print(data_t)

 

 


View vs. Reshape

numpy에서 행렬의 모양을 변화하기 위해서는 reshape라는 함수를 활용하였다

pytorch에서도 reshape를 활용할 수 있지만 view라는 다른 함수도 존재한다

 

사실, 이것은 pytorch 개발 초반에 numpy와 차별점을 두기 위해서 먼저 만든 함수이지만

numpy와 너무 달라서 오해를 많이 발생시켰기 때문에 이후에 reshape가 추가되었다

 

하지만 view와 reshape은 같은 함수는 아니다

물론 같은 기능을 하지만 자세히 들어가면 차이점이 조금 존재한다

 

import torch
data =[[1, 2, 3], [4, 5, 6]]

data_t = torch.tensor(data, dtype=float)


#view로 변환
data_view = data_t.view(-1, 2)
print(data_view)

>>> tensor([[1., 2.],
        [3., 4.],
        [5., 6.]], dtype=torch.float64)

#reshape로 변화
data_reshape = data_t.reshape(-1, 2)
print(data_reshape)

>>> tensor([[1., 2.],
        [3., 4.],
        [5., 6.]], dtype=torch.float64)

 

겉으로 보기에는 둘이 같은 결과를 내고 있다

그런데 여기서 두개의 원본인 data_t를 변화시키면 어떻게 될까?

 

import torch

data_t = torch.zeros(3,2)

data_view = data_t.view(3,2)
data_t.fill_(1)

print('data_view : ', data_view)
print('data_t : ', data_t)

data_w  = torch.zeros(3,2)
data_reshape = data_w.reshape(6)
data_w.fill_(0)

print('data_reshape : ', data_reshape)
print('data_t : ', data_t)

'''
data_view :  tensor([[1., 1.],
        [1., 1.],
        [1., 1.]])
data_t :  tensor([[1., 1.],
        [1., 1.],
        [1., 1.]])
data_reshape :  tensor([0., 0., 0., 0., 0., 0.])
data_t :  tensor([[1., 1.],
        [1., 1.],
        [1., 1.]])
'''

출력 결과를 보면 view같은 경우 원본이 변하면 같이 변했지만

reshape의 경우에는 원본이 변해도 변하지 않았다 

즉, view같은 경우 원본의 메모리주소를 갖고 있지만 reshape는 copy해서 가져온다는 것을 알 수 있다

 

 

⭐나만의 확인문제?! 

data = [1, 2, 3, 4, 5, 6] 형태의 데이터를 갖고 이를 (2,3)의 shape로 변경하라 

view, reshape 모두 사용

import torch


data = [1,2,3,4,5,6]
data_t = torch.tensor(data)

print(data_t.view(-1, 2))
print(data_t.reshape(3,2))

squeeze() & unsqueeze()

가장 혼란을 일으키는 함수이다 

사실 3차원 이상가도 어지럽기 때문에

공간지각능력이 떨어지면 매우 혼란스럽다

 

하지만 필수적으로 알아야한다

 

딥러닝 중에서 자주 보였던 함수였으니 말이다..

squeeze함수 - 지정 위치에 1인 차원을 제거

unsqueeze함수 - 지정 위치에 1인 차원을 생성

 

import torch


data = torch.tensor([[[1],[2]],
                     [[3],[4]],
                     [[5],[6]]])

#벌써 부터 어지럽죠?
print(data.squeeze(0))

>>> tensor([[[1],
         [2]],

        [[3],
         [4]],

        [[5],
         [6]]])

print(data.squeeze(1))

>>> tensor([[[1],
         [2]],

        [[3],
         [4]],

        [[5],
         [6]]])


print(data.squeeze(2))

>>> tensor([[1, 2],
        [3, 4],
        [5, 6]])


print(data.unsqueeze(0))

>>> tensor([[[[1],
          [2]],

         [[3],
          [4]],

         [[5],
          [6]]]])

print(data.unsqueeze(1))

>>> tensor([[[[1],
          [2]]],


        [[[3],
          [4]]],


        [[[5],
          [6]]]])

print(data.unsqueeze(2))

>>> tensor([[[[1]],

         [[2]]],


        [[[3]],

         [[4]]],


        [[[5]],

         [[6]]]])

 

생각보다 상상하면 쉬운 함수이다

꼭 응용해서 사용해보아야겠다

 


연산

그렇다면 tensor의 연산은 어떻게 진행될까?

사실 넘파이와 그렇게 다르지 않다

 

다음은 연산에 활용되는 함수들이다

import torch
import numpy as np


n1 = np.arange(10).reshape(2,5)
n2 = np.arange(10).reshape(5,2)
t1 = torch.FloatTensor(n1)
t2 = torch.FloatTensor(n2)
n2 = np.arange(10).reshape(5,2)
t2 = torch.FloatTensor(n2)

print(t1.mm(t2))

>>> tensor([[ 60.,  70.],
        	[160., 195.]])

print(t1.dot(t2))

>>> Error

print(t1.matmul(t2))

>>> tensor([[ 60.,  70.],
        	[160., 195.]])

여기서 주의할점

tensor의 dot는 벡터의 연산만 지원된다 - numpy와 차이점

따라서 mm, matmul, @를 활용해서 연산하는 것이 좋다

 


3. Project Module - 복습 중요도 ⭐⭐⭐

데이콘이나 캐글같은 대회를 나갔을 때 항상 부딪히는 문제가

실험의 횟수가 증가할 수 록 주피터 노트북으로 프로젝트를 관리하기 힘들어 진다는 점이있다

 

또한 내가 만든 코드를 다른 사람에게 공유할 때 주피터 노트북은 엄청난 한계를 갖는다

 

따라서 뭔가 규격화 되고 형식화된 틀에 맞춰서 프로젝트를 구성하면

관리하기도 편하고 실험하기도 편할 것이다

 

이러하 형태를 지닌 다양한 Project  template이 존재한다

 

>>> 대표적인 예시 

 

GitHub - Lightning-AI/deep-learning-project-template: Pytorch Lightning code guideline for conferences

Pytorch Lightning code guideline for conferences. Contribute to Lightning-AI/deep-learning-project-template development by creating an account on GitHub.

github.com

 

GitHub - FrancescoSaverioZuppichini/PyTorch-Deep-Learning-Template: A Pytorch Computer Vision template to quick start your next

A Pytorch Computer Vision template to quick start your next project! 🚀🚀 - GitHub - FrancescoSaverioZuppichini/PyTorch-Deep-Learning-Template: A Pytorch Computer Vision template to quick start your ...

github.com

 

직접 코드를 뜯어보고 프로젝트를 구성한다면 많은 실력이 향상될 것이다

 

여기서 실습하기에는 내용이 너무 많기 때문에

추후에 직접 실습해 보고 Git hub 주소로 여기에 업데이트 해보겠다

- 내용이 많으면 새로운 글로 작성하겠다

 


Week-2 Day1(수업 내용 정리) D

print('Done')