
08-05-MONDay 1🏄🏻♀️✨ Overview, 01. PyTorch 기초 ✨
1) PyTorch란

torch, torch.autograd(자동미분), torch.nn(Neural network), torch.multiprocessing, torch.utils(utility)2) Tensor란
Tensor는 파이토치의 핵심 데이터 구조이다.
Numpy의 다차원 배열과 유사한 형태로 표현할 수 있다. 데이터를.
tensor의 언어적-대수적-공간-코드 표현
0-D Tensor 란
= 0차원 텐서
= Scalar라고 부르던 개념
0차원 텐서의 언어적 표현 : 하나의 숫자로 표현되는 양
0차원 텐서의 대수적 표현(=수식) :
0차원 텐서 공간에서 표현 : 한점
0차원 텐서의 코드 표현 : a = torch.tesor(36.5)
colab 실습
클라우드 기반 - 로컬 컴퓨터의 자원을 쓰지 않고도 인터넷만 연결할 수 있는 어디서든지 접근할 수 있음
import torch
# 0-D Tensor(=Scalar)의 코드 표현 실습
a = torch.tensor(36.5)
print('a =', a)
1-D Tensor 란
= 1차원 텐서
= Vector로 부르던 개념
1차원 텐서의 언어적 표현 : 순서가 지정된 여러 개의 숫자들이 일렬로 나열된 구조
1차원 텐서의 대수적 표현(=수식) :
1차원 텐서 공간에서 표현 : 5개의 항목의 값들을 일렬로 나열한 것, dim-0-나열 축, 차원이 늘어날 때마다 이 축의 위치가 변경됨. (2차원, 3차원 텐서에서 축의 위치는 어떻게 바뀌는가?)
1차원 텐서의 코드 표현 : b = torch.tesor(36.5)
colab 실습
import torch
# 1-D Tensor(=Vector)의 코드 표현 실습
b = torch.tensor([175, 60, 81, 0.8, 0.9])
print('b =', b)
2-D Tensor 란
= 2차원 텐서
= Matrix로 부르던 개념
2차원 텐서의 언어적 표현 : 동일한 크기를 가진 1D Tensor들이 모여서 형성한, 행과 열로 구성된 사각형 구조
2차원 텐서의 대수적 표현(=수식) :
2차원 텐서 공간에서 표현 : 3행 4열 12개, dim-0-행차원 축 + dim-1-기존축 변화. 차원이 늘어날 때마다 이 축의 위치가 변경됨. (3차원 텐서에서 축의 위치는 어떻게 바뀌는가?), 그레이 스케일. 공간에서의 값들이 그레이 스케일의 밝기 정도로 바뀜, 이미지로 표현
2차원 텐서의 코드 표현 : c = torch.tensor([[77, 114, 140, 191], [39, 56, 46, 119], [61, 29, 20, 33]])
colab 실습
import torch
# 2-D Tensor(=Matrix)의 코드 표현 실습
c = torch.tensor([[77, 114, 140, 191],
[39, 56, 46, 119],
[61, 29, 20, 33]])
print('c =', c)
# 그레이스케일 이미지의 코드 표현 실습
import matplotlib.pyplot as plt
plt.xticks([]), plt.yticks([])
ptl.imshow(c, cmap='gray', vmin=0, vmax=255)
plt.show()
3-D Tensor 란
= 3차원 텐서
= Matrix로 부르던 개념
3차원 텐서의 언어적 표현 : 동일한 크기를 가진 1D Tensor들이 모여서 형성한, 행과 열로 구성된 사각형 구조
3차원 텐서의 대수적 표현(=수식) :
3차원 텐서 공간에서 표현 : 3행 4열 12개, dim-0-행차원 축 + dim-1-기존축 변화. 차원이 늘어날 때마다 이 축의 위치가 변경됨. (3차원 텐서에서 축의 위치는 어떻게 바뀌는가?), 그레이스케일. 공간에서의 값들이 그레이 스케일의 밝기 정도로 바뀜, 이미지로 표현
3차원 텐서의 코드 표현 : c = torch.tensor([[77, 114, 140, 191], [39, 56, 46, 119], [61, 29, 20, 33]])
colab 실습
import torch
# 3-D Tensor(=Matrix)의 코드 표현 실습
d = torch.tensor([[77, 114, 140, 191],
[39, 56, 46, 119],
[61, 29, 20, 33]])
print('d =', d)
# 그레이스케일 이미지의 코드 표현 실습
import matplotlib.pyplot as plt
plt.xticks([]), plt.yticks([])
ptl.imshow(c, cmap='gray', vmin=0, vmax=255)
plt.show()
정리
1) PyTorch의 데이터 타입
데이터 타입 (dtype)
= Tensor가 저장하는 값의 데이터 유형
정수형, 실수형
정수형 데이터
= 소수 부분이 있는 숫자를 저장하는 데 사용되는 데이터 타입
= 8비트 부호 없는 정수, 8비트 부호 있는 정수, 16비트 부호 있는 정수, 32비트 부호 있는 정수, 64비트 부호 있는 정수
8비트 부호 없는 정수의 언어적 표현: 8개의 이진 자리수(비트)를 사용하여 0부터 255까지의 정수를 표현할 수 있는 데이터 형식, 사실상 자연수
8비트 부호 없는 정수의 공간에서 표현: 0부터 255까지만 표현이 가능(2^0 + ... + 2^7 = 255)
8비트 부호 없는 정수의 코드 표현: dtype=torch.uint8 unsigned integer 8 비트
8비트 부호 있는 정수의 언어적 표현: 8개의 이진 자리수(비트)를 사용하여 -128부터 127까지의 정수를 표현할 수 있는 데이터 형식
8비트 부호 있는 정수의 공간에서 표현: 0이면 +(양), 1이면 -(음), 숫자는 2^0 ~ 2^6 음수는 왜 -128까지? 양수는 0을 포함한 1부터 127까지 음수는 0을 제외하고 나타내기에 -1~-128까지
8비트 부호 있는 정수의 코드 표현: dtype=torch.int8, torch tensor의 함수의 매개변수로 사용
16비트 부호 있는 정수의 언어적 표현: 16개 이진 자리수(비트)를 사용하여 -32,768부터 32,767까지의 정수를 표현할 수 있는 데이터 형식- 부호 1비트를 제외한 15비트를 숫자에 할당
16비트 부호 있는 정수의 코드 표현 : dtype = torch.int16 또는 dtype=torch.short
32비트 부호 있는 정수의 언어적 표현 : 32개의 이진 자리수(비트)를 사용하여 -2,147,483,648부터 2,147,483,647까지의 정수를 표현할 수 있는 데이터 형식, 대부분의 프로그래밍에서 표준적인 정수 크기로 사용
32비트 부호 있는 정수의 코드 표현: dtype=torch.int32 또는 dtype=torch.int
64비트 부호 있는 정수의 언어적 표현 : 64개의 이진 자리수(비트)를 사용하여 -9,223,372,036,854,775,808부터 9,223,372,036,854,775,807까지의 정수를 표현할 수 있는 데이터 형식
64비트 부호 있는 정수의 코드 표현 : dtype=torch.int64 또는 dtype=torch.long
dtype = torch.float32 또는 dtype=torch.floatdtype=torch.float64 또는 dtype=torch.doublei = torch.tensor([2,3,4], dtype = torch.int8)과 같이 Tensor를 생성했을 때,j = i.float()k = i. double()2) Tensor의 기초 함수 및 메서드
min() 함수의 언어적 표현min() 함수의 공간에서 표현
max() 함수의 언어적 표현max() 함수의 공간에서 표현
sum() 함수 : Tensor의 모든 요소들의 합prod() 함수 : Tensor의 모든 요소들의 곱mean() 함수 : Tensor의 모든 요소들의 평균var() 함수 : Tensor의 모든 요소들의 표본분산 (variance)std() 함수 : Tensor의 모든 요소들의 표본표준편차 (standard division)
I = torch.tensor([[1,2,3],
[4,5,6]])
torch.min(I)
torch.max(I)
torch.sum(I)
torch.prod(I)
torch.mean(I)
torch.var(I)
torch.std(I)I.dim()I.size() 또는 I.shape (메서드가 아닌 속성)I.numel() number of element의 약자. 요소의 총 개수 (6개)torch.min(), torch.max(), torch.sum(), torch.prod(), torch.mean(), torch.var(), torch.std()dim(), size(), shape(속성), numel() 등이 있다.
08-06-TUEDay 2✍️✨ Tensor 생성과 조작 ✨
Creating Tensors
연속균등분포, 표준정규분포, CPU Tensor, GPU/CUDATensor의 생성
1) 특정한 값으로 초기화된 Tensor 생성

