본문 바로가기

카테고리 없음

Deep Learning and TensorFlow

Tensor

텐서는 다차원 배열로, 일관된 데이터 타입을 가진 요소들로 구성되어 있다.

 

TensorFlow

텐서플로우는 데이터(tensor)와 흐름(flow)을 합친 프레임워크이다.

텐서플로우는 연산을 그래프 형태로 구성한다. 그래프의 노드는 연산, 변수, 상수 등을 나타낸다.

 

Automatic Differentiation

#텐서플로우를 이용한 자동미분 최적화
#a = (3*2), b = (1*2) tensor를 생성
w = tf.Variable(tf.ones(3,2)), dtype=tf.float32)
b = tf.Variable(tf.zeros((1,2)), dtype=tf.float32)

#x는 입력 데이터, y는 목표(실제) 데이터
x = tf.constant([[1., 2., 3.]])
y = tf.constant([[4., 8. ]])

#모델 정의 및 손실 함수
#연산을 기록하는ㄷ 사용
with tf.GradientTape(persistent = True) as tape:
    y_hat = x@w+b
    loss = tf.reduce_mean((y_hat - y)**2)
    
    #최적화기 설명 및 매개변수 업데이트
    opt = tf.keras.optimizers.SGD(learning_rate = 0.1)
    opt.minimize(loss, [w, b])

 

Keras

TensorFlow의 공식 고수준 API로, 딥러닝 모델을 빠르고 쉽게 설계할 수 있게 도와준다.

tensorflow.keras 모듈을 통해 접근 가능하며, 일관된고 간단한 API를 제공하여 사용자의 추가 작업을 최소화한다.

 

Building a Model

keras.Sequential() 함수를 사용해 모델을 순차적으로 정의할 수 있다. 각 층이 정확히 하나의 입력 텐서와 하나의 출력 텐서를 갖는 구조로 모델을 쌓는 방법이다.

model = keras.Sequential()

model.add(keras.Input(shape=(7, )))
model.add(layers.Dense(5, activation="sigmoid"))
model.add(layers.Dense(4, activation="sigmoid))

#모델 요약 출력
model.summary()

*Dense층: 신경망에서 가장 기본적이고 일반적인 형태의 층으로, 완전 연결 층(fully connected layer) 또는 밀집 층(dense layer)이라고도 불림

 

#create input1, input2
inputs1 = keras.Input(shape=(2,))
inputs2 = keras.Input(shape=(5,))

#add layers
h1 = layers.Dense(2, activation="sigmoid")(inputs1)
h2 = layers.Dense(3, activation="sigmoid")(inputs2)

#concatenate layers
c = layers.concatenate([h1, h2])

#create output1, output2
outputs1 = layers.Dense(1, activation="sigmoid")(c)
outputs2 = layers.Dense(10, activation="sigmoid")(c)

#create model
model = keras.Model(inputs=[inputs1, inputs2], outputs=[outputs1, outputs2])

 

 

Layers

  • keras.Input: keras 텐서를 인스턴스화
  • Dense: 정규 완전 연결 신경망 레이어
  • Conv2D: 2D convolution layer(그림을 작은 부분으로 나눠 자세히 살펴봄)
  • 완전 연결 RNN 레이어
  • LSTM: 장단기 메모리 레이어
  • Flatten: 입력을 평탄화 함.
  • Reshape: 입력을 재구성함.(데이터를 다른 모양으로 다시 배열함.)
  • Embedding: 양의 정수를 밀집 벡터로 변환함.(숫자를 특별한 의미가 있는 단어로 바꿔줌)
  • MaxPool2D: 2D에 대한 최대 풀링 작업을 수행함.(데이터 중에서 중요한 부분만 골라냄)
  • Dropout: 입력에 드롭아웃을 적용함.(몇몇 뉴런을 비활성화함)
  • BatchNormalization: 입력을 정규화함.(데이터를 고르게 만들어줌)

 

Optimizers

SGD는 경사 하강법을 사용하는 최적화 알고리즘이다.(경사하강법 + 모멘텀)

경사 하강법은 함수의 최솟값을 찾기 위해 반복적으로 기울기를 따라 이동하는 방법이다.

SGD는 여기에 모멘텀을 추가하여 더 빠르고 안정적으로 수렴하도록 한다.

  • SGD
    • learning rate: 매개변수를 얼마나 크게 업데이트 할 지 결정함. (기본값 0.001)
    • momentum: 이전 단계의 업데이트 방향을 고려해 현재 단계에서의 업데이트를 부드럽게 함.(기본값 0)
    • weight_decay: 가중치에 페널티를 부여해 모델의 과적합을 방지함.

Adam은 경사 하강법을 기반으로 하되, 1차 및 2차 모멘트를 사용하여 학습률을 적응적으로 조정하는

최적화 알고리즘이다. Adam은 SGD보다 더 복잡하지만, 더 빠르고 안정적으로 수렴하는 경향이 있다.

  • Adam
    • beta_1: 1차 모멘트 추정치를 위한 지수 감쇠율(기본값 0.9), 과거 평균 기울기를 얼마나 반영할지?
    • beta_2: 2차 모멘트 추정치를 위한 지수 감쇠율(기본값 0.999), 기울기 분산 얼마나 반영할지?
    • epsilon: 기울기의 분산이 매우 작아질 때 0으로 나는 오류를 방지하기 위한 작은 상수.

 

 

Losses

손실함수.

  • MSE(Mean Squared Error)
    • 예측값과 실제 값 사이의 차이를 제곱한 후 평균을 계산하는 손실함수. 주로 regression 문제에서 활용
  • BCE(Binary Cross Entropy)
    • 이진 분류 문제에서 사용하는 손실함수로, 예측한 확률과 실제 레이블 사이의 차이를 계산함.
  • Categorical Crossentropy
    • 다중 클래스 분류 문제에서 사용하는 손실 함수로, one-hot 인코딩된 레이블과 예측 값 사이의 차이를 계산한다.
  • SparseCategoricalCorssentropy
    • 다중 클래스 분류 문제에서 사용하는 손실 함수로, 정수로 인코딩된 레이블과 예측값 사이의 차이를 계산한다. one-hot 인코딩을 사용하지 않는다는 점이 범주형 교차 엔트로피와 다르다.

MSE
BCE
CategoricalCrossEntropy
SparseCategoricalCrossentropy