이 글은 네이버 부스트캠프 AI Tech 기간에 작성되었습니다.
이것은 내가 개인적으로 배운 것에 대한 주간 요약입니다.
이 글의 내용은 새롭게 알게 된 정보를 바탕으로 구성되었습니다.
리뷰의 중요도를 선정하여 정리하였습니다.
2주차
색인
- Pytorch와 Tensorflow(+ Pytorch보다 약간 더 발전된 프레임워크)
- 파이토치 기본
- 텐서
- 보기 대 모양 바꾸기
- 압착() 및 압착 해제()
- 계산
- 프로젝트 모듈
1. 파이토치 vs 텐서플로우
딥 러닝을 할 때 처음부터 모든 코드를 구현합니다.
당신은 죽을 수 있습니다 …
그렇다면 어떻게 하면 우리의 평생을 지키고 딥러닝을 쉽고 빠르게(?!
) 할 수 있을까요?
프레임만 사용
이 프레임워크(딥 러닝)에는 다양한 것들이 있습니다.
이 중 고유한 두 가지 프레임워크가 있습니다.
바로 ‘Pytorch’와 ‘Tensorflow’입니다.
우연히 (현재 메타) Facebook은 Pytorch와 Google Tensorflow를 만들었습니다.
두 거대 IT공룡이 만든 프레임워크는 현재 딥러닝 시장에서 높은 점유율을 차지하고 있다.
둘의 가장 큰 차이점은 다음과 같습니다.
파이토치 : 실행으로 정의
텐서 흐름 : 정의 및 실행
간단히 말해 Pytorch의 경우 실행 시점에 그래프를 형성하고,
Tensorflow는 차트를 생성하고 실행합니다.
따라서 Pytorch는 실행 및 메모리 측면에서 효율적입니다.
*사실 둘 다 장단점이 있습니다.
그럼에도 불구하고 최근 몇 년 동안 Pytorch의 사용이 크게 증가했습니다.
그 이유는 Tensorflow에서 오류의 원인을 직관적으로 판단하기 어렵기 때문입니다.
또한 Pytorch는 Pythonic 프로그래밍이 가능하여 사용자가 코드를 직관적으로 쉽게 이해할 수 있습니다.
또한 Pytorch의 약점이었던 예제의 부족은 최근 커뮤니티의 발전으로 인해 많은 예제로 헤지되었습니다.
우리는 Pytorch의 더 많은 이점을 제공합니다
실제로 Pytorch를 선택하든 Tensorflow를 선택하든 상관없습니다.
* 업데이트 될수록 좋아지는 프레임워크로 전환하면 됩니다.
+) Pytorch에서 약간 더 고급 또는 추가된 프레임워크
1. 파이토치 기하학
2. 파이토치 플래시
2. Pytorch 기본 – 중요도 평가:
지금부터 파이토치의 기본 구문에 대해 알아보자.
Pytorch는 Numpy 및 AutoGrad – 자동 차분을 제공합니다.
– Tensorflow도 마찬가지
따라서 Pytorch의 구문은 Numpy의 구문과 매우 유사하며 실제로 많은 기능이 유사합니다.
Pytorch의 기본(?) 데이터 유형은 텐서입니다.
일반적으로 사용된다는 것을 이해합시다.
텐서
#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를 비교하여 동일한 형태의 데이터 구조가 출력됩니다.
텐서는 nparray 및 numpy 일반 목록을 사용하여 만들 수도 있습니다.
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’ 형식의 텐서로 생성합니다.
import torch
data =((1, 2, 3), (4, 5, 6))
data_t = torch.tensor(data, dtype=float)
print(data_t)
보기 대 모양 바꾸기
numpy에서 행렬의 모양을 변경하기 위해 reshape라는 함수를 사용했습니다.
Pytorch에서 Reshape를 사용할 수 있지만 View라는 또 다른 기능이 있습니다.
사실 이건 pytorch 개발 초기에 numpy와 구분하기 위해 처음 만든 함수인데,
Reshape는 numpy와 너무 달라서 많은 오해를 불러일으켰기 때문에 나중에 추가되었습니다.
그러나 보기와 모양 변경은 동일한 기능이 아닙니다.
물론 기능은 같지만 자세히 보면 약간의 차이가 있습니다.
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.)))
'''
출력 결과를 보면 뷰의 경우 원본도 변경됩니다.
변형되면 원본을 수정해도 바뀌지 않습니다.
다시 말해서, 보기의 경우 원래 위치나는 가지고있다 개조는 복제입니다가져오는 것을 볼 수 있습니다
나만의 검증 문제?!
data = (1, 2, 3, 4, 5, 6) 형식의 데이터를 가져와 (2,3) 형식으로 변경합니다.
보기 및 모양 변경 모두 사용
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))
압착() 및 압착 해제()
가장 헷갈리는 기능입니다
사실 3차원을 넘어서도 아찔하다.
공간 인식이 낮으면 매우 혼란스럽습니다.
하지만 당신은 알아야합니다
딥러닝에서 흔히 볼 수 있는 기능이었습니다.
스퀴즈 기능 – 지정된 위치에서 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)))))
생각보다 간단한 기능입니다.
나는 그것을 시도해야 할 것이다.
계산
그러면 텐서의 작동은 어떻게 진행됩니까?
사실 NumPy와 크게 다르지 않습니다.
다음 함수는 계산에 사용됩니다.
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.)))
여기서 주의할점
텐서의 포인트는 벡터 연산만 지원합니다 – numpy와의 차이점
따라서 mm, matmul 및 @로 계산하는 것이 좋습니다.
3. 프로젝트 모듈 – 중요도 확인
Dacon이나 Kaggle과 같은 대회에 갈 때 항상 직면하는 문제
실험 횟수가 늘어날수록 Jupyter Notebook으로 프로젝트를 관리하기가 어려워집니다.
내 코드를 다른 사람들과 공유하더라도 Jupyter Notebook에는 큰 한계가 있습니다.
그래서 표준화되고 정형화된 프레임워크에 따라 프로젝트를 구성할 때,
관리하기 쉽고 실험하기 쉽습니다.
이 유형에는 다양한 프로젝트 템플릿이 있습니다.
>>> 전형적인 예
직접 코드를 열고 프로젝트를 정리하면 실력이 크게 향상됩니다.
연습할 콘텐츠가 너무 많기 때문입니다.
나중에 직접 해보고 git 허브 주소로 여기에 업데이트하겠습니다.
– 내용이 많으면 새로 글을 작성하겠습니다.
2주차 1일차(수업 내용 요약) D
인쇄(‘완료’)