(dim-0은 행차원, dim-1은 열차원)
(dim-0은 depth차원, dim-1은 행차원, dim-2은 열차원)


2) 특정한 값으로 초기화된 Tensor 변환
(! 메모리 주소는 변화하지 않는다/AI에서 메모리는 모델의 성능과도 연결이 됨)
3) 난수로 초기화된 Tensor 생성
[0,1] 구간의 연속균등분포 난수 Tensor 생성
0~1 사이의 연속균등분포에서 추출한 난수로 채워진 특정 크기의 Tensor를 생성하는 코드 표현
i = torch.rand(3)
j = torch.rand([2, 3])
[0,1] 구간의 연속균등분포란?
= 연속균등분포란 특정한 두 경계값 사이의 모든 값에 대해 동일한
확률을 가지는 확률분포
= [0,1] 구간의 연속균등분포에서 특정한 두 경계값은 0과 1

표준정규분포 난수 Tensor 생성
표준정규분포에서 추출한 난수로 채워진 특정 크기의 Tensor를 생성하는 코드 표현
randn() (random normal함수)
k = torch.randn(3)
l = torch.randn([2, 3])
표준정규분포란?
= 표준정규분포란 평균이 0이고 표준편차가 1인 종 모양의 곡선
= 표준정규분포는 평균 0을 중심으로 좌우 대칭인 종모양을 가지기 때문에,
평균, 중앙값, 최빈값이 모두 0

