-
텐서플로우(Tensorflow) 처음 모델 만들기AI/Tensorflow 2020. 12. 16. 15:10728x90
공부시작~
구글에서 아래링크의 강의를 알려줘서 들어보기로 했다.
Intro to TensorFlow for Deep Learning | Udacity Free Courses
일단 PyCharm을 깔고 python 3.8을 깔아준다. 3.9를 깔았다가 다시 지우고 깔았다. ㅠㅠ
colab에 있는 첫걸음을 찾아서 직접 코딩해 보았다.
l02c01_celsius_to_fahrenheit.ipynb - Colaboratory (google.com)
#우리가 해결할 문제는 섭씨에서 화씨로 변환하는 것입니다. 대략적인 공식은 다음과 같습니다. #f = c × 1.8 + 32 #물론이 계산을 직접 수행하는 기존 Python 함수를 만드는 것은 간단하지만 기계 학습이 아닙니다. #대신 TensorFlow에 샘플 섭씨 값 (0, 8, 15, 22, 38)과 해당 화씨 값 (32, 46, 59, 72, 100)을 제공합니다. # 그런 다음 학습 과정을 통해 위의 공식을 파악하는 모델을 학습합니다. #import dependencies import tensorflow as tf import numpy as np import logging import matplotlib.pyplot as plt logger = tf.get_logger() logger.setLevel(logging.ERROR) #학습 데이터 셋팅 celsius_q = np.array([-40, 10, 0, 8, 15, 22, 38]) fahrenheit_a = np.array([-40, 14, 32, 46, 59, 72, 100]) #INT i가 0에서 1씩 늘어나는 for문 c는 celsius_q의 값이다. enumerate(celsius_q) #print의 문자열에 {}가 들어갈경우 .format을 통해서 차례대로 값을 채워준다. 아래에서는 c값과 fahrenheit_a[i]값이다. for i,c in enumerate(celsius_q): print("{} degrees Celsius = {} degrees Fahrenheit".format(c, fahrenheit_a[i])) #모델 만들기 keras이용 #일단 싱글레이어를 하나 만든다 #units = 1 — 레이어의 뉴런 수를 지정합니다. # 뉴런의 수는 계층이 문제를 해결하는 방법을 배우기 위해 시도해야하는 내부 변수의 수를 정의합니다 (더 나중에). # 이것이 최종 레이어이기 때문에 모델 출력의 크기이기도합니다. # 화씨도를 나타내는 단일 부동 값입니다. # (다층 네트워크에서 계층의 크기와 모양은 다음 계층의 input_shape와 일치해야합니다.) #input_shape = [1] —이 레이어에 대한 입력이 단일 값임을 지정합니다. # 즉, 모양은 하나의 멤버가있는 1 차원 배열입니다. # 이것이 첫 번째 (유일한) 레이어이므로 해당 입력 모양은 전체 모델의 입력 모양입니다. # 단일 값은 섭씨를 나타내는 부동 소수점 숫자입니다. l0 = tf.keras.layers.Dense(units=1, input_shape=[1]) #레이어가 정의되면 모델로 어셈블해야합니다. # 순차 모델 정의는 입력에서 출력으로의 계산 순서를 지정하는 인수로 레이어 목록을 사용합니다. model = tf.keras.Sequential([l0]) #아래와 같이 합쳐서 코드를 단순화 할수 있다. #model = tf.keras.Sequential([ # tf.keras.layers.Dense(units=1, input_shape=[1]) #]) #모델을 컴파일합니다. # Loss function - 원하는 결과에서 예측이 얼마나 멀리 떨어져 있는지 측정하는 방법입니다. (측정 된 차이를 "손실"이라고합니다.) # Optimizer function - 손실을 줄이기 위해 내부 값을 조정하는 방법입니다. model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(0.1)) #이는 학습 (아래의 model.fit ()) 중에 먼저 각 지점에서 손실을 계산 한 다음 개선하는 데 사용됩니다. # 사실, 모델의 현재 손실을 계산 한 다음이를 개선하는 행위가 바로 훈련입니다. #훈련 중에 최적화 기능은 모델의 내부 변수에 대한 조정을 계산하는 데 사용됩니다. # 목표는 모델 (실제로 수학 함수)이 섭씨를 화씨로 변환하는 실제 방정식을 반영 할 때까지 내부 변수를 조정하는 것입니다. #TensorFlow는 수치 분석을 사용하여이 조정을 수행하며,이 모든 복잡성이 숨겨져 있으므로 여기서는 자세히 설명하지 않습니다. # 이러한 매개 변수에 대해 알아두면 유용한 정보는 다음과 같습니다. #여기에 사용 된 손실 함수 (평균 제곱 오차)와 옵티 마이저 (Adam)는 이와 같은 단순한 모델의 표준이지만 다른 많은 모델을 사용할 수 있습니다. # 이 시점에서 이러한 특정 기능이 어떻게 작동하는지 아는 것은 중요하지 않습니다. #자체 모델을 구축 할 때 고려해야 할 Optimizer의 한 부분은 학습률입니다 (위 코드에서 0.1). # 모델에서 값을 조정할 때 취한 단계 크기입니다. # 값이 너무 작 으면 모델 훈련에 너무 많은 반복이 필요합니다. 너무 커서 정확도가 떨어집니다. # 좋은 값을 찾는 데 종종 시행 착오가 수반되지만 일반적으로 범위는 0.001 (기본값) 및 0.1 이내입니다. #이제 fit 메서드를 호출하여 모델을 훈련시킵니다. #훈련 중에 모델은 섭씨 값을 취하고 현재 내부 변수 ( "가중치"라고 함)를 사용하여 계산을 수행하고 화씨에 해당하는 값을 출력합니다. # 가중치는 처음에 무작위로 설정되므로 출력이 올바른 값에 가까워지지 않습니다. # 실제 출력과 원하는 출력 간의 차이는 손실 함수를 사용하여 계산되며 최적화 기능은 가중치를 조정해야하는 방법을 지시합니다. #계산, 비교, 조정의이주기는 적합 방법에 의해 제어됩니다. # 첫 번째 인수는 입력이고 두 번째 인수는 원하는 출력입니다. # epochs 인수는 이 주기가 실행되어야하는 횟수를 지정하고 verbose 인수는 메소드가 생성하는 출력량을 제어합니다. history = model.fit(celsius_q, fahrenheit_a, epochs=500, verbose=False) print("Finished training the model") #훈련 통계 표시 #fit 메서드는 히스토리 개체를 반환합니다. # 이 객체를 사용하여 각 훈련 시대 이후에 모델 손실이 어떻게 감소하는지 플롯 할 수 있습니다. # 손실이 크다는 것은 모델이 예측하는 화씨도가 fahrenheit_a의 해당 값과 거리가 멀다는 것을 의미합니다. #이를 시각화하기 위해 Matplotlib를 사용할 것입니다 (다른 도구를 사용할 수 있음). # 보시다시피, 우리 모델은 처음에는 매우 빠르게 개선 된 다음 끝까지 "완벽"할 때까지 꾸준하고 느린 개선을 보입니다. #import matplotlib.pyplot as plt plt.xlabel('Epoch Number') plt.ylabel('Loss Magnitude') plt.plot(history.history['loss']) plt.show() #모델을 사용하여 값 예측 #이제 celsius_q와 fahrenheit_a 간의 관계를 학습하도록 훈련 된 모델이 있습니다. # 예측 방법을 사용하여 이전에 알려지지 않은 섭씨도의 화씨도를 계산할 수 있습니다. #예를 들어 섭씨 값이 100이면 화씨 결과는 어떻게 될 것이라고 생각하십니까? 이 코드를 실행하기 전에 추측하십시오. print(model.predict([100.0])) #레이어 가중치 살펴보기 #마지막으로 Dense 레이어의 내부 변수를 인쇄 해 보겠습니다. print("These are the layer variables: {}".format(l0.get_weights())) #첫 번째 변수는 ~ 1.8에 가깝고 두 번째 변수는 ~ 32에 가깝습니다. 이러한 값 (1.8 및 32)은 실제 변환 공식의 실제 변수입니다. #이것은 변환 공식의 값에 정말 가깝습니다. Dense 레이어가 어떻게 작동하는지 보여주는 다음 비디오에서이를 설명 할 것입니다. # 그러나 단일 입력과 단일 출력을 가진 단일 뉴런의 경우 내부 수학은 선에 대한 방정식과 동일하게 보입니다. y = mx + b , 변환 방정식 f = 1.8c + 32와 같은 형식입니다. #형식이 동일하기 때문에 변수는 1.8과 32의 표준 값으로 수렴해야합니다. #추가 뉴런, 추가 입력 및 추가 출력을 사용하면 공식이 훨씬 더 복잡해 지지만 아이디어는 동일합니다. #약간의 실험 #재미로, 다른 단위로 더 많은 Dense 레이어를 만들어 더 많은 변수를 가지고 있다면 어떨까요? l0 = tf.keras.layers.Dense(units=4, input_shape=[1]) l1 = tf.keras.layers.Dense(units=4) l2 = tf.keras.layers.Dense(units=1) model = tf.keras.Sequential([l0, l1, l2]) model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(0.1)) model.fit(celsius_q, fahrenheit_a, epochs=500, verbose=False) print("Finished training the model") print(model.predict([100.0])) print("Model predicts that 100 degrees Celsius is : {} degrees Fahrenheit".format(model.predict([100.0]))) print("There are the l0 variables : {}".format(l0.get_weights())) print("There are the l1 variables : {}".format(l1.get_weights())) print("There are the l2 variables : {}".format(l2.get_weights()))
주석에 설명을 번역하고 사족들을 달아놓았다.
실행 시켜보면 매번 결과값이 달라지는데 205근처에 머물게 된다.
212가 정답인데 모델의 학습시간이 모자라거나 모델의 데이터가 적고 정합성에 문제가 있는 것으로 보인다.
일단 예측모델하나를 해봤다는 성취감이 있다. 7개의 데이터이긴 해도 학습을 하긴한거니까
이제 다음 단계로 넘어가도록 한다.
205근처로 나오는 이유를 찾았다. colab에서는 212 근처로 정확하게 나와서 데이터를 살펴보니
#학습 데이터 셋팅 celsius_q = np.array([-40, 10, 0, 8, 15, 22, 38]) fahrenheit_a = np.array([-40, 14, 32, 46, 59, 72, 100])
celsius_q 에서 10이 아니라 -10이었다.
#학습 데이터 셋팅 celsius_q = np.array([-40, -10, 0, 8, 15, 22, 38]) fahrenheit_a = np.array([-40, 14, 32, 46, 59, 72, 100])
이렇게 고쳐주니 정상적으로 212 근처의 예측값이 나온다.
머신러닝에서 데이터 전처리의 중요성을 다시 한번 알게 되었다.
728x90반응형'AI > Tensorflow' 카테고리의 다른 글
ML Tensorflow 용어 정리 (0) 2020.12.23 Tensorflow iris 붓꽃 모델 자격증 공부 (0) 2020.12.22 Tensorflow Fashion MNIST 에서 CNNs 사용 모델 (0) 2020.12.18 TensorFlow 두번째 모델 Fashion MNIST (0) 2020.12.17 구글의 텐서플로우 자격증(Google Tensorflow Certificate) 시험 도전 (0) 2020.12.16