Tensorflow 개발자 자격증 준비하기(1)

Tensorflow 개발자 자격증 준비하기(1)

Basic Question

구글에서 텐서플로 자격증 시험을 신규 출시(?)하였습니다.

자세한 내용은 이 링크에서 확인할 수 있습니다. 응시료가 무려 100달러. 요즘 달러도 비싼데 아주 비싼 시험입니다. 떨어지면 재응시도 제한되므로 왠만하면 한번에 붙는 것을 목표로 합시다.

첫번째 문제를 풀어보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Given this data, train a neural network to match the xs to the ys
# So that a predictor for a new value of X will give a float value
# very close to the desired answer
import numpy as np

def solution():
xs = np.array([-9.0, 0.0, 4.0, 2.0, 1.0, 8.0], dtype=float)
ys = np.array([7.0, 1.0, 2.0, 6.0, 5.0, 3.0], dtype=float)

# YOUR CODE HERE

return model

if __name__ == '__main__':
model = solution()
model.save("mymodel")

1. 문제분석

1-1. 조건

  • xs를 ys에 매칭시키는 신경망모델을 제작하라.
  • 모델의 input shape은 [1]
  • 생성된 모델, 즉 predictor는 특정 실수값을 입력으로 받아 desired answer인 하나의 실수값을 반환한다.

1-2. 관련이론

2. 풀이

  • 간단한 선형회귀 문제라고 생각했다. 위의 링크에 있는 코드를 거의 그대로 사용할 수 있을 듯 하다.
1
2
3
4
# 사용할 라이브러리
from tensorflow.keras.models import Sequential # 케라스의 Sequential()을 임포트
from tensorflow.keras.layers import Dense # 케라스의 Dense()를 임포트
from tensorflow.keras import optimizers # 케라스의 옵티마이저를 임포트

2-1. 모델 설계

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 케라스에서는 다양한 층으로 이루어진 인공신경망의 구성을 위해 Sequential()을 사용한다.
# Sequential()을 model로 선언한 뒤에 model.add()코드를 통해 층을 단계적으로 추가한다.
model = Sequential()

# 1개의 실수 xs[i]에 대해 1개의 실수 ys[i]를 예측하는 모델이므로 출력차원과 입력차원 모두 1이다.
model.add(Dense(1, input_dim=1, activation='linear'))

# optimizer는 경사하강법을 사용한다. learning rate은 0.01
sgd = optimizers.SGD(lr=0.01)

# 손실함수는 평균제곱오차(mse)를 사용한다.
model.compile(optimizer=sgd, loss='mse', metrics=['mse'])

# 학습 진행한다. epoch는 300
model.fit(xs, ys, batch_size=1, epochs=300, shuffle=False)

2-2. 모델 결과

  • 그냥 300번 학습하게 뒀더니 엄청 과적합이 되는 느낌. 학습 데이터도 얼마 없고 하다보니 loss가 거의 0.0000000001 수준으로 줄어들었다.

  • 조기종료 조건을 추가해줘봤다

    1
    2
    3
    from tensorflow.keras.callbacks import EarlyStopping

    early_stopping = EarlyStopping(monitor='loss')
    1
    2
    # 모델 학습 함수에 early_stopping에 대한 callback인자를 추가해준다.
    model.fit(xs, ys, batch_size=1, epochs=300, shuffle=False, callbacks=[early_stopping])
  • 대충 epoch 213에서 멈추는듯.

2-3. 모델 평가

1
print(model.predict([10.0]))

댓글