크기와 자료형이 같은 [0, 1] 구간의 연속균등분포 난수 Tensor로 변환

4) 지정된 범위 내에서 초기화된 Tensor 생성
(arange() = array range의 약자)
dtype = float325) 초기화 되지 않은 Tensor 생성
‘초기화 되지 않았다’는 것은 생성된 Tensor의 각 요소가 명시적으로
0, 1, 2 등과 같은 다른 특정 값으로 설정되지 않았음을 의미함
초기화 되지 않은 Tensor를 생성할 때, 해당 Tensor는 메모리에 이미
존재하는 임의의 값들로 채워짐


6) list, Numpy 데이터로부터 Tensor 생성
list 데이터로부터 Tensor를 생성하는 코드 표현
• Python의 list는 여러 값을 순차적으로 저장할 수 있는 가변적인 컨테이너 데이터타입
• list는 대괄호 ‘[ ]’ 안에 쉼표로 구분한 요소들을 채워 생성할 수 있음
• s = [1, 2, 3, 4, 5, 6]의 list를 생성했을 때, s를 Tensor t로 생성하는 코드 표현 t = torch.tensor(s)
Numpy 데이터로부터 Tensor를 생성하는 코드 표현
• Numpy는 C언어로 구현된 Python 핵심 과학 컴퓨팅 라이브러리
– 대규모 다차원 배열 연산을 지원
– 배열을 효율적으로 조작할 수 있는 높은 수준의 수학 함수를 제공
• Numpy와 list의 코드 표현은 외형적으로 비슷해 보이나, Numpy는 대규모 수치 데이터 연산 또는 조작에 있어 적합한 반면, list는 그렇지 못함 u = np.array([[0, 1], [2, 3]]) / u = [[0, 1], [2, 3]]
• u = [[0, 1], [2, 3]]의 Numpy 2-D Matrix를 생성했을 때, u를 Tensor v로 생성하는 코드 표현 v = torch.from_Numpy(u)
• Numpy로부터 생성된 Tensor는 기본적으로 정수형이므로 실수형으로 타입 캐스팅이 필요함 v = torch.from_Numpy(u).float()
7) CPU Tensor 생성
w = torch.IntTensor([1, 2, 3, 4, 5])
A, B, C, D, E = 1, 2, 3, 4, 5
w = torch.IntTensor([A, B, C, D, E])
x = torch.FloatTensor([A, B, C, D, E])
torch.ByteTensor # 8비트 부호 없는 정수형 CPU Tensor 생성
torch.CharTensor # 8비트 부호 있는 정수형 CPU Tensor 생성
torch.ShortTensor # 16비트 부호 있는 정수형 CPU Tensor 생성
torch.LongTensor # 64비트 부호 있는 정수형 CPU Tensor 생성
torch.DoubleTensor # 64비트 부호 있는 실수형 CPU Tensor 생성
Tensor를 복제하는 코드 표현
x = torch.tensor([1, 2, 3, 4, 5, 6])와 같이 Tensor를 생성했을 때,
y = x.clone()
또 다른 Tensor를 복제하는 코드 표현
x = torch.tensor([1, 2, 3, 4, 5, 6])와 같이 Tensor를 생성했을 때,
z = x.detach()
• x.clone() 메서드와 다른 점은 x를 계산그래프에서 분리하여 새로운 Tensor z에 저장한다는 것 (detach() 자동미분을 배울 때 중요한 함수)
8) CUDA Tenor 생성과 변환
Pytorch의 가장 큰 장점
a = torch.tensor([1, 2, 3])
a.devicetorch.cuda.is_available()torch.cuda.get_device_name(device=0)b = torch.tensor([1, 2, 3, 4, 5]).to(‘cuda’)b = torch.tensor([1, 2, 3, 4, 5]).cuda()c = b.to(device = ‘cpu’)c = b.cpu()정리 - Tensor의 생성
torch.zeros(), torch.ones()가 있다torch.rand(), torch.randn()이 있다.torch.arange(start, end,step)가 있다.torch.empty()가 있으며, fill_() 메서드로 데이터를 수정할 수 있다.torch.from_numpy()가 있다.torch.IntTensor(), torch.FloatTensor()가 있다.clone(), detach()가 있다.clone: Tensor의 복사본을 만듭니다. 원본과는 별도의 메모리를 사용하여 독립적으로 존재합니다. detach: Tensor를 연산 그래프에서 분리합니다. 원본 Tensor와 데이터를 공유하지만, 그래디언트 계산이 되지 않습니다.t.clone()이 아니라 t.detach()는 Tensor ‘t’를 복제하면서 계산그래프에서 분리된 새로운 Tensor를 반환합니다.to('cuda'), .cuda()가 있다.Manipulation of Tensors
Tensor의 인덱싱과 슬라이싱
정리 - Tensor의 인덱싱과 슬라이싱
Tensor의 모양변경1
2) view() 메서드를 활용한 Tensor의 모양변경
g = f.view(4,3) or g = f.view(4, -1)(- 열을 모를 때)g = f.view(-1, 3)3) flatten() 함수를 활용한 Tensor의 평탄화
4) reshape() 메서드를 활용한 Tensor의 모양변경
5) transpose() 메서드를 활용한 Tensor의 모양변경


