tensorflow 2.x 선형 회귀를 기반 심층신경망 예제 코드를 작성하고 실습해보겠습니다.
은닉층이 존재하지 않으면 선형 회귀 분석과 같습니다.
코드는 아래와 같습니다.
# 단순한 선형 회귀 예제 (텐서플로우2)
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
# x(입력), y(결과) 데이터
x_train = np.array([1, 2, 3, 4, 5])
y_train = np.array([2, 4, 6, 8, 10])
# keras의 다차원 계층 모델인 Sequential를 레이어를 만든다.
model = tf.keras.models.Sequential()
# 입력이 1차원이고 출력이 1차원임을 뜻함 - Dense는 레이어의 종류
model.add(tf.keras.layers.Dense(5, input_dim=1, activation='linear'))
model.add(tf.keras.layers.Dense(3))
model.add(tf.keras.layers.Dense(1))
# 모델 구조 확인
model.summary()
# Optimizer - Stochastic gradient descent - 확률적 경사 하강법
sgd = tf.keras.optimizers.SGD(learning_rate=0.01)
# cost/loss funcion
# loss를 mean_squared_error 방식을 사용한다는 의미로 mse 라고 써도 인식한다.
model.compile(loss='mean_squared_error', optimizer=sgd)
#fit the line
# 텐서 플로우 1과 다르게 세션을 만들어서 돌릴 필요가 없다.
# 간단하게 만들어서 학습을 시작한다.
hist = model.fit(x_train, y_train, batch_size=1, epochs=1000, verbose=1)
# 훈련 과정 시각화 (손실)
plt.plot(hist.history['loss'])
plt.title('loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()
# 모델 시각화
line_x = np.arange(min(x_train), max(x_train), 0.01)
line_y = model.predict(line_x)
plt.plot(line_x, line_y, 'r-')
plt.plot(x_train, y_train, 'bo')
plt.title('Model')
plt.xlabel('input (%)')
plt.ylabel('predict (%)')
plt.legend(['predict', 'train'], loc='upper left')
plt.show()
# 손실 함수 계산
loss = model.evaluate(x_train, y_train, batch_size=1, verbose=2)
print('loss : ', loss)
# 모델 테스트
for i in range(1, 8):
print('input : ', i, ', output : ', model.predict(np.array([i])), sep='') # 입력 i에 대한 예측 값 출력
print('input : ', 99, ', output : ', model.predict(np.array([99])), sep='')
해당 시퀀스 모델의 모양은 다음과 같습니다.
코드를 분석해보면,
model.add(tf.keras.layers.Dense(5, input_dim=1, activation='linear'))
-> 입력층 뉴런의 개수는 1개이며, 첫 번째 은닉층 뉴런의 개수는 5개
model.add(tf.keras.layers.Dense(3))
-> 두 번째 은닉층 뉴런의 개수는 3개
model.add(tf.keras.layers.Dense(1))
-> 출력층 뉴런의 개수는 1개
model.summary()
-> 모델의 구조 확인
sgd = tf.keras.optimizers.SGD(learning_rate=0.01)
-> learning_rate=0.01로 설정한 확률적 경사 하강법 옵티마이저 가져오기
model.compile(loss='mean_squared_error', optimizer=sgd)
-> 손실 함수 정의와, 옵티마이저 설정
hist = model.fit(x_train, y_train, batch_size=1, epochs=1000, verbose=1)
-> 배치 사이즈 1로 1000번 학습
plt.plot(hist.history['loss'])
plt.title('loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()
-> 손실 함수 시각화
line_x = np.arange(min(x_train), max(x_train), 0.01)
line_y = model.predict(line_x)
plt.plot(line_x, line_y, 'r-')
plt.plot(x_train, y_train, 'bo')
plt.title('Model')
plt.xlabel('input (%)')
plt.ylabel('predict (%)')
plt.legend(['predict', 'train'], loc='upper left')
plt.show()
-> 모델 시각화
loss = model.evaluate(x_train, y_train, batch_size=1, verbose=2)
print('loss : ', loss)
-> 손실 함수 계산
for i in range(1, 8):
print('input : ', i, ', output : ', model.predict(np.array([i])), sep='') # 입력 i에 대한 예측 값 출력
print('input : ', 99, ', output : ', model.predict(np.array([99])), sep='')
-> 모델 테스트
정리해보면,
model = tf.keras.models.Sequential()
1. model.add() 를 통해 심층신경망을 구성하고 뉴런의 활성화 함수를 설정한다.
2. model.compile() 을 통해 손실 함수를 정의하고, 가중치를 업데이트 하기 위한 방법(경사 하강법 등)을 설정한다.
3. model.fit()을 통해 설정된 값으로 학습을 진행한다.
4. 필요하면 loss, accuracy 등을 확인한다.
5. model.predict()를 통해 새로운 입력값에 대한 출력값을 예측한다.
신경망 구성이나 함수 내부적인 동작, 수학식, 손실 함수나 최적화 방법 등 세부적인 내용보다는
tensorflow를 이용한 프로그램 코드에서 딥러닝의 플로우를 정리해봤습니다.
'AI > TensorFlow & PyTorch' 카테고리의 다른 글
[TensorFlow] 텐서플로우(TensorFlow 2.x) 와인 데이터 다항 분류 (0) | 2021.03.05 |
---|---|
[TensorFlow] 텐서플로우(TensorFlow 2.x) 와인 데이터 이항 분류 (0) | 2021.03.05 |
[TensorFlow] 텐서플로우(TensorFlow 2.x) 로지스틱 회귀 예제 (0) | 2021.03.05 |
[TensorFlow] 텐서플로우(TensorFlow 2.x) 보스턴 주택 가격 예측 (0) | 2021.03.02 |
[TensorFlow] 텐서플로우(TensorFlow 2.x) 개발 환경 구축 (Windows) (1) | 2021.02.22 |