Pytorch로 시작한는 딥 러닝 입문 week 2

1-3


데이터 수집 -> 데이터 파악 -> 전처리 -> 모델링(머신러닝 코드 작성) -> 훈련(테스트용 남겨두고) -> 성능 평가 -> 배포


1-4

Pandas: 파이썬 데이터 처리를 위하 라이브버리.

Pandas는 총 세 가지의 데이터 구조를 사용합니다.

  • 시리즈(Series)

    시리즈 클래스는 1차원 배열의 값(values)에 각 값에 대응되는 인덱스(index)를 부여할 수 있는 구조를 갖고 있습니다.

  • 데이터프레임(DataFrame)

    데이터프레임은 2차원 리스트를 매개변수로 전달합니다.
    데이터프레임은 리스트(List), 시리즈(Series), 딕셔너리(dict), Numpy의 ndarrays, 또 다른 데이터프레임으로부터 생성할 수 있습니다.

  • 패널(Panel)

Numpy: 수치 데이터를 다루는 파이썬 패키지.

  • ndarray: NumPy 라이브러리에서 제공하는 다차원 배열 객체입니다.
  • np.array(): 리스트, 튜플, 배열로 부터 ndarray를 생성합니다.
  • ndim: 축의 개수
  • shape: 크기
  • np.zeros(): 배열의 모든 원소에 0을 삽입
  • np.ones(): 배열의 모든 원소에 1을 삽입
  • np.full(): 배열에 사용자가 지정한 값을 삽입
  • np.arange(): 0부터 n-1까지의 값을 가지는 배열을 생성
  • np.reshape(): 내부 데이터는 변경하지 않으면서 배열의 구조를 바꿈
  • arr[start:stop:step] : 슬라이싱

    start: 시작 인덱스 (생략 가능, 기본값은 0)
    stop: 종료 인덱스 (생략 가능, 기본값은 배열의 끝)
    step: 단계 (생략 가능, 기본값은 1)


Matplotlib : 데이터를 차트나 플롯으로 시각화하는 패키지

  • plot() 라인 플롯을 그리는 기능 수행

    plt.xlabel('hours') // x축에 이름삽입
    plt.ylabel('score') //y축에 이름삽
    plt.legend(['A student', 'B student']) //범례 삽입


1-5 지도 학습을 위한 데이터 분리

  • zip(): 각 인덱스에 등장하는 원소들끼리 묶어주는 역할
    (Pandas의 데이터프레임, Numpy의 슬라이싱으로도 가능)

  • train_test_split(): 학습용과 테스트 데이터 분리
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2, random_state=1234) 
    X : 독립 변수 데이터. (배열이나 데이터프레임)
    y : 종속 변수 데이터. 레이블 데이터.
    test_size : 테스트용 데이터 개수를 지정한다. 1보다 작은 실수를 기재할 경우, 비율을 나타낸다.
    train_size : 학습용 데이터의 개수를 지정한다. 1보다 작은 실수를 기재할 경우, 비율을 나타낸다.
    random_state : 난수 시드
     random_state의 값을 고정해두면 실행할 때마다 항상 동일한 순서로 데이터를 섞으므로, 동일한 코드를 다음에 재현하고자 할 때 사용할 수 있습니다. ```

2-2 텐서 조작하기

벡터: 1차원 값
행렬: 2차원 값 = 2차원 텐서
텐서: 3차원 값

batch: 행렬에서 행의 크기
dim: 행렬에서 열의 크기

컴퓨터에서는 batch단위로 연산을 수행함. 데이터가 너무 많으면 연산 효용성이 낮아지기 때문.


1D with PyTorch

t = torch.FloatTensor([0., 1., 2., 3., 4., 5., 6.])
print(t)```

2D with PyTorch

t = torch.FloatTensor([[1., 2., 3.],
                       [4., 5., 6.],
                       [7., 8., 9.],
                       [10., 11., 12.]
                      ])
