반응형

소스코드.py
0.00MB

머신러닝을 이용한 패턴 인식의 대표적인 응용 사례는 이미지 인식과 음성 인식이 있습니다.

01. 패턴 인식 

 

패턴 인식

지도 학습은 특히 이미지와 소리 같은 데이터는 데이터 속의 일정한 패턴을 추출하고 조합해 학습하기 좋습니다. 이를 패턴 인식 프로그램이라고 하며 고전적인 머신러닝을 이용한 구축 방법과 2010년대 이후 트랜드인 딥러닝을 이용한 구축 방법이 있습니다.

 

딥러닝을 이용한 패턴 인식은 네트워크를 설계하는 것이 모델 검토입니다.

설계한 네트워크를 기반에 두고 자동으로 특징을 추출해서 얻은 특징량 정보와 함께 학습기로 사용합니다. 

따라서 딥러닝은 다음 문제를 해결해야 합니다.

1. 네트워크 설계의 시행착오를 줄여야 합니다.

2. 예상하지 않은 학습 결과가 나왔을 때 원인을 찾아야 합니다.

 

02. 특징 추출 방법

 

고전 해석학을 이용한 특징 추출 : 특징 추출의 전통적이고 기본적인 방법은 해석학을 이용한 접근입니다.

푸리에 변환 : 어떤 함수를 삼각함수와 비슷하게 나타낼 때를 생각해봅시다.

웨이블릿 벼환:

에이블릿은 0을 중심으로 증가와 감소를 반복한느 진폭을 수반한 파도와 같은 진동을 말합니다.

행렬 분핼르 이용한 특징 추출

 

03. 이미지 인식

컴퓨터 비전

디지털 이미지는 픽셀의 집합이며 픽셀 각각이 갖는 화소 값 데이터로 구성되어 있습니다.

얼굴및 사물 인식

검색 챙에 얼굴 이미지를 넣고 특징량을 구하면 얼굴 인식 학습기가 완성됩니다. 검색 창 안에 다시 하위 검색 창을 설정하면 더 작은 얼굴 영역의 특징량을 구할 수 도 있습니다. 이를 바이ㄹ올라-존스방법이라고 하며 openCV에서 사용합니다.

 

딥러닝 이용하기

특정 영역을 설정해 사물을 인식하는 합성곱 신경망에는 R-CNN이 있습니다.

R-CNN은 일반적인 합성곱 신경망 과는 달리 고전적인 사물 인식 방법으로 이용하는 영역 자르기CROPPING를 전처리한 것입니다.

 

R-CNN을 개선해 속도를 향상시킨 네트워크로는 Fast R-cnn, Faster R-CNN등이 있습니다.

 

특징 추출을 이용한 이미지 변환

super-resolution imaging : 영상 인식 외에 합성곱 신경망으로 이미지 인식 네트워크를 구현한 예는 축소된 이미지를 깔끔하게 확대할 수 있는 초해상도 이미지 인식이 있습니다.

 

2015년에 공개한 waifu2x 단순 확대

http://waifu2x.udp.jp/index.ko.html

 

waifu2x

waifu2x 컨볼루션 신경망(CNN) 시스템을 통한 딥 러닝으로 2차원 이미지의 해상도를 개선합니다. 그림뿐만 아니라 사진도 지원합니다. 실제 예제 보기 | GitHub에서 보기 This website uses Google Analytics to h

waifu2x.udp.jp

그래서 지금까지는 단순히 주변 픽셀과 평활화해서 안티 앨리어싱 anti aliasing했습니다만 그래도 어색한 느낌이 남아 있는 이미지 입니다. 

 

또 하나의 자율 학습 네트워크로 GAN generative Adversarial Network

Adversarial : 반대의 적대적인 의미라는 의미입니다. 

즉, 이미 완성된 학습기를 이용해 얻는 출력 결과 확률이 연속적이라는 점을 이용해 신경망을 통과하는 입력 이미지를 지정한 확률로 변환합니다.

GAN과 합성곱 신경망을 조합한 DCGAN Deep Convolutional GAN도 있습니다. 이를 이용한 이미지 생성 을 스타일 변환style transfer이라고 합니다.

 

04. 음성 인식

소리의 정보 표현

소리는 공기를 진동시켜서 전달합니다.

 

소리의 크기는 진폭, 높이는 단위 시간당 진동수로 결정됩니다.

소리 데이터를 읽고 , 쓰고 , 해석하려면 파형 데이터를 처리할 수 있는 프로그램이 필요합니다.

 

음성 인식 방법 

사람이 말한 소리에는 특정 주파수가 있습니다.

따라서 소리의 진폭을 푸리에 변환하면 주파수 특성을 알 수 있습니다.

공기의 진동 

음원인 성대는 소스가 되고 필터의 조합으로 소리가 들리므로 이를 소스 필터 모델이라고 합니다.

 

음성 인식 시스템 음절, 단어 , 단어열

음성 합성 은 말소리의 음성을 기계가 자동으로 만들어 내는 기술을 말합니다.

 

05. 텐서플로를 이용한 GAN구현하기

GAN는 오토인코더와 마찬가지로 대표적인 자율학습 모델의 하나입니다.

이번에는 위페범과 경찰이 연관된 위조화폐 제작과 감별을 gan으로 구현하겠습니다. 

다음 조건이 있습니다. 

 

위폐범은 위조화폐를 정교하게 만들고자 최선을 다합니다. 즉, 경찰이 위조화폐를 감별하지 못할 확률을 높이려고 노력합니다.

경찰은 위조화폐를 감별하는 데 최선을 다합니다. 즉 , 자신이 실수할 확률을 낮추려고 노력합니다.

