Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2주차 과제 #3

Open
GirinMan opened this issue Mar 28, 2023 · 10 comments
Open

2주차 과제 #3

GirinMan opened this issue Mar 28, 2023 · 10 comments
Assignees
Labels
assignment 각 주차별 조별 과제 기록

Comments

@GirinMan
Copy link
Member

GirinMan commented Mar 28, 2023

두 번째 과제: PyTorch로 딥러닝 모델 학습하기

회합 자료 링크: #1 (comment)

  • 미리 만들어진 colab notebook을 실행해보면서, 간단한 데이터 분류를 수행하는 모델을 학습시켜 봅시다!
  • 노트북 실행 방법은 지난 회합 자료 마지막 부분을 참고하세요.

Colab Python 노트북을 사용한 모델 학습 실습

  • Google 계정 로그인 후 colab에 접속해서 현재 레포지토리의 /Week2/train_neural_network.ipynb 노트북을 실행해보면서 아래와 같은 단계로 과제를 진행해 주세요.
  • 이번 과제에서 다룰 문제는 이진 분류(Binary Classification) 입니다. 간단하게 2차원 좌표 상에 있는 점들을 특정 기준에 따라 라벨을 1 또는 0으로 부여하고, 새로운 데이터가 들어왔을 때 모델이 적절한 라벨을 유추할 수 있도록 학습시켜 볼거에요!
  • 분류 대상인 데이터는 아래와 같이 생겼습니다.

x < -5 or x > 5 인 값 (x, y)에 대해 label=1
나머지 좌표에 대해서는 label=0

image

Step 1. Layer 1개로 구성된 모델로 이진 분류 학습시키기

  • 하나의 layer는 각각 weight와 bias를 지니고 있어 1차함수를 표현할 수 있습니다.
  • 주어진 데이터를 잘 분류하도록 모델을 학습시켜 봅시다.

Step 2. Layer 2개로 구성된 모델로 이진 분류 학습시키기

  • 하나의 layer밖에 없는 모델은 표현할 수 있는 범위에 한계가 있습니다.
  • Layer를 하나 더 추가해서 조금 더 복잡한 모델을 만들어 학습하고 결과를 확인해 봅시다.

Step 3. 새로운 데이터 분류하기

  • 아래와 같은 데이터들을 분류하는 모델을 만들어 보려고 합니다.
  • Layer가 1개인 모델과 2개인 모델 중 어떤 모델이 더 적합할까요?
  • 조별로 각각의 데이터에 대해 적합한 모델과, 그 이유를 적어주세요.
  • 실습 노트북에서 맨 처음 데이터 부분만 아래 코드로 바꿔서 실행해보면 결과를 알 수 있어요!

1번 데이터: x + y > 0 인 경우 label=1, 나머지 label=0

image

import random
import numpy as np

# 재현을 위해 seed 고정
random.seed(42)
np.random.seed(42)

x1_train=[]
x2_train=[]
y_train=[]

# 데이터 개수
m = 10000

for i in range(m):
    x1_train.append(random.uniform(-10, 10))
    x2_train.append(random.uniform(-10, 10))
    if x1_train[-1] + x2_train[-1] > 0:
        y_train.append(1)
    else:
        y_train.append(0)

x = np.array([x1_train, x2_train]).transpose()
y = np.array(y_train).reshape(-1, 1)

print(f"X: {x.shape}\n {x}")
print(f"Y: {y.shape}\n {y}")

2번 데이터: x * y > 0 인 경우 label=1, 나머지 label=0

image

import random
import numpy as np

# 재현을 위해 seed 고정
random.seed(42)
np.random.seed(42)

x1_train=[]
x2_train=[]
y_train=[]

# 데이터 개수
m = 10000

for i in range(m):
    x1_train.append(random.uniform(-10, 10))
    x2_train.append(random.uniform(-10, 10))
    if x1_train[-1] * x2_train[-1] > 0:
        y_train.append(1)
    else:
        y_train.append(0)

x = np.array([x1_train, x2_train]).transpose()
y = np.array(y_train).reshape(-1, 1)

print(f"X: {x.shape}\n {x}")
print(f"Y: {y.shape}\n {y}")
@GirinMan GirinMan added the assignment 각 주차별 조별 과제 기록 label Mar 28, 2023
@GirinMan GirinMan self-assigned this Mar 28, 2023
@GirinMan
Copy link
Member Author

GirinMan commented Mar 28, 2023

과제 제출 예시

0조

1번 데이터

  • 적합한 모델: Layer X개인 모델
  • 이유: ...
  • 학습 결과 스크린샷: (만약 학습을 진행해봤다면 첨부해주세요)

