-
-
Notifications
You must be signed in to change notification settings - Fork 0
edu05
aiegoo edited this page Oct 20, 2019
·
1 revision
- Tensorflow 1.2부터 통합, Tensorflow 2.0부터 공식적인 Tensorflow의 상위 계층으로 지정
- Keras는 Tensorflow의 까다로운 문법과 여러 학습의 최적화 기법을 지원
- Sequential 함수는 딥러닝의 구조를 한 층 한 층 쉽게 쌓아올릴 수 있게 해 줌 Sequential 함수를 선언하고 나서 model.add() 함수를 사용해 필요한 층을 차례로 추가하면 됨
-
add 함수는 Dense 함수를 이용하여 계층 추가
-
입력층+은닉층
- 코드: model.add(Dense(100, input_dim=17, activation='relu'))
- Keras는 입력층과 은닉층이 결합되어 있음.
- 은닉층의 각노드는 입력값과 임의(random)의 가중치를 할당받고 활성화 함수를 거쳐 최종 출력 값을 생성함.
- 100: 출력 노드의 갯수
- input_dim=17: 입력 노드(속성/변수) 17 개임
- activation='relu': 활성화 함수는 'relu' 함수를 사용함.
-
은닉층
- 코드(전결합층, 밀집층, 완전 연결층): model.add(Dense(40, activation='relu'))
- 은닉층의 각노드는 입력값과 임의(random)의 가중치를 할당받고 활성화 함수를 거쳐 최종 출력 값을 생성함.
- 40: 출력 노드의 갯수
- activation='relu': 활성화 함수는 'relu' 함수를 사용함.
-
출력층
- 코드: model.add(Dense(1)): 수치 예측
- 코드: model.add(Dense(1, activation='sigmoid')): 이항 분류
- 코드: model.add(Dense(1, activation='softmax')): 다항 분류
- 출력층의 출력 데이터 개수는 1개임으로 1임
- 은닉층으로부터의 입력데이터에 가중치를 곱하고 활성화 함수를 이용하여 최종 결과를 산출함.
-
모델 학습 과정 설정
- 코드: model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
- 지정한 모델이 효과적으로 구현될 수 있게 여러 가지 환경을 설정하는 부분
- loss : 현재 가중치 세트를 평가하는 데 사용한 손실 함수(오차 함수). . mean squared error(mse: 평균 제곱 오차): 수치 예측 예) 매출액 . binary_crossentropy(이항 교차 엔트로피): 이항 분류 예) 참/거짓, 0/1, 생존/사망, 합격/불합격 . categorical_crossentropy(범주형 교차 엔트로피): 다항(다중/범주) 분류 예) 품종 분류, 자동차의 종류 분류, 등급 분류
- 평균으로부터의 오차를 계산하는 오차 함수의 종류, loss 옵션에 사용
- optimizer(경사 하강법의 종류(최적화 함수)) : 최적의 가중치를 검색하는 데 사용되는 최적화 알고리즘으로 효율적인 경사 하강법 알고리즘 중 하나인 ‘adam’을 사용.
- metrics : 평가 척도를 나타내며 분류 문제에서는 일반적으로 ‘accuracy’으로 지정.
-
모델 학습시키기
- 코드: model.fit(X, Y, epochs=10, batch_size=10)
- 에포크(epochs): 전체 데이터에 대하여 반복할 학습 횟수
- batch_size: 데이터를 한번에 몇건씩 처리할 것인지 선언 batch_size는 적당히 커야하는데 너무 크면 학습 속도가 빨라지나 정확도는 떨어지고, 많은 메모리를 사용함으로 메모리 overflow문제 발생 할 수 있음으로 자신의 컴퓨터 메모리가 감당할 만큼의 batch_size를 찾아 설정, 너무 작으면 데이터의 이상치(outlier)의 각 실행 값의 편차가 생겨서 전체 결괏값이 불안정해질 수 있음
- batch_size가 1이면 1건 처리시마다 가중치를 변경하며, 2000이면 2000건의 처리후 가중치를 변경하여 세부적인 가중치 변경이 어려움.
-
진행 사항을 챠트로 표현
# # 진행 사항을 챠트로 표현 # fig, loss_ax = plt.subplots() fig.set_size_inches(10, 5) # 챠트 크기 설정 acc_ax = loss_ax.twinx() # x 축을 공유하는 새로운 Axes 객체를 만든다. loss_ax.set_ylim([0.0, 1.0]) acc_ax.set_ylim([0.0, 1.0]) loss_ax.plot(hist.history['loss'], 'y', label='train loss') acc_ax.plot(hist.history['acc'], 'b', label='train acc') loss_ax.set_xlabel('epoch') loss_ax.set_ylabel('loss') acc_ax.set_ylabel('accuray') loss_ax.legend(loc='upper left') acc_ax.legend(loc='lower left') plt.show()
-
모델 평가하기
- 코드:
print("\n Accuracy: %.4f" % (model.evaluate(X, Y)[1]))
- 데이터와 처리 결과를 이용해 정확도를 결과로 출력
- 학습데이터가 아닌 다른 데이터를 평가 대상으로 선정, 일반화 성능을 높이려는 의도.
- 코드:
-
모델의 저장
- model.save('CancerSurvival.h5')
- 모델 저장 파일 형식 및 저장 내용: h5 ① 나중에 모델을 재구성하기 위한 모델의 구성 정보 ② 모델를 구성하는 각 뉴런들의 가중치 ③ 손실함수, 최적하기 등의 학습 설정 ④ 재학습을 할 수 있도록 마지막 학습 상태
-
모델 로딩
- model = load_model('CancerSurvival.h5')
-
모델의 사용
- 코드
predict_value = model.predict_classes(x_data[0:10]) print('type(predict_value):', type(predict_value)) print('predict_value:', predict_value) model.summary() print('-------------------------------------------------------') for i in range(len(x_data)): print('실제값:', y_data[i], '예측값:', predict_value[i])
-
모델의 사용 챠트로 확인
# 모델 사용 결과를 챠트로 표현 plt.scatter(x_data, y_data, color='g') plt.plot(x_data, y_data, color='g') plt.scatter(x_data, y_predict, color='r') plt.plot(x_data, y_predict, color='r') plt.grid(True) plt.show()
- matplotlib 관련 에러 발생시의 처리 _getfullpathname: embedded null character : Python3.x 에서 plt 오류 import matplotlib.pyplot as plt 시 _getfullpathname: embedded null character 오류 메세지가 나타나면,
'C:\ProgramData\Anaconda3\envs\machinegpu\Lib\site-packages\matplotlib' 설치 폴더내의 'font_manager.py' 파일 241번 라인 편집
def win32InstalledFonts(directory=None, fontext='ttf'): 함수 안의 direc = os.path.abspath(direc).lower() 를
direc = direc.split('\0', 1)[0]
로 변경할 것. -
네트워크, 층, 손실 함수, 옵티마이저 사이의 관계
-
마지막층의 활성화 함수와 손실함수 선택 기준(활성화 함수, 손실 함수)
- 이진 분류: Sigmoid, binary_crossentropy
- 단일 레이블 다중 분류: softmax, categorical_crossentropy
- 다중 레이블 다중 분류: simoid, binary_crossentropy
- 임의 값에 대한 회귀: 없음, mse
- 0과 1사이 값에 대한 회귀: Sigmoid, mse 또는 binary_crossentropy
- 경고 메시지 출력 중지 및 matplotlib 한글 깨짐처리
import warnings
warnings.filterwarnings(action='ignore')
import os
import random
import pandas as pd
import seaborn as sns
import numpy as np
import tensorflow as tf
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import to_categorical
from keras.utils import np_utils
from keras.models import load_model
from sklearn.preprocessing import LabelEncoder # class가 문자열인경우 변환
from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint
from sklearn.model_selection import train_test_split # 학습셋과 테스트셋을 나눔
from sklearn.model_selection import StratifiedKFold # K겹 교차 검증
#
# CNN 테스트시 failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED 에러 발생시 추가
config = tf.ConfigProto()
# config.gpu_options.per_process_gpu_memory_fraction = 1.0 # 메모리를 사전에 모두 할당
config.gpu_options.allow_growth = True # 메모리를 필요시 할당
session = tf.Session(config=config)
session = tf.Session(config=tf.ConfigProto(log_device_placement=True)) # 연결된 device 확인
#
font_name = font_manager.FontProperties(fname="C:/Windows/Fonts/malgun.ttf").get_name()
# windows 10
# font_name = font_manager.FontProperties(fname="C:/Windows/Fonts/malgunsl.ttf").get_name()
rc('font', family=font_name) # 맑은 고딕 폰트 지정
plt.rcParams["font.size"] = 12 # 글자 크기
# plt.rcParams["figure.figsize"] = (10, 4) # 10:4의 그래프 비율
plt.rcParams['axes.unicode_minus'] = False # minus 부호는 unicode 적용시 한글이 깨짐으로 설정
# Jupyter에게 matplotlib 그래프를 출력 영역에 표시할 것을 지시하는 명령
%matplotlib inline
seed = 0
tf.set_random_seed(seed)
np.random.seed(seed)
fig, loss_ax = plt.subplots()
# plt.figure(figsize=(6,4)) # ERROR
fig.set_size_inches(10, 5) # 챠트 크기 설정
acc_ax = loss_ax.twinx() # 오른쪽 y 출 설정
loss_ax.plot(hist.history['loss'], 'y', label='train loss')
loss_ax.plot(hist.history['val_loss'], 'r', label='val loss')
loss_ax.set_ylim([0.0, 10.0]) # 값을 반영하여 변경
acc_ax.plot(hist.history['acc'], 'b', label='train acc')
acc_ax.plot(hist.history['val_acc'], 'g', label='val acc')
acc_ax.set_ylim([0.0, 1.0])
loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')
acc_ax.set_ylabel('accuray')
loss_ax.legend(loc='upper left')
acc_ax.legend(loc='lower left')
plt.show()
[01] 인공 신경망(ANN: Artificial Neural Network)
- 뇌를 구성하는 신경세포 뉴런(Neuron)의 동작원리에 기초한 기술
- 인간의 뇌는 1000억개의 뉴런으로 구성됨.
인공 지능 > 머신 러닝(SKlearn) > 신경망(퍼셉트론) > 딥러닝(다층 퍼셉트론, Tensorflow, PyTorch)
1. 신경 세포
- 각종 동물의 신경세포와 시냅스 수
![](/images/30.jpg)
- 생물의 신경 세포의 동작은 축색말단에서 가지돌기로 시냅스가 전송되고
시냅스의 값은 0이상의 아날로그 값으로 다양하다.
- 축색(축색말단)은 가지돌기(수상돌기)에게 시냅스를 전달한다.
이 시냅스는 인공신경망에서 실수값으로 표현이 가능하며 가중치 변경을 통한 출력 결과를 산출한다.
- 가지 돌기: 입력값
- 축색 말단: 출력 값
![](images/4007.jpg)
- 신경 세포에서의 정보 전달 구조도
![](/images/4025.jpg)
1. 신경 세포의 모델화(SW로 구현)
![](/images/4031.jpg)
3. 출력과 활성화 함수의 관계
- y: 출력
- f(u): 활성화 함수
- x: 변수, 데이터
- w: 기울기, 가중치
- b: y 절편, 편향
![](images/4011.jpg)
![](images/4002.jpg)
4. 퍼셉트론 step 함수, 신경세포의 동작을 0과 1의 디지털 수식으로 표현
- 인공 지능 > 머신 러닝 > 퍼셉트론 > 다층 퍼셉트론 > 딥러닝
- 축색말단은 다음 신경 세포의 가지돌기로 시냅스 전송시 시냅스의 값은
일정한것으로 표현했으며 디지털 값으로 0과 1로 나타냈다.
- 가지돌기로 들어온 데이터의 합이 임계값을 넘어가면 1을 출력하고
그렇지 않으면 0을 출력한다.
. 가지돌기(수상돌기): 입력값, 정보의 종류, x1 ~ x5
. 가지돌기(수상돌기)로 들어오는 정보의 종류의 가중치: w1 ~ w5
. ∑(통합): 입력값과 가중치의 곱 + y 절편(편향)
. 스텝함수: 통합데이터를 특정 함수에 할당하여 지정된 값을 넘어가면 1, 그렇지않으면 0 출력
- 스텝함수
![](images/4006.png)
- 신경망을 이루는 가장 중요한 기본 단위는 퍼셉트론(perceptron)
- 퍼셉트론은 입력 값과 활성화 함수를 사용해 출력 값을 다음으로 넘기는 가장 작은 신경망 단위
- 퍼셉트론에서는 y = wx + b(w는 가중치, x는 입력값, b는 편향이란 뜻의 bias)로 쓰임.
- 가중합(weighted sum): 입력 값(x)과 가중치(w)의 곱을 모두 더한 다음 거기에 바이어스(b)를 더한 값
- 가중합의 결과를 놓고 1 또는 0을 출력해서 다음으로 보냄
- 여기서 0과 1을 판단하는 함수가 있는데, 이를 활성화 함수(activation function) 라고 함.
항등 함수(선형회귀), Sigmoid(2항 분류, 참거짓분류), Softmax(다중 분류, 사물 인식)등
- AND, OR, XOR 진리표대로 좌표 평면에 표현한 뒤 선을 그어 색이 같은 점끼리 나누기(XOR는 불가능)
이는 인공지능 분야의 선구자였던 MIT의 마빈 민스키(Marvin Minsky) 교수가 1969년에 발표한
<퍼셉트론즈(Perceptrons)>라는 논문에 나오는 내용으로 10여 년이 지난 후에야
이 문제가 해결되는데, 이를 해결한 개념이 바로 다층 퍼셉트론(multilayer perceptron)임.
![](images/4006.jpg)
[02] 다층 퍼셉트론(Multilayer Perceptron)
- 인공 신경망을 나타내는 핵심 이론
1. 다층 퍼셉트론 개론
- 선형회귀에서 해결하기 어려운 XOR 문제의 극복은 평면을 휘어주는것! 즉, 좌표 평면 자체에 변화를 주는 것이다.
- XOR 문제를 해결하기 위해서 두 개의 퍼셉트론을 한 번에 계산할 수 있어야 함
이를 가능하게 하려면 숨어있는 층, 즉 은닉층(hidden layer)을 만들면 됨
- 다층 퍼셉트론이 입력층과 출력층 사이에 숨어있는 은닉층을 만든 형태
- 가운데 숨어있는 은닉층으로 퍼셉트론이 각각 자신의 가중치(w)와 바이어스(b, 편향)
값을 보내고, 이 은닉층에서 모인 값이 한 번 더 시그모이드 함수를 이용해 최종 값으로 결과를 보냄
- 은닉층에 모이는 중간 정거장을 노드(node)라고 하며, 여기서는 n1과 n2로 표현
- n1과 n2의 값은 각각 단일 퍼셉트론의 값과 같음
![](images/40004.jpg)
- 아래의 두 식의 결괏값이 출력층으로 보내짐
- 출력층에서는 역시 시그모이드 함수를 통해 0 ~ 1 사이의 y 값이 정해짐
![](images/40006.jpg)
- 가중치(x)와 바이어스(b)를 2차원 배열로 늘어놓으면 다음과 같이 표시할 수 있음
- 은닉층을 포함해 가중치 6개와 바이어스 3개가 필요함
- 가중치(w)와 바이어스(b)를 2차원 행렬로 나타낸 경우
![](images/40007.jpg)
- 논리표 XOR의 결과를 출력하는 가중치와 바이어스
![](images/40008.jpg)
![](images/40009.jpg)
-퍼셉트론은 그림과 같이 여러 개의 신호(x1, x2, x3,...)를 입력받아서 하나로 출력(output)한다.
여기서, 입력과 출력은 2진수 값(0,1)을 사용한다.
각각의 입력 신호에는 가중치가 부여되는 데, 한 퍼셉트론에 들어온 모든 입력 x 가중치의 합(transfer function)이
임계 값(threshold: 입력값이 활성화되기 위한 최소값)보다 적으면 0이 출력되고,
크면 1이 출력되는 구조이다.
이렇게 임계 값보다 작은지 큰지를 판단해서 출력하는 함수를 활성함수(activation function)이라 한다.
- x1, x2의 입력값과 바이어스에 따라 진리표 XOR 값이 출력됨.
- 여기서 σ(시그모이드)는 활성화 함수로 실습에서는 MLP 함수를 정의하여 사용함.
- x1 x2 n1 n2 y out
0 0 MLP(0*-2 + 0*-2 + 3): 3 ▷ 1 MLP(0*2 + 0*2 - 1): -1 ▷ 0 MLP(1*1 + 0*1 - 1): 0 ▷ 0
0 0 MLP(0*-2 + 1*-2 + 3): 1 ▷ 1 MLP(0*2 + 1*2 - 1): 1 ▷ 1 MLP(1*1 + 1*1 - 1): 1 ▷ 1
0 0 MLP(1*-2 + 0*-2 + 3): 1 ▷ 1 MLP(1*2 + 0*2 - 1): 1 ▷ 1 MLP(1*1 + 1*1 - 1): 1 ▷ 1
0 0 MLP(1*-2 + 1*-2 + 3): -1 ▷ 0 MLP(1*2 + 1*2 - 1): 3 ▷ 1 MLP(0*1 + 1*1 - 1): 0 ▷ 0
![](images/40010.jpg)
1. 다층 퍼셉트론으로 논리값 출력 실습
▷ /ws_python/notebook/machine/basic/MLP_test.py
-------------------------------------------------------------------------------------
첨부 파일 참고
-------------------------------------------------------------------------------------
[03] 뉴런의 네트워크화
1. 인공 뉴런들을 연결해 구성한 인공신경망
1) 단순 신경망
- 입력층, 은닉층, 출력층으로 구성, Sigmoid(x(입력) * (가W중치) + b(편향)) → y(출력)
![](images/4009.png)
2) 심층 신경망(딥러닝)
- 은닉층이 여러개가 연속적으로 연결된 신경망
- 제프리 힌튼 교수는 심층 신경망을 효율적으로 학습 시킬 수 있는 신경망 학습 알고리즘을 개발함.
Sigmoid(x(입력) * (가W중치) + b(편향))
→ Sigmoid(x(입력: 이전의 y 출력) * (가W중치) + b(편향))
→ Sigmoid(x(입력: 이전의 y 출력) * (가W중치) + b(편향)) → y 최종 출력
- 심층 신경망의 복잡한 형태
![](images/4011.png)
2. 심층 신경망(딥러닝)의 해석
- 2개의 데이터
- 1개의 Input Layer
- 2개의 Hidden Layer
. 첫번재 은닉층은 4개의 node로 구성, 행렬 곱하기 연산 실행, 가중치 8개, 편향 4개
. 두번재 은닉층은 2개의 node로 구성, 행렬 곱하기 연산 실행, 가중치 8개, 편향 2개
- 1개의 출력 Layer, 가중치 2개, 편향 1개, 활성화 함수 사용
![](images/40007.jpg)
3. 가중치의 계산(파라미터)
- 난수를 이용하여 무작위추출 한 후 결과의 비교를 통해 가중치를 변경
- 파라미터는 딥러닝 엔진에서 자동으로 처리함.
1) 첫번째 input node: 2.00
2) 첫번째 hidden node: (2.00 * 0.1) + (3.00 * 0.5) + (4.00 * 0.9) + (-2.0)
입력값 * 가중치 + y 절편
= 0.2 + 1.5 + 3.6 - 2.0
= 3.3
시그모이드 함수 적용(e=2.71828): 1.0 / (1.0 + 2.71828^-(3.3)) = 0.96
= 1.0 / (1.0 + 0.036883)
= 1.0 / 1.036883
= 0.964429
- ih_w: input layer에서 hidden layer로 갈때의 가중치
- ho_w: hidden layer에서 output layer로 갈때의 가중치
![](images/405.png)
4. 학습 네트워크 구성
![](images/40032.jpg)
5. 순전파, 역전파
- 오차가 심한경우 출력을 중지하고 역순으로 이동하면서 가중치를 update후
다시 정상진행
- 뇌를 구성하는 신경세포 뉴런(Neuron)의 동작원리에 기초한 기술
- 인간의 뇌는 1000억개의 뉴런으로 구성됨.
인공 지능 > 머신 러닝(SKlearn) > 신경망(퍼셉트론) > 딥러닝(다층 퍼셉트론, Tensorflow, PyTorch)
1. 신경 세포
- 각종 동물의 신경세포와 시냅스 수
![](/images/30.jpg)
- 생물의 신경 세포의 동작은 축색말단에서 가지돌기로 시냅스가 전송되고
시냅스의 값은 0이상의 아날로그 값으로 다양하다.
- 축색(축색말단)은 가지돌기(수상돌기)에게 시냅스를 전달한다.
이 시냅스는 인공신경망에서 실수값으로 표현이 가능하며 가중치 변경을 통한 출력 결과를 산출한다.
- 가지 돌기: 입력값
- 축색 말단: 출력 값
![](images/4007.jpg)
- 신경 세포에서의 정보 전달 구조도
![](/images/4025.jpg)
1. 신경 세포의 모델화(SW로 구현)
![](/images/4031.jpg)
3. 출력과 활성화 함수의 관계
- y: 출력
- f(u): 활성화 함수
- x: 변수, 데이터
- w: 기울기, 가중치
- b: y 절편, 편향
![](images/4011.jpg)
![](images/4002.jpg)
4. 퍼셉트론 step 함수, 신경세포의 동작을 0과 1의 디지털 수식으로 표현
- 인공 지능 > 머신 러닝 > 퍼셉트론 > 다층 퍼셉트론 > 딥러닝
- 축색말단은 다음 신경 세포의 가지돌기로 시냅스 전송시 시냅스의 값은
일정한것으로 표현했으며 디지털 값으로 0과 1로 나타냈다.
- 가지돌기로 들어온 데이터의 합이 임계값을 넘어가면 1을 출력하고
그렇지 않으면 0을 출력한다.
. 가지돌기(수상돌기): 입력값, 정보의 종류, x1 ~ x5
. 가지돌기(수상돌기)로 들어오는 정보의 종류의 가중치: w1 ~ w5
. ∑(통합): 입력값과 가중치의 곱 + y 절편(편향)
. 스텝함수: 통합데이터를 특정 함수에 할당하여 지정된 값을 넘어가면 1, 그렇지않으면 0 출력
![](images/4005.png)
- 스텝함수
![](images/4006.png)
- 신경망을 이루는 가장 중요한 기본 단위는 퍼셉트론(perceptron)
- 퍼셉트론은 입력 값과 활성화 함수를 사용해 출력 값을 다음으로 넘기는 가장 작은 신경망 단위
- 퍼셉트론에서는 y = wx + b(w는 가중치, x는 입력값, b는 편향이란 뜻의 bias)로 쓰임.
- 가중합(weighted sum): 입력 값(x)과 가중치(w)의 곱을 모두 더한 다음 거기에 바이어스(b)를 더한 값
- 가중합의 결과를 놓고 1 또는 0을 출력해서 다음으로 보냄
- 여기서 0과 1을 판단하는 함수가 있는데, 이를 활성화 함수(activation function) 라고 함.
항등 함수(선형회귀), Sigmoid(2항 분류, 참거짓분류), Softmax(다중 분류, 사물 인식)등
- AND, OR, XOR 진리표대로 좌표 평면에 표현한 뒤 선을 그어 색이 같은 점끼리 나누기(XOR는 불가능)
이는 인공지능 분야의 선구자였던 MIT의 마빈 민스키(Marvin Minsky) 교수가 1969년에 발표한
<퍼셉트론즈(Perceptrons)>라는 논문에 나오는 내용으로 10여 년이 지난 후에야
이 문제가 해결되는데, 이를 해결한 개념이 바로 다층 퍼셉트론(multilayer perceptron)임.
![](images/4006.jpg)
[02] 다층 퍼셉트론(Multilayer Perceptron)
- 인공 신경망을 나타내는 핵심 이론
1. 다층 퍼셉트론 개론
- 선형회귀에서 해결하기 어려운 XOR 문제의 극복은 평면을 휘어주는것! 즉, 좌표 평면 자체에 변화를 주는 것이다.
- XOR 문제를 해결하기 위해서 두 개의 퍼셉트론을 한 번에 계산할 수 있어야 함
이를 가능하게 하려면 숨어있는 층, 즉 은닉층(hidden layer)을 만들면 됨
![](images/4002.jpg)
- 다층 퍼셉트론이 입력층과 출력층 사이에 숨어있는 은닉층을 만든 형태
- 가운데 숨어있는 은닉층으로 퍼셉트론이 각각 자신의 가중치(w)와 바이어스(b, 편향)
값을 보내고, 이 은닉층에서 모인 값이 한 번 더 시그모이드 함수를 이용해 최종 값으로 결과를 보냄
- 은닉층에 모이는 중간 정거장을 노드(node)라고 하며, 여기서는 n1과 n2로 표현
- n1과 n2의 값은 각각 단일 퍼셉트론의 값과 같음
![](images/40004.jpg)
- 아래의 두 식의 결괏값이 출력층으로 보내짐
![](images/40005.jpg)
- 출력층에서는 역시 시그모이드 함수를 통해 0 ~ 1 사이의 y 값이 정해짐
![](images/40006.jpg)
- 가중치(x)와 바이어스(b)를 2차원 배열로 늘어놓으면 다음과 같이 표시할 수 있음
- 은닉층을 포함해 가중치 6개와 바이어스 3개가 필요함
- 가중치(w)와 바이어스(b)를 2차원 행렬로 나타낸 경우
![](images/40007.jpg)
- 논리표 XOR의 결과를 출력하는 가중치와 바이어스
![](images/40008.jpg)
![](images/40009.jpg)
-퍼셉트론은 그림과 같이 여러 개의 신호(x1, x2, x3,...)를 입력받아서 하나로 출력(output)한다.
여기서, 입력과 출력은 2진수 값(0,1)을 사용한다.
각각의 입력 신호에는 가중치가 부여되는 데, 한 퍼셉트론에 들어온 모든 입력 x 가중치의 합(transfer function)이
임계 값(threshold: 입력값이 활성화되기 위한 최소값)보다 적으면 0이 출력되고,
크면 1이 출력되는 구조이다.
이렇게 임계 값보다 작은지 큰지를 판단해서 출력하는 함수를 활성함수(activation function)이라 한다.
- x1, x2의 입력값과 바이어스에 따라 진리표 XOR 값이 출력됨.
- 여기서 σ(시그모이드)는 활성화 함수로 실습에서는 MLP 함수를 정의하여 사용함.
- x1 x2 n1 n2 y out
0 0 MLP(0*-2 + 0*-2 + 3): 3 ▷ 1 MLP(0*2 + 0*2 - 1): -1 ▷ 0 MLP(1*1 + 0*1 - 1): 0 ▷ 0
0 0 MLP(0*-2 + 1*-2 + 3): 1 ▷ 1 MLP(0*2 + 1*2 - 1): 1 ▷ 1 MLP(1*1 + 1*1 - 1): 1 ▷ 1
0 0 MLP(1*-2 + 0*-2 + 3): 1 ▷ 1 MLP(1*2 + 0*2 - 1): 1 ▷ 1 MLP(1*1 + 1*1 - 1): 1 ▷ 1
0 0 MLP(1*-2 + 1*-2 + 3): -1 ▷ 0 MLP(1*2 + 1*2 - 1): 3 ▷ 1 MLP(0*1 + 1*1 - 1): 0 ▷ 0
![](images/40010.jpg)
1. 다층 퍼셉트론으로 논리값 출력 실습
▷ /ws_python/notebook/machine/basic/MLP_test.py
-------------------------------------------------------------------------------------
첨부 파일 참고
-------------------------------------------------------------------------------------
[03] 뉴런의 네트워크화
1. 인공 뉴런들을 연결해 구성한 인공신경망
1) 단순 신경망
- 입력층, 은닉층, 출력층으로 구성, Sigmoid(x(입력) * (가W중치) + b(편향)) → y(출력)
![](images/4009.png)
2) 심층 신경망(딥러닝)
- 은닉층이 여러개가 연속적으로 연결된 신경망
- 제프리 힌튼 교수는 심층 신경망을 효율적으로 학습 시킬 수 있는 신경망 학습 알고리즘을 개발함.
Sigmoid(x(입력) * (가W중치) + b(편향))
→ Sigmoid(x(입력: 이전의 y 출력) * (가W중치) + b(편향))
→ Sigmoid(x(입력: 이전의 y 출력) * (가W중치) + b(편향)) → y 최종 출력
![](images/40010.jpg)
- 심층 신경망의 복잡한 형태
![](images/4011.png)
2. 심층 신경망(딥러닝)의 해석
- 2개의 데이터
- 1개의 Input Layer
- 2개의 Hidden Layer
. 첫번재 은닉층은 4개의 node로 구성, 행렬 곱하기 연산 실행, 가중치 8개, 편향 4개
. 두번재 은닉층은 2개의 node로 구성, 행렬 곱하기 연산 실행, 가중치 8개, 편향 2개
- 1개의 출력 Layer, 가중치 2개, 편향 1개, 활성화 함수 사용
![](images/40007.jpg)
3. 가중치의 계산(파라미터)
- 난수를 이용하여 무작위추출 한 후 결과의 비교를 통해 가중치를 변경
- 파라미터는 딥러닝 엔진에서 자동으로 처리함.
1) 첫번째 input node: 2.00
2) 첫번째 hidden node: (2.00 * 0.1) + (3.00 * 0.5) + (4.00 * 0.9) + (-2.0)
입력값 * 가중치 + y 절편
= 0.2 + 1.5 + 3.6 - 2.0
= 3.3
시그모이드 함수 적용(e=2.71828): 1.0 / (1.0 + 2.71828^-(3.3)) = 0.96
= 1.0 / (1.0 + 0.036883)
= 1.0 / 1.036883
= 0.964429
- ih_w: input layer에서 hidden layer로 갈때의 가중치
- ho_w: hidden layer에서 output layer로 갈때의 가중치
![](images/405.png)
4. 학습 네트워크 구성
![](images/40032.jpg)
5. 순전파, 역전파
- 오차가 심한경우 출력을 중지하고 역순으로 이동하면서 가중치를 update후
다시 정상진행
등록정보 성명: Admin | 조회수: 151 | 등록일: 2019-10-19 01:58 |
Download:
<a href="/download?downDir=/pds/storage&filename=MLP_test_3.ipynb">
MLP_test_3.ipynb
</a>
</td>
</tr>
</td>
</tr>
Home by tonyleekorea jupyterpynative
Day 1 9 lectures
Day 2 6 lectures
-
[Day 2](day2/readme.md)
- 1 function handling
- 2 module package
- 3 ood class
- 4 library Pandas
- 5 lib Matplotlib
- 6 Numpy
- 7 day1 sequential data
- [Tutorial mode](https://github.com/adriantanasa/github-wiki-sidebar/wiki/Usage%3A-Tutorial-mode)
- 2 function global local
- [Command line modifiers](https://github.com/adriantanasa/github-wiki-sidebar/wiki/Usage%3A-Command-line-modifiers)