print(t)```

브로드캐스팅: 자동으로 행렬의 크기를 맞춰서 연산을 수행하게 만드는 PyTorch 기능


matmul() 과 mul() 차이

  • matmul(): 행렬 곱셈

  • mul(): 서로 다른 크기의 행렬을 브로드캐스팅 후 element_wise 곱셈 실행.

  • .mean(): 평균

  • dim = 0: 첫번째 차원(행렬에선 행)이 0임을 의미

  • .sum(): 덧셈

  • .max(): 최댓값 리턴

  • .view(x,y): 원소의 수를 유지하면서 텐서의 크기 변경

    Numpy의 reshape과 같은 역할
    텐서의 크기를 (x,y)의 크기로 변경

    • view는 기본적으로 변경 전과 변경 후의 텐서 안의 원소의 개수가 유지되어야 합니다.
    • 파이토치의 view는 사이즈가 -1로 설정되면 다른 차원으로부터 해당 값을 유추합니다.
  • .squeeze(): 차원이 1인경우 해당 차원을 제거

    ex) (3x1)인 차원에서 (3,)의 크기를 가지는 텐서로 변경된

  • .Unsqueeze(): 특정 위치에 1인 차원을 추가한다

    ex) .unsqueeze(0)
    [0,1,2] -> [[0., 1., 2.]]
    인자로 -1이 들어가면 인덱스 상으로 마지막 차원을 의미


타입 캐스팅 : 자료형 변환


텐서 연결하기 (concatenate)

  • torch.cat([x,y], dim=0): 첫번째 차원을 늘리라는 의미
  • stacking: 연결을 하는 또 다른 방법. 쌓는 방법

  • ones_like(x): x와 동일한 크기지만 1로만 값이 채워진 텐서를 생성
  • zeros-like(x): x와 동일한 크기지만 0으로만 채워진 텐서

In-Place Operation (덮어쓰기 연산)

연산뒤에 _를 붙이면 기존의 값을 변수에 저장하지 않아도 덮어쓰기 함


3-1 선형회귀와 자동미분

  • x_train: 입력
  • y_train: 출력
  • Hypothesis: 머신러닝에서 식을 세울때 식을 가설이라고 함. H(x)=Wx+bH(x) = Wx + b, WW는 기울기 bb는 편향
  • 비용함수: Cost(W,b)=1Ni=1N(yi(Wxi+b))2Cost(W, b) = \frac{1}{N} \sum_{i=1}^{N} (y_i - (W \cdot x_i + b))^2

옵티마이저 : 최적화 알고리즘. 옵티마이저를 통해 최적한 WWbb를 찾아내는 과정을 머신러닝에서 학습이라고 함

  • 경사하강법: 비용함수를 미분하여 현재 WW에서의 접선의 기울기를 구하고, 접선의 기울기가 낮은 방향으로 WW의 값을 변경하는 작업을 반복.
  • 학습률: WW의 값을 변경할 때, 얼마나 크게 변경할지 결정.
  • require_gra = True: 학습을 통해 계속 값이 변경되는 변수임을 의미
  • optimizer.zero_grad(): 미분을 통해 얻은 기울기를 0으로 초기화
  • cost.backward(): 가중치 WWbb에 대한 기울기가 계산됨
  • optimizer.step(): 리턴되는 기울기의 변수들의 기울기에 학습률을 곱하여 뺴줌으로서 업데이트 함

전체코드

# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[2], [4], [6]])
# 모델 초기화
W = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([W, b], lr=0.01)

nb_epochs = 1999 # 원하는만큼 경사 하강법을 반복
for epoch in range(nb_epochs + 1):

    # H(x) 계산
    hypothesis = x_train * W + b

    # cost 계산
    cost = torch.mean((hypothesis - y_train) ** 2)

    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()

    # 100번마다 로그 출력
    if epoch % 100 == 0:
        print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f} Cost: {:.6f}'.format(
            epoch, nb_epochs, W.item(), b.item(), cost.item()
        ))

3-2 다중 선형 회귀

다수의 x로부터 y의 값을 예측하는 것
H(x)=w1x1+w2x2+w3x3+bH(x) = w_1x_1 + w_2x_2 + w_3x_3 + b

벡터의 내적: 행렬의 곱셈 과정에서 이루어지는 벡터 연산

x_train  =  torch.FloatTensor([[73,  80,  75], 
                               [93,  88,  93], 
                               [89,  91,  80], 
                               [96,  98,  100],   
                               [73,  66,  70]])  
y_train  =  torch.FloatTensor([[152],  [185],  [180],  [196],  [142]])

# 모델 초기화
W = torch.zeros((3, 1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([W, b], lr=1e-5)

nb_epochs = 20
for epoch in range(nb_epochs + 1):

    # H(x) 계산
    # 편향 b는 브로드 캐스팅되어 각 샘플에 더해집니다.
    hypothesis = x_train.matmul(W) + b

    # cost 계산
    cost = torch.mean((hypothesis - y_train) ** 2)

    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()

    print('Epoch {:4d}/{} hypothesis: {} Cost: {:.6f}'.format(
        epoch, nb_epochs, hypothesis.squeeze().detach(), cost.item()
    ))

--- nn.Module과 클래스 구현

0개의 댓글