2 minute read

자연어 처리 개발 준비

1. 텐서플로

  • 텐서플로(TensorFlow) 는 구글에서 2015년에 오픈소스로 발표한 머신러닝 라이브러리이다.
      • 데이터 플로 그래프를 통한 풍부한 표현력
      • 아이디어 테스트에서 서비스 단계까지 이용가능
      • 계산 구조와 목표 함수만 정의하면 자동으로 미분 계산을 처리
      • 파이썬 /C++ 를 지원하며, SWIG를 통해 다양한 언어지원 가능
      • 유연성과 확장성
  • 텐서(Tenser) : N 차원 메트릭스
  • 플로(Flow) : 데이터 흐름 그래프를 사용해 수치 연산을 하는 과정
    • 노드(Node) : 수칙연산(operator), 변수(variable), constant(상수)
    • 엣지(edge): 노드 사이를 이용하는 다차원 데이터 배열(텐서,tensor)

2.1.1 tf.keras.layers

텐서플로를 사용한 뎁러닝 모델은 블록을 하나씩 쌓아서 전체 구조를 만들어가는 것

2) tf.keras.layers.Dense

  • Dense : 신경망 구조의 가장 기본적인 형태 의미

  • 아래의 수식을 만적하는 기본적인 신경망 형태의 층을 만드는 함수

    \[y = f(Wx+b)\]

라이브러리 불러오기 및 상수값 설정

import tensorflow as tf
INPUT_SIZE = (20, 1)
CONV_INPUT_SIZE = (1, 28, 28)
IS_TRAINING = True

Dense Layer

inputs = tf.keras.layers.Input(shape = INPUT_SIZE)
output = tf.keras.layers.Dense(units = 10, activation = tf.nn.sigmoid)(inputs) 

Dense Layer with 1 hidden layer

예시 ) 10개의 노드를 가지는 은닉층이 있고 최종 출려 값은 2개의 노드가 있는 신경망 구조

inputs = tf.keras.layers.Input(shape = INPUT_SIZE)
hidden = tf.keras.layers.Dense(units = 10, activation = tf.nn.sigmoid)(inputs)
output = tf.keras.layers.Dense(units = 2, activation = tf.nn.sigmoid)(hidden)

Dropout

3) tf.keras.layers.Dropout

신경망 모델을 만들 때 생기는 여러 문제점 중 대표적인 문제점 : 과적함(Overfitting)

Dropout을 활용해서 keras.layers 입력값에 드롭아웃을 적용할 수 있음

  • tf.keras.layers.dropout 확률 0.2로 지정 -> 노드의 20%를 0으로 만듦
    • tf.nn.dropout 확률 0.2 로 지정 -> 노드의 (100-20)%를 0으로 만듦
inputs = tf.keras.layers.Input(shape = INPUT_SIZE)
dropout = tf.keras.layers.Dropout(rate = 0.5)(inputs)

Dense Layer with 1 hidden layer and dropout

inputs = tf.keras.layers.Input(shape = INPUT_SIZE)
dropout = tf.keras.layers.Dropout(rate = 0.2)(inputs)
hidden = tf.keras.layers.Dense(units = 10, activation = tf.nn.sigmoid)(dropout)
output = tf.keras.layers.Dense(units = 2, activation = tf.nn.sigmoid)(hidden)

Convolutional layer

  •      
    Conv1D 한 방향(가로) 1-D Array(vector)
    Conv2D 두 방향(가로,세로) 2-D Array(matrix)
    Conv3D 세 방향(가로,세로, 높이) 3-D Array(tensor)
inputs = tf.keras.layers.Input(shape = INPUT_SIZE)
conv = tf.keras.layers.Conv1D(
         filters=10, #필터의 개수, 정수형으로 지정 (출력의 차원 수))
         kernel_size=3, # 필터의 크기, 합성이 적용되는 위도우의 길이
         padding='same',#VALID / SAME
         activation=tf.nn.relu)(inputs)

Convolutional layer with dropout

inputs = tf.keras.layers.Input(shape = INPUT_SIZE)
dropout = tf.keras.layers.Dropout(rate=0.2)(inputs)
conv = tf.keras.layers.Conv1D(
         filters=10,
         kernel_size=3,
         padding='same',
         activation=tf.nn.relu)(dropout)

Input -> Dropout -> Convolutional layer -> MaxPooling -> Dense layer with 1 hidden layer -> Output

tf.keras.layers.MaxPool1D

  • 합성곱과 같이쓰이는 기법
    • 보통 피처 맵(feature map)의 크기를 줄이거나 주요한 특징을 뽑아내기 위해 합성곱 이후 적용되는 기법 ( 맥스풀링 / 평균풀링)
  • flatten : 풀링을 통해 얻은 행렬을 벡터값으로 변경
inputs = tf.keras.layers.Input(shape = INPUT_SIZE)
dropout = tf.keras.layers.Dropout(rate = 0.2)(inputs)
conv = tf.keras.layers.Conv1D(
         filters=10,
         kernel_size=3,
         padding='same',
         activation=tf.nn.relu)(dropout)
max_pool = tf.keras.layers.MaxPool1D(pool_size = 3, padding = 'same')(conv)
flatten = tf.keras.layers.Flatten()(max_pool)
hidden = tf.keras.layers.Dense(units = 50, activation = tf.nn.relu)(flatten)
output = tf.keras.layers.Dense(units = 10, activation = tf.nn.softmax)(hidden)  

Updated: