Pseudo Lab/3기 반 고흐 전시전

[1주차] TensorFlow Tutorial

공부중인학생 2021. 8. 18. 01:02

1주차에서는 GAN 공부를 하기 앞서 딥러닝 기초와 CNN 그리고 TensorFlow, Keras 사용법에 대한 발표가 진행됬습니다.

진행자분께서는 "모두를 위한 딥러닝", "밑바닥부터 시작하는 딥러닝" 내용을 활용하여 발표를 진행하셨습니다.

이 두 권의 책을 활용하셨습니다.

 

1. 퍼셉트론(Perceptron)

신경망을 구성하는 기본 단위로 입력신호에 가중치를 곱해 더한 값이 Threthord 값을 넘으면 1, 넘지 못하면 0을 다음 퍼셉트론으로 넘겨줍니다.

 

여기서는 활성화 함수가 존재하지만 기초적인 퍼셉트론에서는 활성화 함수가 존재하지 않습니다.

  • 여러 층의 퍼셉트론을 서로 연결시키고 복잡하게 조합하여 주어진 입력 값에 대한 판단을 하게 하는 것, 그것이 바로 신경망의 기본 구조입니다.
  • 신경망을 이루는 가장 중요한 기본 단위는 퍼셉트론(perceptron)입니다. 퍼셉트론은 입력 값과 활성화 함수를 사용해 출력 값을 다음으로 넘기는 가장 작은 신경망 단위입니다.
  • y = ax + b (a는 기울기, b는 y 절편) → y = wx + b (w는 가중치, b는 바이어스)
  • 내부함수(활성화 함수): 시그모이드함수, softmax 함수, 쌍곡탄제트 등등이 있습니다.

 

2. 시그모이드 함수(Sigmoid Function)

먼저 a는 그래프의 경사도를 결정합니다. 그림 5-3과 같이 a 값이 커지면 경사가 커지고 a 값이 작아지면 경사가 작아집니다.
b는 그래프의 좌우 이동을 의미합니다. 그림 5-4와 같이 b 값이 크고 작아짐에 따라 그래프가 이동합니다.

 

3. 경사 하강법

 

  1. a1에서 미분을 구한다.
  2. 구해진 기울기의 반대 방향(기울기가 +면 음의 방향, -면 양의 방향)으로 얼마간 이동시킨 a2에서 미분을 구한다(그림 4-3 참조).
  3. 위에서 구한 미분 값이 0이 아니면 위 과정을 반복한다.
  • 학습률: 값을 갱신할 때 기울기에 곱해주는 용도로 적절한 값으로 설정해야지 값이 발산하거나, 학습이 느려지지 않습니다.

 

4. 다층 퍼셉트론

 

여러 개의 퍼셉트론을 쌓아 만든 형태로 기존에 퍼셉트론이 풀지 못했던 XOR문제를 해결할 수 있습니다.

이전 퍼셉트론의 출력을 다음 퍼셉트론의 입력으로 받는 형태로 순전파가 진행이 됩니다.

 

5. 오차역전파

 

실질적으로 학습을 하는 구간입니다. 손실함수를 파라미터로 미분해서 나온 값을 이전 파라미터 값에 빼주는 형태로 진행이 됩니다. 기울기를 빼주므로써 파라미터 값은 손실함수가 적어지는 방향으로 이동하게 됩니다.

 

6. 기초 딥러닝 - 구조, 층별 옵션 설정

model = Sequential() 
model.add(Dense(30, input_dim=17, activation=‘relu’))
model.add(Dense(1, activation=‘sigmoid’))

model.compile(loss=‘mean_squared_error’, optimizer=‘adam’, metrics=[‘accuracy’]) 

model.fit(X, Y, epochs=30, batch_size=10)

 

이제 기본적인 코드를 짜는 방법에 대해서 설명하셨는데 케라스를 통해서 코드를 작성하셨습니다.

2층으로 구성된 모델로 모든 층이 fully connected layer로 구성되어있고 입력 데이터의 차원은 17입니다.

활성화 함수로는 relu, sigmoid, 손실 함수로는 평균 제곱 오차, 최적화 함수로는 adam, 학습 척도로는 accuracy를 사용하셨습니다.

 

7. 과대적합과 과소적합

과대적합: 모델이 학습 데이터에서는 좋은 성능을 보이지만, 새로운 데이터에 대해서는 좋은 성능을 보이지 못하는 결과.
모델이 문제를 일반화하지 못한 상태, 분산이 높다고 할 수 있습니다.

과소적합: 모델이 학습 데이터를 충분히 학습하지 않아서, 모든 측면에서 성능이 나쁨. 모델이 너무 단순한 경우에 발생. 편향이 높다고 할 수 있습니다.

 

8. CNN 코드

# 컨볼루션 신경망 설정
model = Sequential() 
model.add(Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), activation='relu’)) 
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=2)) 
model.add(Dropout(0.25)) 
model.add(Flatten()) 
model.add(Dense(128, activation='relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(10, activation='softmax’)) 
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 

# 모델 최적화 설정 
MODEL_DIR = './model/' 
if not os.path.exists(MODEL_DIR): 
    os.mkdir(MODEL_DIR) 
modelpath="./model/{epoch:02d}-{val_loss:.4f}.hdf5" 
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True) early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)

 # 모델의 실행 
history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=30, batch_size=200, verbose=0, callbacks=[early_stopping_callback,checkpointer])

Conv layer가 2개, pooling layer가 1개, fully connected layer가 2개인 모델로 과대적합을 방지하기 위해서 드랍아웃을 사용한 모델입니다.