_won_
wonprogrammer
_won_
전체 방문자
오늘
어제
  • 분류 전체보기
    • woncoding
      • TIL
      • WIL
    • source Code
      • Python
      • Programmers
      • BAEKJOON

블로그 메뉴

  • 방명록

티스토리

Github · Wonprogrammer
hELLO · Designed By 정상우.
_won_

wonprogrammer

TIL | 10.13.목 [머신러닝 / Django🐢]
woncoding/TIL

TIL | 10.13.목 [머신러닝 / Django🐢]

2022. 10. 14. 01:02

- 실전 머신러닝 적용

 

1. 딥러닝

인공지능 > 머신러닝 > 딥러닝

딥러닝이란? 선형회귀 / 논리회귀를 기반으로 하는 머신러닝 중의 한 분야이다.

 

선형회귀로 못 푸는 문제들은 비선형으로 해결해야하지만 처음부터 끝까지 비선형으로 해결할 수 없기 때문에 '선형회귀 + 비선형'를 Layer 형태로 만들었는데 이 모델을 층을 깊게(Deep) 쌓는다고 해서 딥러닝이라고 불린다.

  • 딥러닝 : Deep learning  🟰 Deep neural networks 🟰 Multilayer Perceptron(MLP)

 

 


 

 

 

 

[Backpropagation (역전파)]

 

 

👉 forward 된 값과 정답값이 맞지 않으면 Error가 나면서 되돌아 backward 되면서 다시 forward와 backward가 반복되면서 Error를 점차 조절해 나아간다.

 

 

 

 


 

 

 

 

[딥러닝 네트워크 계층 | Deep Neural Networks]

 

 

  • Input layer(입력층): 네트워크의 입력 부분입니다. 우리가 학습시키고 싶은 x 값입니다.
  • Hidden layers(은닉층): 입력층과 출력층을 제외한 중간층입니다. (2개 이상이 될 수 있음)
  • Output layer(출력층): 네트워크의 출력 부분입니다. 우리가 예측한 값, 즉 y 값입니다.

👉 보편적으로 노드의 갯수는 Input(4) - Hidden(8→4) - Output(3) 점점 늘어나다가 줄어드는 방식으로 구성된다.

 

 

  • 네트워크의 너비 : Node의 갯수
  • 네트워크의 깊이 : Hidden layers의 수를 늘린다.

 

👉 과적합과 과소적합을 피하기위해 같은 데이터라도 네트워크의 너비와 깊이를 바꾸면서 실험을 많이 한다.

 

 

 

 


 

 

 

 

[딥러닝의 주요 개념. 3]

 

- Batch size, Epoch (배치 사이즈, 에폭)

  • Batch size : 데이터 셋을 작은 단위로 쪼개서 작업해야 효율적인 개발이 가능한데 이때, 쪼개는 단위를 배치 사이즈라고 한다.
    • Batch : 쪼개진 데이터 갯수
    • Iteration : 데이터 셋을 작은 단위로 쪼개서 작업을 반복하는 횟수를 이터레이션 이라고 한다.
  • Epoch : batch를 몇 개로 나눠놓았냐에 상관 없이 전체 데이터셋을 한 번 도는 단위를 에폭이라고 한다.

 

 

 

- Activation functions (활성화 함수)

MLP 연결구조와 비슷하지만 신호(connections)의 크기가 임계치를 넘어야 활성화 된다. 

활성화 함수의 종류는 다양하다.

 

 

👉 여기서 가장 많이 보편적으로 쓰이는 활성화함수는 단연 ReLU(렐루) 이다. 왜냐하면 다른 활성화 함수에 비해 학습이 빠르고, 연산           비용이 적고, 구현이 간단하기 때문에 + ( 활성화 함수는 ReLU를 기준으로 예를들면 x값이 0이 넘어가는 값만 활성화 된다. )

 

 

 

 

 

- Overfitting, Underfitting (과적합, 과소적합)

  • 과적합 현상 : 우리가 풀어야하는 문제의 난이도에 비해 모델의 복잡도(Complexity)가 클 경우 가장 많이 발생하는 현상
  • 과소적합 현상 : 우리가 풀어야하는 문제의 난이도에 비해 모델의 복잡도가 낮을 경우 문제를 제대로 풀지 못하는 현상

 

 

👉 우리는 적당한 복잡도를 가진 모델을 찾아야 하고 수십번의 튜닝 과정을 거쳐 최적합(Best fit)의 모델을 찾아야 한다.

 

+ 과적합 해결방안 : 데이터를 더 모으기, Data augmenation, Dropout 등이 있다. (아래의 딥러닝의 주요 스킬에서 다뤄볼 예정)

 

 

 

 

 


 

 

[딥러닝의 주요 스킬. 4]

 

- Data augmentation (데이터 증강기법)

과적합 해결을 위해 Data 갯수를 늘리는 방법. 단! 거짓으로 데이터 수를 늘릴 수 없기 때문에 기존의 데이터의 변형으로 data 증강을 한다.

 

예) 사자의 얼굴인식 → 똑같은 사자 사진이더라도 사자 사진을 45도, 90도, 180도 등 회전 / 좌우반전 / 흐리게 /  흑백 ... 등 기존 데이터 변형으로 데이터를 증강 시킨다.

 

 

 

