Boostcamp AI Tech (Day 002)
1. 강의
Basic Operations on Tensors
1) 실습 진행 목적 및 배경
AI 모델을 설계할 때 설계도/아키텍처에 맞게 Tensor의 모양을 변형시키는 것은 필수적 요소 중 하나이다. AI 모델의 학습은 Tensor의 연산들을 통해 이루어지기 때문에 Tensor의 모양 변경과 기초 연산에 대해 아는 것은 중요하다. PyTorch에서 Tensor를 다루는 방법을 익히고 AI 모델을 개발 및 학습시킬 때 이를 알맞게 활용하기 위함이다.
3) 실습 수행으로 얻어갈 수 있는 역량
- cat과 stack 함수의 차이점을 이해하고 알맞게 활용할 수 있다.
- expand와 repeat 메서드의 차이점을 이해하고 알맞게 활용할 수 있다.
- Tensor의 산술, 비교, 논리연산을 이해하고 알맞게 활용할 수 있다.
4) 실습 핵심 내용
1.1 cat() 함수를 활용한 Tensor들 간의 연결
1.2 expand() 메서드를 활용한 Tensor의 크기 확장
1.3 repeat() 메서드를 활용한 Tensor의 크기 확장
2.1 Tensor의 산술연산
2.2 Tensor의 비교연산
2.3 Tensor의 논리연산
5) 예제 코드
import torch
# Tensor 생성
t1 = torch.randn(2, 3)
t2 = torch.randn(2, 3)
# cat() 함수를 활용한 Tensor들 간의 연결
t_cat = torch.cat((t1, t2), dim=0)
print(t_cat)
# expand() 메서드를 활용한 Tensor의 크기 확장
t_expand = t1.expand(2, 3, 3)
print(t_expand)
# repeat() 메서드를 활용한 Tensor의 크기 확장
t_repeat = t1.repeat(2, 2)
print(t_repeat)
# Tensor의 산술연산
t_add = t1 + t2
print(t_add)
# Tensor의 비교연산
t_eq = t1 == t2
print(t_eq)
# Tensor의 논리연산
t_and = torch.logical_and(t1 > 0, t2 > 0)
print(t_and)
Operations on Tensor Vectors & Matrices
1) 실습 개요
이번 실습에서는 1-D Tensor의 노름과 두 Tensor들간의 유사도를 구하는 방법을 학습한다. 2-D Tensor의 행렬 곱셈 연산과 활용을 한다.
2) 실습 진행 목적 및 배경
유사도는 머신러닝에서 데이터들이 얼마나 유사한지 판단하는 기준으로 사용된다.
또한 2-D Tensor의 행렬 곱셈은 신경망 구현에 핵심이 되는 연산이므로 필수적인 개념이라 할 수 있다.
행렬 곱셈을 응용해보며 이해의 폭을 넓혀보고자 한다.
3) 실습 수행으로 얻어갈 수 있는 역량
- 1-D Tensor의 L1, L2, L∞ 노름을 계산할 수 있다.
- 두 1-D Tensor의 맨해튼 유사도, 유클리드 유사도, 코사인 유사도를 계산할 수 있다.
- Tensor의 행렬 곱셈 연산을 이해하고 활용할 수 있다.
4) 실습 핵심 내용
1.1 Ln 노름
2.1 맨해튼 유사도
2.2 유클리드 유사도
2.3 코사인 유사도
3.1 2-D Tensor의 행렬 곱셈 연산
3.2 2-D Tensor의 행렬 곱셈 연산 활용
5) 예제 코드
import torch
import torch.nn.functional as F
# 1-D Tensor 생성
t1 = torch.tensor([1.0, 2.0, 3.0])
t2 = torch.tensor([4.0, 5.0, 6.0])
# L1, L2, L∞ 노름 계산
l1_norm = torch.norm(t1, p=1)
l2_norm = torch.norm(t1, p=2)
linf_norm = torch.norm(t1, p=float('inf'))
print(l1_norm, l2_norm, linf_norm)
# 맨해튼 유사도 계산
manhattan_similarity = torch.sum(torch.abs(t1 - t2))
print(manhattan_similarity)
# 유클리드 유사도 계산
euclidean_similarity = torch.sqrt(torch.sum((t1 - t2) ** 2))
print(euclidean_similarity)
# 코사인 유사도 계산
cosine_similarity = F.cosine_similarity(t1.unsqueeze(0), t2.unsqueeze(0))
print(cosine_similarity)
# 2-D Tensor 생성
t3 = torch.randn(2, 3)
t4 = torch.randn(3, 2)
# 행렬 곱셈 연산
matrix_product = torch.mm(t3, t4)
print(matrix_product)
Linear Regression1
1) 실습 개요
이번 실습에서는 주어진 데이터를 시각화하여 대략적인 상관관계를 파악해보고, 선형 회귀 분석을 시행하는 방법을 공부한다.
2) 실습 진행 목적 및 배경
데이터를 분석하기 전에 시각화를 통해 변수간의 대략적인 관계를 유추해보는 것은 중요하다.
따라서 시각화된 자료를 가지고 선형 관계를 정성적으로 판단해본 후에 Pytorch를 이용한 선형 회귀 분석으로 보다 엄밀하게 선형 관계를 도출하고자 한다.
3) 실습 수행으로 얻어갈 수 있는 역량
- 데이터를 올바르게 불러와서 표본 상관계수를 계산하고 상관관계 관찰을 위한 산점도를 그릴 수 있다.
- Pytorch를 사용하여 선형 회귀 모델을 구현할 수 있다.
- Pytorch를 사용하여 선형 회귀 분석을 시행할 수 있다.
4) 실습 핵심 내용
1.1 트레이닝 데이터
1.2 상관 관계 분석
1.3 선형 회귀 모델에서의 학습
5) 데이터셋 개요 및 저작권 정보
- 사용 데이터셋: Salary Dataset
- 연차(YearsExperience)에 따른 임금(Salary) 데이터셋입니다.
- 저작권 정보: CC0 1.0 Universal
6) 예제 코드
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import pandas as pd
# 데이터 불러오기
url = "https://raw.githubusercontent.com/abhi1thakur/Simple-Linear-Regression/master/salary_data.csv"
data = pd.read_csv(url)
years_exp = torch.tensor(data['YearsExperience'].values, dtype=torch.float32).unsqueeze(1)
salary = torch.tensor(data['Salary'].values, dtype=torch.float32).unsqueeze(1)
# 데이터 시각화
plt.scatter(years_exp.numpy(), salary.numpy())
plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.show()
# 선형 회귀 모델 정의
model = nn.Linear(1, 1)
# 손실 함수와 옵티마이저 정의
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 학습
epochs = 1000
for epoch in range(epochs):
model.train()
optimizer.zero_grad()
outputs = model(years_exp)
loss = criterion(outputs, salary)
loss.backward()
optimizer.step()
if (epoch+1) % 100 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
# 학습된 모델 시각화
predicted = model(years_exp).detach().numpy()
plt.plot(years_exp.numpy(), predicted, label='Fitted line')
plt.scatter(years_exp.numpy(), salary.numpy(), label='Original data')
plt.xlabel('Years of Experience')
plt.ylabel('Salary')
plt.legend()
plt.show()
Linear Regression2
1) 실습 개요
이번 실습에서는 경사하강법과 에폭에 대한 이해를 바탕으로 PyTorch에서 데이터를 표준화하고, 이를 확률적 경사하강법으로 학습하며, 새로운 데이터를 바탕으로 테스트를 진행한다.
2) 실습 진행 목적 및 배경
경사하강법은 머신러닝 모델의 학습을 가능하게 해주는 중요한 기법 중 하나이다.
데이터를 표준화함으로써 학습이 안정적으로 진행되게끔 하고, 경사하강법과 에폭에 대한 개념적 이해를 바탕으로 슬기롭게 모델을 학습하는 방법을 배운다.
3) 실습 수행으로 얻어갈 수 있는 역량
- StandardScaler를 통해 적절히 데이터를 표준화할 수 있다.
- 확률적 경사하강법을 위한 옵티마이저 객체를 선언하고 이를 수행할 수 있다.
- 특정 에폭만큼 학습이 진행되도록 코드를 구현할 수 있다.
4) 실습 핵심 내용
1.1 StandardScaler 클래스를 활용한 데이터 표준화
1.2 확률적 경사하강법
1.3 에폭
5) 데이터셋 개요 및 저작권 정보
- 사용 데이터셋: Salary Dataset
- 연차(YearsExperience)에 따른 임금(Salary) 데이터셋입니다.
- 저작권 정보: CC0 1.0 Universal
6) 예제 코드
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.preprocessing import StandardScaler
import pandas as pd
# 데이터 불러오기
url = "https://raw.githubusercontent.com/abhi1thakur/Simple-Linear-Regression/master/salary_data.csv"
data = pd.read_csv(url)
years_exp = data['YearsExperience'].values.reshape(-1, 1)
salary = data['Salary'].values.reshape(-1, 1)
# 데이터 표준화
scaler_x = StandardScaler()
scaler_y = StandardScaler()
years_exp = scaler_x.fit_transform(years_exp)
salary = scaler_y.fit_transform(salary)
years_exp = torch.tensor(years_exp, dtype=torch.float32)
salary = torch.tensor(salary, dtype=torch.float32)
# 선형 회귀 모델 정의
model = nn.Linear(1, 1)
# 손실 함수와 옵티마이저 정의
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 학습
epochs = 1000
for epoch in range(epochs):
model.train()
optimizer.zero_grad()
outputs = model(years_exp)
loss = criterion(outputs, salary)
loss.backward()
optimizer.step()
if (epoch+1) % 100 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
# 새로운 데이터 테스트
new_years_exp = torch.tensor(scaler_x.transform([[5]]), dtype=torch.float32)
predicted_salary = model(new_years_exp)
predicted_salary = scaler_y.inverse_transform(predicted_salary.detach().numpy())
print(f'Predicted salary for 5 years of experience: {predicted_salary[0][0]:.2f}')
2. Peer session
- 앞으로 peer session에서 무엇을 할지
3. 회고
- 새로운 캠퍼분이 팀에 합류하셨다.