방명록
- 텐서플로우 자동미분, 모델 생성 후 테스트2024년 02월 13일 05시 51분 02초에 업로드 된 글입니다.작성자: 재형이반응형
- 연휴 끝!
1. 텐서플로우의 자동 미분과 기울기(Gradient)
- TensorFlow에서는 Gradient Tape 기능을 제공한다
- 중간의 관련 연산들을 테이프에 기록하고, 역전파(backward)를 수행했을 때 기울기가 계산된다
import tensorflow as tf x = tf.Variable([3.0, 4.0]) y = tf.Variable([1.0, 2.0]) # 진행되는 모든 연산들을 기록 with tf.GradientTape() as tape: z = x + y loss = tf.math.reduce_mean(z) dx = tape.gradient(loss, x) # loss가 scalar이므로 계산 가능 print(dx)
- TensorFlow에서는 변수가 아닌 상수라면 기본적으로 기울기를 측정하지 않는다. (not watched)
- 또한, 변수라고 해도 학습 가능하지 않으면 (not trainable) 자동 미분을 사용하지 않는다
x = tf.linspace(-10, 10, 100) with tf.GradientTape() as tape: tape.watch(x) # constant이므로, watch() 함수 호출 필요 y = tf.nn.sigmoid(x) dx = tape.gradient(y, x) print(dx)
- 도함수도 그래프로 출력이 가능하다
import matplotlib.pyplot as plt plt.plot(x, y, 'r', label="y") plt.plot(x, dx, 'b--', label="dy/dx") plt.legend() plt.show()
2. 뉴런부터 깊은 모델 만들기 - 텐서플로우
- 기존에 사용하였던 날씨 데이터를 그대로 사용
# 데이터 세트 다운로드 !git clone https://github.com/ndb796/weather_dataset %cd weather_dataset # 라이브러리 불러오기(Load Libraries) from tensorflow.keras.models import Sequential from tensorflow.keras import layers from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras import optimizers import numpy as np import matplotlib.pyplot as plt
- 이미지를 불러올 때 어떤 방법(회전, 자르기, 뒤집기 등)을 사용할 것인지 명시할 수 있다
- 이후에 flow()를 이용하여 실질적으로 데이터를 불러올 수 있다
- 어떤 데이터를 사용할 것인지, 배치 크기(batch size), 데이터 셔플(shuffle) 여부 등을 명시한다.
next() 함수를 이용하여 numpy array 형태로 데이터를 배치 단위로 얻을 수 있다.
train_generator = ImageDataGenerator( rescale=1/255., horizontal_flip=True, validation_split=0.2 ) test_generator = ImageDataGenerator(rescale=1/255.) train_flow = train_generator.flow_from_directory( directory='train/', shuffle=True, target_size=(224, 224), class_mode='categorical', batch_size=64, subset="training" ) val_flow = train_generator.flow_from_directory( directory='train/', shuffle=False, target_size=(224, 224), class_mode='categorical', batch_size=64, subset="validation" ) test_flow = test_generator.flow_from_directory( directory='test/', shuffle=False, target_size=(224, 224), class_mode='categorical', batch_size=64 )
# 데이터 시각화(Data Visualization) plt.rcParams['figure.figsize'] = [12, 8] plt.rcParams['figure.dpi'] = 60 plt.rcParams.update({'font.size': 20}) class_names = { 0: "Cloudy", 1: "Rain", 2: "Shine", 3: "Sunrise" } images, targets = next(train_flow) print([class_names[x] for x in np.argmax(targets[:4], axis=1)]) plt.imshow(np.concatenate((images[0], images[1], images[2], images[3]), axis=1)) plt.show()
- 자신이 직접 정의한 뉴럴 네트워크를 이용하여 데이터 세트에 대한 학습이 가능하다
- 레이어의 깊이를 늘려 가며, 파라미터의 개수를 증가시킬 수 있다
def get_model_1(): model = Sequential() model.add(layers.Input(shape=(224, 224, 3))) model.add(layers.Flatten()) # dimension: 224 * 224 * 3 model.add(layers.Dense(4, activation="softmax")) return model def get_model_2(): model = Sequential() model.add(layers.Input(shape=(224, 224, 3))) model.add(layers.Flatten()) # dimension: 224 * 224 * 3 model.add(layers.Dense(64, activation="relu")) model.add(layers.Dense(4, activation="softmax")) return model def get_model_3(): model = Sequential() model.add(layers.Input(shape=(224, 224, 3))) model.add(layers.Flatten()) # dimension: 224 * 224 * 3 model.add(layers.Dense(128, activation="relu")) model.add(layers.Dropout(0.5)) model.add(layers.Dense(64, activation="relu")) model.add(layers.Dropout(0.5)) model.add(layers.Dense(32, activation="relu")) model.add(layers.Dropout(0.5)) model.add(layers.Dense(4, activation="softmax")) return model
- 학습 결과를 시각화하여 정상적으로 모델이 학습되었는지 확인할 수 있다
모델 1의 학습결과
model_1 = get_model_1() model_1.summary() learning_rate = 0.01 # 학습 준비 단계(compile) model_1.compile( optimizer=optimizers.SGD(lr=learning_rate), loss='categorical_crossentropy', metrics=['accuracy'] ) # 학습 수행 history = model_1.fit( train_flow, epochs=20, validation_data=val_flow ) plt.plot(history.history['accuracy']) plt.plot(history.history['val_accuracy']) plt.ylabel('Accuracy') plt.xlabel('Epochs') plt.title('Accuracy') plt.legend(['train', 'valid']) plt.show() # 학습된 모델 테스트 test_history = model_1.evaluate(test_flow) test_loss, test_accuracy = test_history print(f"Test loss: {test_loss:.8f}") print(f"Test accuracy: {test_accuracy * 100.:.2f}%")
모델 2의 학습결과
model_2 = get_model_2() model_2.summary() learning_rate = 0.01 # 학습 준비 단계(compile) model_2.compile( optimizer=optimizers.SGD(lr=learning_rate), loss='categorical_crossentropy', metrics=['accuracy'] ) # 학습 수행 history = model_2.fit( train_flow, epochs=20, validation_data=val_flow ) plt.plot(history.history['accuracy']) plt.plot(history.history['val_accuracy']) plt.ylabel('Accuracy') plt.xlabel('Epochs') plt.title('Accuracy') plt.legend(['train', 'valid']) plt.show() # 학습된 모델 테스트 test_history = model_2.evaluate(test_flow) test_loss, test_accuracy = test_history print(f"Test loss: {test_loss:.8f}") print(f"Test accuracy: {test_accuracy * 100.:.2f}%")
모델 3의 학습결과
model_3 = get_model_3() model_3.summary() learning_rate = 0.01 # 학습 준비 단계(compile) model_3.compile( optimizer=optimizers.SGD(lr=learning_rate), loss='categorical_crossentropy', metrics=['accuracy'] ) # 학습 수행 history = model_3.fit( train_flow, epochs=20, validation_data=val_flow ) plt.plot(history.history['accuracy']) plt.plot(history.history['val_accuracy']) plt.ylabel('Accuracy') plt.xlabel('Epochs') plt.title('Accuracy') plt.legend(['train', 'valid']) plt.show() # 학습된 모델 테스트 test_history = model_3.evaluate(test_flow) test_loss, test_accuracy = test_history print(f"Test loss: {test_loss:.8f}") print(f"Test accuracy: {test_accuracy * 100.:.2f}%")
- 더 많은 파라미터와 깊은 네트워크를 사용했다고 정확도가 항상 올라가는 것은 아니다
- learning rate를 잘 조절해가면서 수정해가야 정확도를 향상 시킬 수 있다
3. 이미지 날씨 분류 모델 - 텐서플로우
- 같은 날씨 데이터 모델 세트를 사용
# 데이터 세트 다운로드 !git clone https://github.com/ndb796/weather_dataset %cd weather_dataset # 라이브러리 불러오기(Load Libraries) from tensorflow.keras.applications import InceptionV3 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Flatten, Dense from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras import optimizers import numpy as np import matplotlib.pyplot as plt
- 데이터 세트 불러오기(Load Dataset)
train_generator = ImageDataGenerator( rescale=1/255., horizontal_flip=True, validation_split=0.2 ) test_generator = ImageDataGenerator(rescale=1/255.) train_flow = train_generator.flow_from_directory( directory='train/', shuffle=True, target_size=(224, 224), class_mode='categorical', batch_size=64, subset="training" ) val_flow = train_generator.flow_from_directory( directory='train/', shuffle=True, target_size=(224, 224), class_mode='categorical', batch_size=64, subset="validation" ) test_flow = test_generator.flow_from_directory( directory='test/', shuffle=False, target_size=(224, 224), class_mode='categorical', batch_size=64 )
- 데이터 시각화(Data Visualization)
plt.rcParams['figure.figsize'] = [12, 8] plt.rcParams['figure.dpi'] = 60 plt.rcParams.update({'font.size': 20}) class_names = { 0: "Cloudy", 1: "Rain", 2: "Shine", 3: "Sunrise" } images, targets = next(train_flow) print([class_names[x] for x in np.argmax(targets[:4], axis=1)]) plt.imshow(np.concatenate((images[0], images[1], images[2], images[3]), axis=1)) plt.show()
- 사전 학습된(pre-trained) 모델(model)을 이용하여 가지고 있는 데이터 세트에 대한 학습이 가능하다
- include_top : 네트워크 뒤에 FC (fully-connected) 레이어를 포함하는지 여부
- weights : None 혹은 "imagenet"
- 네트워크의 마지막에 FC 레이어를 적용하여 클래스 개수를 일치시킨다
model = Sequential() pretrained_model= InceptionV3( input_shape=(224, 224, 3), include_top=False, weights='imagenet') model.add(pretrained_model) model.add(Flatten()) model.add(Dense(4, activation='softmax')) model.summary()
learning_rate = 0.001 # 학습 준비 단계(compile) model.compile( optimizer=optimizers.SGD(lr=learning_rate), loss='categorical_crossentropy', metrics=['accuracy'] ) # 학습 수행 history = model.fit( train_flow, epochs=15, validation_data=val_flow )
- 학습 결과를 시각화하여 정상적으로 모델이 학습되었는지 확인
plt.plot(history.history['accuracy']) plt.plot(history.history['val_accuracy']) plt.ylabel('Accuracy') plt.xlabel('Epochs') plt.title('Accuracy') plt.legend(['train', 'valid']) plt.show()
plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.ylabel('Loss') plt.xlabel('Epochs') plt.title('Loss') plt.legend(['train', 'valid']) plt.show()
# 학습된 모델 테스트 test_history = model.evaluate(test_flow) test_loss, test_accuracy = test_history print(f"Test loss: {test_loss:.8f}") print(f"Test accuracy: {test_accuracy * 100.:.2f}%")
반응형'인공지능 > 프레임워크 or 라이브러리' 카테고리의 다른 글
의사 결정 트리, 랜덤 포레스트, SVM, 선형 회귀 (4) 2024.02.15 사이킷런 개요, 가상 데이터, 데이터 분할, ROC 커브 (2) 2024.02.14 텐서플로우 개요, 텐서 형변환, 연산, 함수 (2) 2024.02.12 자동 미분과 기울기, 모델 생성 후 테스트 및 검증해보기 (2) 2024.02.11 파이토치 개요, 텐서의 형변환, 연산, 함수 (2) 2024.02.10 다음글이 없습니다.이전글이 없습니다.댓글