6) stack() 함수를 활용한 Tensor들 간의 결합
정리 - Tensor의 모양변경1
view() reshape()flatten()transpose()squeeze() 차원 확장 unsqueeze()stack()
08-07-WEDDay 3🏄🏻♀️✨ Tensor 연산 및 심화 ✨
- Basic Operations
- Tensor Operations
- (7강) Linear Regression1
(5강) Basic Operations
Tensor의 모양변경2
퀴즈! repeat 메서드는 view만을 생성하기 때문에 expand 메서드보다 메모리 효율성이 좋다> (X)
해설) repeat 메서드는 실제 복사본을 형성함. expand 메서드는 가상으로 view를 생성함. 따라서 repeat 메서드는 expand 메서드보다 메모리 효율성이 떨어짐기억할 것: expand 함수는 차원의 크기가 1인 차원에 대해서만 확장해주는 메서드
Tensor의 기초 연산
Tensor의 산술연산
torch.add(a,b) 저장되는 메모리 공간이 다름 (a, b, a+b)a.add_(b)torch.add(a,b). 프로그래밍에서는 브로드캐스팅에 의해 b가 자동으로 행 차원이 확장됨torch.sub(e,f) f.sub_(e)torch.sub(e,f)torch.mul(i, j)torch.mul(k, l) or k.mul_(l)torch.mul(m, n)torch.div(o, p) o.div_(p)torch.pow(s, n) t.pow_(u)torch.pow(s, 1/n)Tensor의 비교연산
torch.eq(v, w) : 두 텐서의 대응요소들이 같은가 결과는 boolean텐서(각 요소마다 출력됨)torch.ne(v, w) : 두 텐서의 대응요소들이 다른지 (not equal)torch.gt(v, w) : v의 요소들이 w의 대응요소보다 큰지 (greater than)torch.ge(v, w) : 크거나 같은지 (greater or equal)torch.lt(v, w) : 작은지 (less than)torch.le(v, w) : 작거나 같은지 (less or equal)Tensor의 논리연산
기초논리
torch.logical_and(x, y)torch.logical_or(x, y)
torch.logical_xor(x, y)학습정리
• Tensor들의 요소별 산술연산 방법에는 함수 방식과 in-place 방식이 있다.
• Tensor들 간의 요소들을 비교할 수 있는 비교연산으로 torch.eq(), torch.ne(), torch.gt(), torch.ge(), torch.lt, torch.le() 등이 있다.
• 명제를 포함하고 있는 Tensor들의 논리를 연산할 수 있는 방법으로 논리곱, 논리합, 배타적 논리합 등이 있다.
Tensor Operations
1) Tensor의 노름
1-D Tensor 복습
텐서의 크기 = 요소의 개수 a.shape 또는 a.size()
?! 두 텐서를 비교할 때 요소의 개수가 더 많다고 해서 크기가 더 크다고 얘기할 수 없다
노름이란
= 1-D Tensor의 노름: Vector가 원점에서 얼마나 떨어져 있는지를 의미함
L1 노름, L2 노름, L∞ 노름 여러 노름 존재

