반응형

드롭아웃

dropout

신경망에서 필요한 매개변수 수를 줄이는 것입니다. 

이는 노드를 삭제하여 입력과 출력 사이의 연결을 제거하는 것입니다 

어떤 뉴런을 제거하고 어떤 것을 유지할지는 무작위로 결정됩니다. 

뉴런이 제거되거나 그렇지 않을 확률은 코드로 처리하지 않고 텐서플로에 위임할 것입니다.

 

20211010

드롭아웃은 앞서 보았던 합성곱 신경망을 포함하여 일반적인 feedforward 신경망에서 모델이 학습 데이터에 과다하게 치중되어 만들어지는 것을 막아주는 좋은 방법입니다. 

 

 

출처 : 텐서플로 첫걸음

반응형

'개념 정리' 카테고리의 다른 글

Adam_20211005  (0) 2021.10.13
오버피팅_20211004  (0) 2021.10.13
ReLU_20211001  (0) 2021.10.13
풀링 계층_20210929  (0) 2021.10.12
특징 맵_20210927  (0) 2021.10.12
반응형

합성공 신경망 CNN과 순환 신경망 RNN

 

01. 신경망의 다층화

다층 퍼셉트론

 

활성화 함수와 기울기 소실 문제

신경망의 활성화 함수는 출력 계층의 값이 커지면 최종 출력이 1로 수렴하는 단위 계단 함수와 로지스틱 함수를 사용했습니다.

 

쌍곡탄젠트 함수와 소프트 플러스 

선형 유닛Rectified Linear Unit ReLU

 

시그모이드 함수와 쌍곡 탄젠트 함수는 미분 계산을 기반으로 두는 함수지만 ReLU는 0 또는 입력값을 그대로 내보내므로 계산이 편리합니다.

심층 신경망 Deep Neural Network,DNN은 시그모이드 함수에 전파와 역전파를 여러 번 적용하다 보면 가중치가 발산하거나 곡선의 기울기가 0이 되어 버리는 기울기 소실 문제가vanishing gradient problem 발생하므로 ReLU를 사용합니다.

 

확률 기반 경사 하강법 sgd stochastic gradient Descent : 신경망 학습에서는 데이터 일부를 뽑은 미니 배치를 이용해 가중치를 반복해서 업데이트 하는 것

 

훈련 오차와 테스트 오차

학습 과정에서 얼마나 지도 학습 데이터에 오차가 발생하는지 나타내는 값을 훈련 오차라고 합니다.

학습기 구축 과정의 목표는 훈련 오차를 작게 만드는 것입니다.

매개변수 업데이트 횟수를 가로축으로 , 오차를 세로축으로 설정했을 때 만들어지는 곡선을 학습 곡선이라고 합니다.

 

미지의 데이터를 준비하는 것은 어려우므로 테스트 데이터를 이용해 오차를 확인합니다. 이때 오차를 테스트 오차라고 합니다.

 

정규화와 드롭아웃

과적합을 억제하는 방법으로 가중치 계수에 제한을 가하는 정규화가 있습니다.

신경먕에서 과적합을 억제하는 또 한가지 방법으로는 드롭아웃이 있습니다.

드롭아웃은 확률 기반으로 다층 네트워크 유닛을 선별한 상태에서 학습을 실행하는 것입니다.

 

그밖의 신경망 학습

데이터 정규화 

정규화 normalization

표준화 standardization

"평균을 0으로 한다." "분산(표준 편차)을 1로 한다."

"상관관계를 0으로 한다 " 같은 작업을 백색화 whitening라고 합니다.

정규화를 전처리 

 

데이터 확장

 

여러가지 네트워크 이용

구조가 다른 여러 개의 신경망을 구축하고 각각 학습한 다음 모델의 평균을 구하면 학습의 일반화 성능을 향상시킬 수 있습니다.

 

학습률 ε의 결정 방법

학습률을 자동으로 결정하는 알고리즘으로 확률적 경사 하강법의 하나인 에이다그래드 AdaGrad를 많이 사용합니다.

 

02. 제한 볼츠만 머신

볼츠만 머신과 제한 볼츠만 머신

볼츠만 머신은 노드들이 무향 그래프로 연결된 네트워크입니다.

볼츠만 머신은 퍼셉트론처럼 입력과 출력을 하는 유향 그래프가 아니므로 계산하기 어렵습니다.