2번 데이터

  • 적합한 모델:
  • 이유:
  • 학습 결과 스크린샷:
    image
    image

@t2easure
Copy link

2조

1번 데이터
적합한 모델: Layer 1
이유: 데이터가 선형이기 때문에 layer 1개로 학습이 가능하다.

학습 결과 스크린샷:
image
image

2번 데이터
적합한 모델: layer 2
이유: 데이터가 비선형이기 때문에 layer가 많을수록 학습이 잘 이뤄진다.
학습 결과 스크린샷:
image
image

@Ahngab
Copy link

Ahngab commented Mar 30, 2023

1번 데이터

적합한 모델: Layer 한 개

이유: 이진 데이터기 때문에 Layer 하나로 True or Flase 만 판단하면 된다. 따라서 Layer 하나 가능

Loss_1

2번 데이터

적합한 모델 Layer 두 개

이유 : 데이터가 두개의 선으로 인해 네 개의 영역으로 나누어지는 것을 볼 수 있다. 따라서 Layer 두 개가 가장 적합함!~

Loss_2
](url)

@geneeol
Copy link

geneeol commented Mar 30, 2023

4조

1. 김율희


1번 데이터

  • 적합한 모델 : Layer가 1개인 모델
  • 이유 : 직선 하나로도 분류할 수 있는 데이터라 Layer가 1개인 모델로도 충분히 분류할 수 있습니다.

2번 데이터

  • 적합한 모델 : Layer가 2개인 모델
  • 이유 : 직선 하나만으로는 분류할 수 없는 데이터이기 때문에 Layer가 2개 이상인 모델이 데이터를 분석하는데 적합합니다. hidden layer의 차원을 높이면 분류 정확도가 더 높아지는 것을 볼 수 있습니다.

2. 표지원


1번 데이터

  • 적합한 모델: Layer가 1개인 모델
  • 이유: 데이터가 단순히 선형 경계를 기준으로 나뉘어 분포해 있기 때문.

2번 데이터

  • 적합한 모델: Layer가 2개인 모델
  • 이유: layer가 1개인 모델에 비해 결정경계를 더 복잡하게(2개로 나누어서) 그릴 수 있기 때문.

3. 설유민


1번 데이터

  • 적합한 모델: Layer가 1개인 모델
  • 이유: 선형 함수로 데이터를 충분히 분류할 수 있기에, 1개의 layer로도 효율적으로 분류 모델을 만들 수 있습니다.

2번 데이터

  • 적합한 모델: Layer가 2개 이상인 모델
  • 이유: 단순한 선형 함수 1개로 데이터를 구분하기 어렵기 때문에, 다층을 사용해 보다 복잡한 규칙을 표현할 수 있도록 하는 것이 적합합니다.
    💡 같은 생성 규칙으로 소량의 데이터를 생성해 validation을 해보았는데, validation loss와 validation accuracy가 함께 증가하는 현상이 나타났습니다! 직관과는 조금 거리가 있는 결과인데요, 어떤 경우에 이런 결과가 발생할 수 있는지 같이 생각해보면 좋을 것 같아요!

4. 김재명


1번 데이터

  • 적합한 모델: Layer 1개인 모델
  • 이유: 1차 함수로 충분히 분류가능한 데이터임

2번 데이터

  • 적합한 모델: Layer 2개 이상의 모델
  • 이유: 주어진 데이터를 분류할 수 있는 1차 함수를 찾을 수 없음

5. 강다형


1번 데이터

  • 적합한 모델: Layer가 1개인 모델
  • 이유: 1개의 레이어로도 충분히 분류가능한 데이터입니다. 따라서 굳이 레이어를 추가하여 연산량을 늘릴 필요는 없을 것 같습니다.

2번 데이터

  • 적합한 모델: Layer가 2개인 모델
  • 이유: 전자와 달리 데이터셋이 단순히 직선 하나로 분류되지 않습니다. 이런 경우 여러층의 레이어를 통해서만 문제를 해결할 수 있는 것 같습니다. 추가로 활성화함수로 시그모이드함수 대신 ReLU함수를 사용할 때, 효과적으로 학습되는 것을 확인할 수 있었습니다.

학습결과


KakaoTalk_Photo_2023-03-30-14-50-56 002
KakaoTalk_Photo_2023-03-30-14-50-56 003
KakaoTalk_Photo_2023-03-30-14-50-40 001
KakaoTalk_Photo_2023-03-30-14-50-40 002
KakaoTalk_Photo_2023-03-30-14-50-40 003
KakaoTalk_Photo_2023-03-30-14-50-40 004
KakaoTalk_Photo_2023-03-30-14-50-23
KakaoTalk_Photo_2023-03-30-14-50-29
KakaoTalk_Photo_2023-03-30-14-50-56 001