Ln 노름
L1 노름 : 요소의 절댓값의 합, 맨해튼 노름. torch.norm(a, p=1) (a는 Tensor)
L2 노름 : 요소의 제곱합의 제곱근, 유클리드 노름. torch.norm(a, p=2)
L∞ 노름 : [L infinity] 포함된 요소의 절댓값 중 최댓값. ,
torch.norm(a, p=float('inf')) or torch.max(a.abs())
노름에 따른 기하학적 의미

L1은 요소의 절댓값의 합, L2는 요소의 제곱합의 제곱근, L∞는 텐서의 요소 중 최댓값
나중에 성능을 평가할 때 사용됨
학습정리
• 1-D Tensor의 노름은 Vector가 원점에서 얼마나 떨어져 있는지를 의미한다.
• L1 노름은 1-D Tensor에 포함된 요소의 절대값의 합으로 정의할 수 있다.
• L2 노름은 1-D Tensor에 포함된 요소의 제곱합의 제곱근으로 정의할 수 있다.
• L∞ 노름은 1-D Tensor에 포함된 요소의 절대값 중 최대값으로 정의할 수 있다.
2) 유사도
두 텐서가 일치할 경우 거리가 0이 되기 때문에 1을 더함manhattan_distance = torch.norm(b-c, p=1) 유사도 1/(1+manhattan_distance)
euclidean_distance=torch(b-c, p=2) 유사도 1/(1+euclidean_distance)


cosine_similarity = torch.dot(b, c) / (torch.norm(b, p = 2) * (torch.norm(c, p = 2))3) 2-D Tensor 행렬 연산