제한한 것이 제한 볼츠만 머신Restricted Boltzmann Machine,RBM

제한 볼츠만 머신은 볼츠만 머신의 두 계층 중 같은 계층의 유닛은 서로 연결하지 않도록 구성되어 있습니다.

 

선행 학습 pre-training 

다층 네트워크를 입력받은 순서대로 제한 볼츠만 머신 같은 두 계층의 네트워크로 분리(오토인코더로 설정)합니다.

다층 네트워크는 기울기 소실 문제가 발생해 학습이 제대로 되지 않을 때가 있습니다. 계층을 깊게 할 수록 그 영향이 더 두드러집니다. 가중치 매개변수의 초깃값을 무작위로 결정하는 것도 원인 중 하나입니다. 이를 해결하는 방법으로 선행 학습이 있습니다.

 

03. 심층 신경망

지도학습과 자율 학습

심층 신경망: 유닛 수와 계층 수가 3가지 이상이 되도록 다층 구조를 취하는 신경망은 심층 신경망이라고 합니다. 

심층 신경망을 사용하는 학습을 딥러닝이라고 합니다. 

 

심층 신뢰 신경망 :

이 기술은 가시 계층에서 순서대로 제한 볼츠만 머신의 구조를 꺼내 학습합니다. 

심층 신뢰 신경망은 제한 볼츠만 머신의 축적만으로는 단순한 자율학습입니다.

 

오토인코더

오토인코더는 전파형 네트워크의 하나입니다.

특징:

1. 입력 데이터 1을 통해 얻은 출력 데이터 1을 다시 입력 데이터 2로 설정합니다.

2. 입력 데이터 2에서 얻은 출력 데이터 2를 입력 데이터 1과 비교합니다.

3. 출력 데이터 2와 입력 데이터 1이 서로 더 가까운 상태가 되는 특징을 얻습니다.

4. 얻은 특정을 통해 더 나은 데이터를 얻습니다.

오토인코더는 지도 데이터가 없는 자율학습입니다.

 

스파스 코딩

수학에서는 백터나 행렬의 많은 원소가 0일 때 이를 스파스하다고 합니다.

 

04. 합성공 신경망

합성곱 처리 

합성곱 신경망의 C는 합성공 Convolutional을 의미합니다.

2개의 함수 중 하나를 평행 이동시키면서 합성공을 취한 적분 값을 계산합니다. 

 

합성공 신경망의 구성

합성공 계층과 풀링 계층을 거쳐 입력 이미지의 특징을 추출해서 출력하는 이미지인 특징 맵을 얻습니다.

 

합성공 계층과 풀링 계층 사이에 정규화 계층을 포함하기도 합니다.

정규화 계층을 합성곱 계층에서 처리된 이미지에 관해 전체 화소 값의 평균을 0으로 하는 감산 정규화 또는 분산을 정력하는 나누기 정규화 등을 수행합니다.

 

이처럼 합성곱 계층과 풀링 계층 사이를 반복해서 거친 후 마지막에는 완전 연결 계층 fully connected layer을 구성해서 출력합니다.

 

 

출력 내용으로 분류 결과 또는 식별 결과(라벨링한 사물의 이름)을 얻고 싶을 때는 소프트맥스 softmax함수를 이용합니다. 각 라벨을 모두 합한 값이 1이게 변환(정규화)해서 확률 형태로 나타낼 수 있습니다.

 

풀링 계층에서는 단순히 미이지를 축소합니다.
축소 처리는 필수는 아니지만 후속 네트워크에서의 처리 부담을 가볍게 하는 효과와 축소 처리에 의한 특징량의 압축 효과가 있습니다.

 

05. 순환 신경망

순환 신경망 : Recurrent Neral Network , RNN은 몇 단계 전으로 거슬러 올라가 데이터를 반영할 수 있는 신경망입니다.

시계열 데이터 등의 맥락을 고려해 학습할 수 있으므로 음성 같은 파형 데이터나 자연어 등의 학습에 이용합니다.

 

순환 신경망의 학습은 확률적 경사 하강법을 이용하며 실시간 순환 학습 Real-Time Recurrent Learning, RTRL이나 시간 기반 오차역전파BackPropagation Through Time, BPTT로 가중치를 업데이트합니다.

 

