- 실전 머신러닝 적용
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 |