Linear Regression 1
1) 선형 회귀 모델
np.corrcoef(x, t)
08-08-THUDay 4⛺✨ 04. 선형회귀, 05. 이진 분류✨
- Linear Regression 2
- Binary Classification
Linear Regression
[노션] 선형 회귀
Binary Classification
[노션] 이진 분류
2024-08-09Day 5👩🏻💻
- 심화과제
- wrap-up 퀴즈
1) 심화과제하면서 배운 것
__init__ 함수는 인스턴스 초기화 함수__call__ 함수는 인스턴스가 호출됐을 때 실행되는 함수tensor.clamp() 함수 : 입력으로 들어오는 모든 값들을 범위 안으로 조정해주는 역할# MLP를 정의합니다. 이 모델은 선형 레이어와 ReLU 활성화 함수를 이용하여 구성됩니다.
class WithoutNNMLP:
def __init__(self, in_features, hidden_features, out_features):
self.linear1 = WithoutNNLinear(
in_features, hidden_features
) # 첫 번째 선형 레이어
self.relu = WithoutNNReLU() # ReLU 활성화 함수
self.linear2 = WithoutNNLinear(
hidden_features, out_features
) # 두 번째 선형 레이어
# 이 메소드는 입력 x를 받아서 모델을 통과시킨 후 출력을 반환합니다.
def __call__(self, x):
x = self.linear1(x)
x = self.relu(x)
x = self.linear2(x)
return x
# 이 메소드는 모델을 특정 디바이스로 이동시킵니다.
def set_device(self, device):
self.linear1.set_divce(device)
self.linear2.set_divce(device)
# 이 메소드는 모델의 파라미터를 반환합니다.
def parameters(self) -> list:
"""
반환값:
list: 모델의 가중치와 편향 텐서를 포함하는 리스트.
"""
return self.linear1.parameters() + self.linear2.parameters()
첫번째 선형 레이어는 in_features, hidden_features 두번째 선형 레이어는 hidden_features, out_features이다.
.set_device(device) 함수는 모델을 특정 디바이스로 이동시킨다.
def parameters(self) -> list: 에서와 같이 화살표(->)의 경우, 해당 함수의 return 값의 형태에 대한 주석
CrossEntropyLoss
# Cross Entropy 손실 함수를 정의합니다. 이 함수는 출력과 타겟을 받아서 손실을 계산합니다.
class WithoutNNCrossEntropyLoss:
def __init__(self, reduce="mean"):
self.reduce = reduce
# 이 메소드는 출력과 타겟을 받아서 손실을 계산합니다.
def __call__(self, output, target):
return -torch.log_softmax(output, dim=1)[range(target.size(0)), target].mean()
softmax 이 함수는 입력을 확률 분포로 변환한다. 출력값이 0에서 1 사이의 값으로 변환되며, 모든 값의 합이 1이 되도록 한다.log-softmax softmax 출력의 로그를 취한다. 로그를 취하는 이유는 손실 함수에서 곱셈을 덧셈으로 변환해 계산을 더 쉽게 하기 위함이다. range(target.size(0)) 배치 내 각 샘플의 인덱스를 의미한다. target.size(0)은 배치 크기를 의미한다. 예를 들어 배치 크기가 32이면, range(32)는 [0, 1, 2, ..., 31] 의 범위를 제공한다.[range(target.size(0)), target] output출력값 중에서 정답 레이블target에 해당하는 값을 선택한다.
(batch_size, num_classes)를 가지는 텐서인데, range(target.size(0))는 각 샘플의 인덱스를, target은 각 샘플의 정답 클래스 인덱스를 가리킵니다..mean()여러 샘플에 대한 손실 값을 평균내는 역할을 합니다.모델 학습
1. 학습, 테스트 데이터 셋과 데이터 로더를 선언합니다.
2. train함수를 이용하여 모델을 학습하고 학습 loss를 반환합니다.
3. test 함수를 이용하여 모델을 평가하고 평가 loss와 accuracy를 반환합니다.
.requires_grad=True 는 autograd 에 모든 연산(operation)들을 추적해야 한다고 알려줍니다 .optimizer.zero_grad() # 그래디언트를 초기화합니다.
output = model(X) # 모델의 출력을 계산합니다.
loss = criterion(output, y) # loss을 계산합니다.
loss.backward() # 그래디언트를 계산합니다.
optimizer.step() # 파라미터를 업데이트합니다.
running_loss += loss.item() # loss을 누적합니다.
torch.no_grad() : 그래디언트를 계산하지 않게 설정한다.