심층 순환 신경망Deep RNN과 양방향 순환 신경망 Bidirectional RNN도 있습니다.

 

Long Short- Term Memory LSTM

순환 신경망은 거슬러 올라가는 단계 수가 많아지면 기울기 소실 문제 때문에 제대로 학습할 수 없습니다. 이문제를 개선한 것이 Long Short -Term Memory입니다.

LSTM은 신경망의 중간 계층에서의 각 유닛을 LSTM블록이라는 메모리 유닛으로 치환한 구조입니다. 

LSTM블록에는 입력 INPUT게이트, 망각 forget게이트 , 출력 output 게이트 라는 세가지 게이트가 있으며 메모리 셀에 저장된 1단계 이전의 상태를 망각 게이트에서 참조(요소곱)합니다. 그리고 입력 게이트와 망각 게이트를 잘 여닫으면서 출력을 조정합니다.

 

06. 텐서플로를 이용한 오토인코더 예제

오토인코더 모델 구성

오토인고더는 다음과 같은 조건으로 구성합니다.

1. 입력값으로 이미지만 포함합니다.(라벨 없음).

2. 은닉 계층의 노드 수가 입력 계층의 노드 수보다 적도록 구성합니다.

3. 출력 계층의 노드 수는 입력 계층의 노드 수와 같습니다.

4. 은닉 계층의 노드 수가 적으므로 주요 특징량(feature)위주로 추출합니다. 마치 주성분 분석과 비슷한 효과를 얻을 수 있습니다.

5. 출력 계층에서는 입력 계층의 값을 복원(reconstruction)할 수 있습니다.

 

필요한 모듈 불러오기

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('./data/mnist/',one_hot = True)

 

이 경우 다시 수행하기 

하이퍼파라미터 설정하기

#모델 관련 하이퍼파라미터 설정
num_input = 28 * 28
#'입력 계층 노드 수 == 출력 계층 노드 수'이므로 num_output은 따로 정의하지 않습니다.
num_hidden = 256

#학습 관련 하이퍼파라미터 설정
learning_rate = 0.01
training_epoch = 10
batch_size = 100

#평가 관련 하이퍼파라미터 설정
num_output_sample = 10

 모델 만들기

오토인코더에는 라벨이 없습니다.

x_true = tf.placeholder(tf.float32, [None, num_input])

손실 함수의 기준으로 삼기 위해 y_true를 x_true와 같게 설정합니다.

y_true = x_true

인코더: 입력 계층 -> 은닉 계층

디코더: 은닉 계층 -> 출력 계층

 

인코더

weight_encoder = tf.Variable(tf.truncated_normal([num_input, num_hidden]))
bias_encoder = tf.Variable(tf.truncated_normal([num_hidden]))

디코더 

weight_decoder = tf.Variable(tf.truncated_normal([num_hidden, num_input]))
bias_decoder = tf.Variable(tf.truncated_normal([num_input]))

인코더와 디코더를 설정합니다. 그리고 선형 연산과 비선형 연산을 적용합니다.

encoder = tf.nn.sigmoid(tf.add(tf.matmul(x_true, weight_encoder), bias_encoder))
decoder = tf.nn.sigmoid(tf.add(tf.matmul(encoder, weight_decoder), bias_decoder))

cost optimizer

cost = tf.reduce_mean(tf.square(y_true - decoder))
optimizer = tf.train.AdamOptimizer(learning_rate)
optimizer = optimizer.minimize(cost)

 

모델의 학습 시작하기

sess = tf.Session()
sess.run(tf.global_variables_initializer())
total_batch = mnist.train.num_examples/batch_size #550
total_batch