- Dropout (드랍아웃)

 

MLP구조에서 Node간 연결되어 있는 connections들 중 일부를 random하게 연결해제 한다. (output값을 0으로 만든다는 의미)

너무 많은 connections이 있다면 과적합 현상이 올 수 있기 때문에

 

 

 

- Ensemble (앙상블)

앞서 배운 random forest와 비슷하다.

 

 

👉 random forest와 다르게 다수결로 투표(Majority voting)를 사용하지 않고 각각의 결과값들을 보고 그 중에 하나를 pick한다.

 

 

 

 

 

- Learning rate decay (Learning rate schedules)

 

Learning rate decay 즉, 학습률 조정!

Learning Late를 조정해 학습률을 향상시킨다. 학습률은 폭은 '크게 → 작게'로 작아지면서 Local minimum을 찾아 나아간다.

Keras에서는  tf.keras.callbacks.LearningRateScheduler() 와  tf.keras.callbacks.ReduceLROnPlateau()를 사용하여 학습중 Learning rate를 조절한다.

 

 

 

 

 

 


 

 

 

 

 

- Django 

 

[로그인 기능 구현]

회원가입 된 user를 기준으로 로그인 기능을 만들어 줘야한다.

urls.py(앱)작업 → templates / views 작업  +  urls.py에서 변수 url 작업까지!

 

 

  • 4-1) 유저가 이동할 수 있는 경로인 urls.py를 작업해 준다.
urlpatterns = [
    # path('signup/', views.signup, name='signup'),
    
    path('login/', views.login, name='login'),
    path('user/', views.user, name='user'),

    # 변수명 url 사용
    path('<str:username>/', views.profile, name='profile'),
]

변수명 url은 앞에 <변수자료형 : 변수명>을 적어준다

 

 

  • 4-2) 해당 경로에 접근했을때 보여줄 templates 작업과 / 일어날 작업들을 만들어 주는 views.py 를 작업해 줘야 한다.  

 

- templates 작업

  • login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login Page</title>
</head>


<body>

    <h1> 로그인 페이지 </h1>

    <form action="{% url 'users:login' %}" method="POST">
        {% csrf_token %}
        <input type="text" 
        name="username"  
        placeholder="username" 
        id='username' 
        class='username'
        />
        <input type="password" name="password" id="" placeholder="password" />
        <input type="submit" />
    </form>

</body>

</html>

 

  • profile.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>profile page</title>
</head>


<body>
    <!-- context 안 key 값 = user -->
    <div> 
    {{ user }} 이고,
    마지막 로그인은? {{ user.last_login }}
    </div>  

# 회원가입된 유저는 모두 이름과 마지막 로그인 일시가 나오지만 
# 내 프로필 페이지 + 버튼은 로그인 되어있는 유저와 현재유저가 같아야 뜸

    {% if user == request.user %}
    <div>내 프로필 페이지</div>
    <button>프로필 편집버튼</button>
    {% endif %}



</body>

</html>

 

 

 

 

- views 작업

 

def login(request):
    if request.method == 'GET':  # 단순 주소창에 입력했을때
        return render(request, 'login.html')
    elif request.method == 'POST':  # 로그인 요청
        username = request.POST.get('username')    # username은 login.html안에 input박스에서 username 이다.
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)

    #로그인 GET or POST 작업 후 이 다음코드 진행

        if user is not None:  # user 가 존재하지 않는게 아니면 = if user (user 라면!)
            # 장고에서 제공해주는 login 기능을 as로 재정의 후 이용
            loginsession(request, user)
            return redirect('users:user')   #로그인 성공시 입력된 user 값으로 로그인 흐 user/ 로 경로이동
        else:
            return redirect('users:login')




def user(request):
    #request.user = 로그인된 사용자
    return HttpResponse(request.user)  # user명 반환 (장고가 알아서 user값 가져와 : GET/POST 필요 X)




# 변수명 url에서 username을 인자로 받아오기 때문에 같이 선언해줘야됨 ( 여기서 username = url 에서 사용된 변수명(html에서 가져온거 아님) )
def profile(request, username):
    user = User.objects.get(username=username)  # db에 저장된 username 필드 = 로그인 된 username 이랑 같다면 user 맞아! 

    context = {
        'user':user
    }

    return render(request, 'profile.html', context)

 

 

 

 

 

 

 

 

저작자표시 비영리 변경금지 (새창열림)

'woncoding > TIL' 카테고리의 다른 글

TIL | 10.17.월 [머신러닝]  (0) 2022.10.17
TIL | 10.14.금 [Django🐢]  (0) 2022.10.14
TIL | 10.12.수 [머신러닝 / Django🐢]  (0) 2022.10.12
TIL | 10.11.화 [Django🐢]  (0) 2022.10.11
TIL | 10.7.금 [머신러닝]  (1) 2022.10.11
    'woncoding/TIL' 카테고리의 다른 글
    • TIL | 10.17.월 [머신러닝]
    • TIL | 10.14.금 [Django🐢]
    • TIL | 10.12.수 [머신러닝 / Django🐢]
    • TIL | 10.11.화 [Django🐢]
    _won_
    _won_
    Coding Practice blog

    티스토리툴바