위폐범(G)의 네트워크를 생성 네트워크(Generative Netowork)라고 합니다.

경찰(D)의 네트워크를 식별 네트워크 (Discriminator Networ)라고 합니다.

G는 D가 실수할 확률을 높이려고 노력(maximize)라고 , D는 자신의 실수 확률을 낮추려고 노력(minimize)하므로 이는 미니맥스 문제(minimax problem)입니다.

GAN에서는 어려운 확률분포를 다루지 않고 확률을 통해 생성한 샘플을 다룹니다.

G는 Z를 입력받으므로 G(Z) 라고 합니다. 이때 Z는 확률분포ㅎ와 맵핑하는 prior라는 개념입니다. 무작위 노이즈(Random noise)가 됩니다.

G(Z)의 결과는 위조화폐입니다.

D는 이미지 X를 입력받으므로 D(X)라고 합니다. D(X)의 결과물은 0~1 사이의 확률입니다.

양자의 균형을 맞추는 평행 상태에 이르면 G는 진짜 화폐와 100%같은 위조화폐를 만들며 D가 이를 감별할 확률은 0.5입니다.

 

필요한 모듈 불러오기

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

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

 

가중치 초기화

가중치의 초기화에 좋은 성능을 보이는 세이비어 초기화 xavier initialization함수로 만들어서 이용합니다.

def xavier_init(size):
    in_dim = size[0]
    xavier_stddev = 1. / tf.sqrt(in_dim/2)
    return tf.random_normal(shape= size, stddev = xavier_stddev)

 

식별 네트워크 노드수는 784->128->1 

#식별 네트워크
X = tf.placeholder(tf.float32, shape=[None, 784] , name = 'X')

W1_dis = tf.Variable(xavier_init([784, 128]), name = 'W1_dis')
b1_dis = tf.Variable(tf.zeros(shape=[128]), name = 'b1_dis')

W2_dis = tf.Variable(xavier_init([128, 1]), name = 'W2_dis')
b2_dis = tf.Variable(tf.zeros(shape=[1]), name = 'b2_dis')

theta_dis = [W1_dis, W2_dis, b1_dis, b2_dis]

 

생성 네트워크 노드수는 100->128->784

#생성 네트워크
Z = tf.placeholder(tf.float32, shape=[None, 100] , name = 'X')

W1_gen = tf.Variable(xavier_init([100, 128]), name = 'W1_gen')
b1_gen = tf.Variable(tf.zeros(shape=[128]), name = 'b1_gen')

W2_gen = tf.Variable(xavier_init([128, 784]), name = 'W2_gen')
b2_gen = tf.Variable(tf.zeros(shape=[784]), name = 'b2_gen')

theta_gen = [W1_gen, W2_gen, b1_gen, b2_gen]
def random_Z(z1, z2):
    return np.random.uniform(-1., 1., size=[z1, z2])

 

생성 네트워크 구축

def gen(z):
    h1_gen = tf.nn.relu(tf.matmul(z, W1_gen) + b1_gen) 
    log_prob_gen = tf.matmul(h1_gen, W2_gen) + b2_gen
    prob_gen = tf.nn.sigmoid(log_prob_gen)
    
    return prob_gen

 

식별 네트워크 구축

def dis(x):
    h1_dis = tf.nn.relu(tf.matmul(x, W1_dis) + b1_dis) 
    logit_dis = tf.matmul(h1_dis, W2_dis) + b2_dis
    prob_dis = tf.nn.sigmoid(logit_dis)
    
    return prob_dis, logit_dis
def plot(samples):
    fig = plt.figure(figsize= (4,4))
    grid = gridspec.GridSpec(4,4)
    grid.update(wspace= 0.1,  hspace = 0.1)
    
    for i , sample in enumerate(samples):
        ax = plt.subplot(grid[i])
        plt.axis('off')
        ax.set_xticklabels([])
        ax.set_yticklabels([])
        ax.set_aspect('equal')
        plt.imshow(sample.reshape(28,28) , cmap = 'gray')
        
    return fig

GAN학습하기

sample_gen = gen(Z)
real_dis, logit_real_dis = dis(X)
fake_dis, logit_fake_dis = dis(sample_gen)
loss_real_dis = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits= logit_real_dis, labels = tf.ones_like(logit_real_dis)))
loss_fake_dis = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit_fake_dis, labels=tf.zeros_like(logit_fake_dis) ))
loss_dis = loss_real_dis + loss_fake_dis
loss_gen = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = logit_fake_dis, labels= tf.ones_like(logit_fake_dis)))
solver_dis = tf.train.AdamOptimizer().minimize(loss_dis, var_list = theta_dis)
solver_gen = tf.train.AdamOptimizer().minimize(loss_gen, var_list = theta_gen)
batch_size = 128
dim_Z= 100
sess = tf.Session()
sess.run(tf.global_variables_initializer())
i = 0
for j in range(100000):
    if j % 2000 == 0:
        samples = sess.run(sample_gen, feed_dict={Z:random_Z(16, dim_Z)})
        fig = plot(samples)
        plt.show()
        i += 1
        
        plt.close(fig)
        
    X_batch, _ =  mnist.train.next_batch(batch_size)
    _, loss_curr_dis = sess.run([solver_dis, loss_dis], feed_dict = {X: X_batch, Z: random_Z(batch_size, dim_Z)})
    _, loss_curr_gen = sess.run([solver_gen, loss_gen], feed_dict = {Z: random_Z(batch_size, dim_Z)})
    
    if j % 2000==0:
        print('Iteration: {}'.format(j))
        print('Discriminator loss: {:.3}'.format(loss_curr_dis))
        print('Generator loss: {:.3}'.format(loss_curr_gen))
        print()

 

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

반응형

+ Recent posts