for epoch in range(training_epoch):
    total_cost = 0
    for i in range(total_batch):
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        _, cost_value = sess.run([optimizer, cost],{x_true:batch_xs})
        total_cost += cost_value
    print("Epoch : {0}, Cost : {1}.format(epoch+1, total_cost/total_batch))
    
print("최적화를 완료했습니다.")

for epoch in range(training_epoch):
    total_cost = 0
    for i in range(int(total_batch)):
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        _, cost_value = sess.run([optimizer, cost],{x_true:batch_xs})
        total_cost += cost_value
    print("Epoch : {0}, Cost : {1}".format(epoch+1, total_cost/total_batch))
    
print("최적화를 완료했습니다.")

평가하기

samples = sess.run(decoder, {x_true : mnist.test.images[:num_output_sample]})
fig, ax = plt.subplots(2, num_output_sample, figsize= (num_output_sample, 2))
for i in range(num_output_sample):
    ax[0][i].set_axis_off
    ax[1][i].set_axis_off
    ax[0][i].imshow(np.reshape(mnist.test.images[i], (28,28)))
    ax[1][i].imshow(np.reshape(samples[i], (28,28)))
plt.show()    

07. 텐서플로를 이용한 합성곱 신경망 예제

여기에서는 합성공 신경망을 구축하고 학습시켜 MNIST데이터를 얼마만큼 정확하게 분석하는지 확인하겠습니다.

 

필요한 모델 불러오기

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('./data/mnist/',one_hot = True)

합성곱 신경망 모델 만들기

x_true = tf.placeholder(tf.float32, [None, 28,28,1])
y_true = tf.placeholder(tf.float32, [None, 10])

은닉 계층 1을 정의합니다.

(3,3) 크기를 가지는 필터를 설정합니다.

Stride와 padding을 설정해 합성곱을 구합니다.(tf.nn.conv2d()이용)

비선형 ReLU함수(tf.nn.relu()이용)를 적용합니다.

최대 풀링(Max pooling , tf.nn.max_pool()이용)합니다.

0.8의 확률로 드롭아웃(dropout, tf.nn.droupout()이용)합니다.

 

weight_1 = tf.Variable(tf.truncated_normal([3,3,1,32], stddev = 0.01))
hidden_1 = tf.nn.conv2d(x_true, weight_1, strides= [1,1,1,1] , padding= 'SAME')
hidden_1 = tf.nn.relu(hidden_1)
hidden_1 = tf.nn.max_pool(hidden_1, ksize = [1,2,2,1] , strides = [1,2,2,1] , padding = 'SAME')
hidden_1 = tf.nn.dropout(hidden_1, keep_prob= 0.8)
weight_2 = tf.Variable(tf.truncated_normal([3,3,32,64], stddev = 0.01))
hidden_2 = tf.nn.conv2d(hidden_1, weight_2, strides= [1,1,1,1] , padding= 'SAME')
hidden_2 = tf.nn.relu(hidden_2)
hidden_2 = tf.nn.max_pool(hidden_2, ksize = [1,2,2,1] , strides = [1,2,2,1] , padding = 'SAME')
hidden_2 = tf.reshape(hidden_2, [-1, 7*7*64])
hidden_2 = tf.nn.dropout(hidden_2, keep_prob = 0.8)
weight_3 = tf.Variable(tf.truncated_normal([7*7*64 , 256], stddev = 0.01))
fc_1 = tf.matmul(hidden_2, weight_3)
fc_1 = tf.nn.relu(fc_1)
fc_1 = tf.nn.dropout(fc_1, 0.5)
weight_4 = tf.Variable(tf.truncated_normal([256 , 10], stddev = 0.01))
y_pred = tf.matmul(fc_1, weight_4)

 

cost = tf.nn.softmax_cross_entropy_with_logits(logits= y_pred, labels= y_true)
cost = tf.reduce_mean(cost)
optimizer = tf.train.AdamOptimizer(learning_rate= 0.01)
optimizer = optimizer.minimize(cost)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
batch_size = 100
num_batch = int(mnist.train.num_examples/batch_size) #550
for epoch in range(10):
    total_cost = 0
    for i in range(num_batch):
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        #,합성곱 신경망 모델을 위한 데이터 타입인 [28,28,1]의 형태로 reshaping
        batch_xs = batch_xs.reshape(-1, 28, 28, 1)
        _, cost_value = sess.run([optimizer, cost],{x_true:batch_xs, y_true:batch_ys})
        total_cost += cost_value
    print("Epoch : {0}, Cost : {1}".format(epoch+1, total_cost/num_batch))
    
print("최적화를 완료했습니다.")

 

평가하기

correct_prediction = tf.equal(tf.argmax(y_pred, 1) , tf.argmax(y_true, 1))
accuracy =  tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print("정확도 : {0}".format(sess.run(accuracy, {x_true:mnist.test.images.reshape(-1,28,28,1), y_true:mnist.test.labels})))

소스코드.py
0.00MB

 

출처 : 처음 배우는 인공지능

반응형

+ Recent posts