@YUNHYUNWOO
Copy link

3조

1번 데이터
적합한 모델: 레이어가 1개인 모델
이유: 만들고자 하는 모양이 1차함수이기 때문에 레이어가 1개인 모델로도 충분히 좋은 결과를 얻을 수 있습니다.
학습 결과 스크린샷:
HAI 1-1
HAI 1-2

2번 데이터
적합한 모델: 레이어가 2개인 모델
이유: 레이어가 1개인 모델로 학습시키기엔 충분히 복잡한 모양이므로 2개를 사용하는 것이 좋은 결과를 얻을 수 있습니다.
학습 결과 스크린샷:
HAI 2-1
HAI 2-2

@ClubTs
Copy link

ClubTs commented Mar 30, 2023

5조
<1번 데이터>
적합한 모델: 레이어가 1개인 모델
이유: y = -x라는 하나의 직선으로 데이터를 분류할 수 있으므로 레이어 하나만 사용하는 모델이 적합하다.

<2번 데이터>
적합한 모델: 레이어가 2개인 모델
이유: 2차원 평면 상에서 직선 하나로 분류가 불가능하기 때문에 레이어를 추가함으로써 공간을 왜곡시켜야하기 때문이다. 뿐만 아니라 은닉층의 차원도 증가를 시켜야 정확한 분류가 가능하다.
(레이어 4개로 학습시킨 결과)
KakaoTalk_20230330_160843498_01

@KangMeanWoo
Copy link

강민우

1번 데이터
적합한 모델: Layer 1개인 모델
이유: 1개의 레이어로 분류가 가능한 데이터이기 때문에
학습 결과 스크린샷:
download
download
download
download

2번 데이터
적합한 모델 : Layer 2개인 모델
이유: 1개의 직선으로는 분류할 수 없는 데이터이기 때문에 Layer을 늘려야 한다.
학습 결과 스크린샷:
download
download
download
image

@twkang43
Copy link

강태욱

1번 데이터

boundary가 1개인 데이터셋이므로, 1개의 layer만으로도 충분히 데이터를 정확하게 분류할 수 있다.
따라서, 1개의 layer model을 통해 데이터를 효율적으로 분류 가능하다.
image
image
image
image

2번 데이터

boundary가 2개인 데이터셋이므로, 최소 2개 이상의 layer가 필요하다.
모델 튜닝 과정에서 은닉층의 노드 개수를 늘리니 모델이 더 정확해졌다.
하지만, overfitting의 위험이 있으니 적절한 노드 개수를 설정하는 것이 중요할 것 같다.
image
image
image
image

@mnxcv
Copy link

mnxcv commented Jul 18, 2023

임세훈

1번 데이터

  • 적합한 모델: Layer 1개인 모델
  • 이유 : 데이터가 선형적으로 분류될 수 있기 때문에 일차함수 꼴로
    표현되는 데이터를 구분할 수 있는 Layer 1개인 모델로 충분하다.

2번 데이터

  • 적합한 모델: Layer 2개인 모델
  • 이유 : 데이터가 선형적으로 분류될 수 없는 XOR 형태의 데이터이기 때문에 2개 이상의 Layer로 Model을 구성해야 한다.

사진

1. 데이터 분포

2. 학습

2-1. 1번 데이터
2-2. 2번 데이터

3. 결과

3-1. 1번 데이터
3-2. 2번 데이터

Colab 노트북 주소는
링크에서 확인할 수 있습니다.

@DHki
Copy link

DHki commented Jul 22, 2023

김동하

1번 데이터 : Layer 1개를 가지는 모델

1번 데이터는 X가 1차원의 값을 가집니다.
좌표 평면에 있어 하나의 경계선만 그린다면 원하는 기준으로 값을 나눌 수 있기 때문에 1개의 Layer를 가지는 모델이 적합합니다.

2번 데이터 : Layer 2개를 가지는 모델

2번 데이터는 XOR 형식을 가진 데이터입니다.
해당 데이터는, 하나의 선을 이용해서 완전히 예측하기 어려운 구조이기 때문에 더 복잡한 경계선을 그려줄 수 있는
Layer 2개를 가진 모델이 적합합니다.


사진

  1. 1번 모델을 이용해 1번 데이터를 분류한 사진
    image

  2. 2개의 계층을 가지는 모델을 이용해 학습 시켰을 때의 loss 변화
    image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
assignment 각 주차별 조별 과제 기록
Projects
None yet
Development

No branches or pull requests

10 participants