👉🏻 딥러닝
- 케라스를 통해서 딥러닝할 것
- 층을 쌓아서 진행
- earlystopping을 통해 학습하다가 과적합이 되지 않도록 잡아줌
✅ 층 쌓기
- 1. 모델명.add를 통해
- 2. 맨 뒤에 연결해주는 것
- add할 때 마다 층이 쌓임
- unit의 개수, 활성화함수(relu, tanzent, sigmoid ...), 입력변수(독립변수)
- 마지막 층은 시간대별 자전거 수요를 예측야하니까 한개로 결과가 나와야 한다(??)
- 예측하려는 종속변수를 위 개수에 맞는 결과값이 나올 수 있게 설계
✅ 학습시키기
- patience: 과적합이 될 때 loss가 5번정도 흘러가면 멈춰달라
- early_stopping: 과적합이 되기 전에 멈춰줌
- epochs: 훈련을 얼마나 시킬건지
- batch_size: 데이터를 얼마 단위로 훈련할건지
- validation_split: 훈련을 하면서도 잘못된 방향으로 흘러가지 않도록(과적합 등이 일어나지 않도록) 검증용 데이터를 통해 매 epoch마다 훈련이 잘 되고 있는지 체크하기 위해 분리
- 너무 훈련용 데이터만 학습한 나머지 테스트에서 결과가 좋지 않은 경우가 있음(과적합) - 이를 체크해줌
에러남,,,
- 이 오류는 모델의 fit 함수에 전달된 데이터의 형식이 부동 소수점(float)이나 정수(int)가 아니라서 발생한 것으로 보인다
- 모델은 일반적으로 NumPy 배열을 기대하며, 여기에는 부동 소수점 또는 정수 값이 포함되어야한다
- x_train과 y_train이 각각 Pandas DataFrame이므로, 이를 NumPy 배열로 변환해야한다
- 위의 코드에서 astype('float32')를 사용하여 데이터를 부동 소수점으로 변환하고, 이제 x_train_np와 y_train_np를 모델에 전달
드디어 돌아간다...
이번에도 드는 의문.. 강사님과 똑같이 했는데 왜 강사님은 돌아가고 나는 추가적인 작업이 필요한 것인가
- 훈련용 데이터 10876개에 대해서 1209개를 validation으로 뽑음
- loss가 줄어들고 있음 (loss가 줄어드는 방향으로 최적화를 하고 있음)
- validation이 중간에 튐
- validation의 수가 적어서 튀는 것 일 수도 있고 (한두개 틀리는 것에 대해서도 오류율이 높아짐)
- 과적합일 수도 있음
- 하지만 추세를 보는 것이 중요
- 그런데 강사님은 300 ~ 100대를 왔다갔다 하는데 나는 왜 700 ~ 500대를 왔다갔다 하는가...
✏️ 더 알아보기
강사님은 라이브러리 이론 하나하나 공부하기보다는 일단 사용하면서 배우길 원하는 것 같다..!
그래서 지금 당장의 강의에서는 코드 하나하나에 대한 설명은 좀 부족함
나중에 이론 강의를 따로 하신다고함
💡 Keras
Keras는 딥러닝 모델을 구축하고 훈련하기 위한 고수준 딥러닝 API입니다. François Chollet에 의해 개발되었으며, TensorFlow, Theano, Microsoft Cognitive Toolkit (CNTK) 등 여러 백엔드 엔진 위에서 동작할 수 있습니다. TensorFlow 2.0 이후부터는 TensorFlow의 일부로 통합되어, TensorFlow에서 Keras를 사용하는 것이 표준이 되었습니다.
여기에서는 Keras의 기본 개념과 주요 구성 요소에 대해 알아보겠습니다:
- 모델 구성 (Model Composition):
- Sequential 모델: 가장 간단한 형태의 모델로, 순차적으로 레이어를 쌓아나가는 모델입니다.
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))
- 함수형 API: 더 복잡한 모델 구조를 만들 때 사용되며, 다중 입력이나 다중 출력 등을 다룰 수 있습니다.
from keras.layers import Input, Dense
from keras.models import Model
input_layer = Input(shape=(100,))
hidden_layer = Dense(units=64, activation='relu')(input_layer)
output_layer = Dense(units=10, activation='softmax')(hidden_layer)
model = Model(inputs=input_layer, outputs=output_layer)
- 레이어 (Layers):
- Keras에서는 다양한 레이어를 제공합니다. Dense, Conv2D, LSTM 등이 있으며, 이를 통해 모델의 아키텍처를 구성합니다.
- 활성화 함수 (Activation Functions):
- 각 레이어는 활성화 함수를 통해 비선형성을 추가합니다. 일반적으로 사용되는 함수로는 ReLU, sigmoid, tanh, softmax 등이 있습니다.
- 손실 함수 (Loss Functions):
- 모델이 학습할 때 사용되는 손실 함수를 선택합니다. 회귀 문제에서는 MAE(Mean Absolute Error), 분류 문제에서는 Cross-Entropy 등이 사용됩니다.
- 옵티마이저 (Optimizers):
- 모델의 가중치를 업데이트하는 알고리즘을 선택합니다. Adam, SGD 등이 흔히 사용됩니다.
- 훈련 (Training):
- compile 함수를 사용하여 모델을 컴파일하고, fit 함수를 사용하여 모델을 훈련합니다. 이때 손실 함수, 옵티마이저, 메트릭 등을 지정할 수 있습니다.
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_val, y_val))
- 평가 및 예측:
- evaluate 함수를 사용하여 모델을 평가하고, predict 함수를 사용하여 새로운 데이터에 대한 예측을 수행합니다.
loss, accuracy = model.evaluate(x_test, y_test)
predictions = model.predict(new_data)
- 콜백 (Callbacks):
- 훈련 중에 모델의 상태를 모니터링하고, 필요에 따라 조치를 취하는 콜백 함수들을 제공합니다. EarlyStopping, ModelCheckpoint 등이 있습니다.
from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=3)
model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_val, y_val), callbacks=[early_stopping])
Keras는 사용자 친화적이며 간단한 구문으로 딥러닝 모델을 구축하고 훈련하는 데에 효과적입니다. TensorFlow와 함께 사용되면, 높은 수준의 추상화와 강력한 기능을 동시에 활용할 수 있습니다.
💡 keras.models - Sequential
keras.models.Sequential은 Keras에서 제공하는 가장 간단한 형태의 모델 클래스로, 레이어를 순차적으로 쌓아 나가는 방식으로 모델을 구축합니다. 이는 간단한 신경망 구조를 만들 때 사용되며, 순차적으로 레이어를 추가하면서 모델을 정의할 수 있습니다.
여기에는 Sequential 클래스를 사용하여 모델을 만들고 다양한 레이어를 추가하는 예제가 있습니다:
from keras.models import Sequential
from keras.layers import Dense
# Sequential 모델 생성
model = Sequential()
# 첫 번째 레이어 (입력 레이어)
model.add(Dense(units=64, activation='relu', input_dim=100))
# 두 번째 레이어
model.add(Dense(units=32, activation='relu'))
# 출력 레이어
model.add(Dense(units=10, activation='softmax'))
위의 예제에서:
- Sequential 클래스의 객체 model을 생성합니다.
- add 메서드를 사용하여 순차적으로 레이어를 추가합니다.
- 첫 번째 레이어는 입력 레이어로, input_dim 매개변수를 통해 입력의 차원을 지정합니다. 이는 모델의 첫 번째 레이어에서만 사용됩니다.
- 두 번째 레이어는 은닉 레이어로, 64개의 유닛과 ReLU 활성화 함수를 가지고 있습니다.
- 세 번째 레이어는 또 다른 은닉 레이어로, 32개의 유닛과 ReLU 활성화 함수를 가지고 있습니다.
- 마지막 레이어는 출력 레이어로, 10개의 유닛과 소프트맥스 활성화 함수를 가지고 있습니다.
이렇게 순차적으로 레이어를 추가하면 모델이 자동으로 입력과 출력의 형태를 추론하며, 각 레이어의 가중치와 바이어스를 관리합니다.
모델을 컴파일하고 훈련하는 등의 다양한 작업은 Sequential 클래스의 메서드를 사용하여 수행할 수 있습니다. 이를 통해 간단한 신경망을 빠르게 구축하고 실험할 수 있습니다.
💡 keras.layers - Dense
keras.layers.Dense는 신경망의 fully connected 레이어를 나타내는 클래스입니다. Dense 레이어는 각 노드가 이전 레이어의 모든 노드와 연결된 완전 연결 층을 의미합니다. 다양한 딥러닝 모델에서 사용되며, 각 노드의 출력은 이전 레이어의 모든 입력에 가중치를 적용한 값의 합과 활성화 함수를 거친 결과입니다.
간단한 사용 예제를 통해 keras.layers.Dense를 알아보겠습니다:
from keras.layers import Dense
# Dense 레이어 생성
dense_layer = Dense(units=64, activation='relu', input_dim=100)
위의 코드에서:
- units: 레이어의 출력 차원을 나타냅니다. 이는 레이어에 있는 노드의 개수를 의미합니다.
- activation: 활성화 함수를 지정합니다. 'relu', 'sigmoid', 'softmax' 등이 흔히 사용됩니다.
- input_dim: 첫 번째 레이어에서만 사용되며, 입력 데이터의 차원을 나타냅니다.
Dense 레이어를 모델에 추가할 때는 Sequential 모델을 사용할 수 있습니다. 예를 들어:
from keras.models import Sequential
model = Sequential()
# 첫 번째 Dense 레이어 (입력 레이어)
model.add(Dense(units=64, activation='relu', input_dim=100))
# 두 번째 Dense 레이어
model.add(Dense(units=32, activation='relu'))
위의 코드에서 두 번째 Dense 레이어는 입력 레이어로부터 64개의 출력을 받아들이고, 32개의 출력을 생성하는 레이어입니다.
Dense 레이어는 텐서플로(TensorFlow) 및 케라스(Keras)를 비롯한 다양한 딥러닝 프레임워크에서 일반적으로 사용되며, 신경망 모델을 구성하는 데 필수적인 구성 요소 중 하나입니다.
💡 keras.callbacks - EarlyStopping
keras.callbacks.EarlyStopping은 Keras에서 제공하는 콜백 클래스 중 하나로, 훈련 중에 모델의 성능이 개선되지 않으면 훈련을 일찍 중지시키는 역할을 합니다. 이는 과적합을 방지하고 효율적인 훈련을 위해 사용됩니다.
간단한 예제를 통해 EarlyStopping 콜백을 사용하는 방법을 알아보겠습니다:
from keras.callbacks import EarlyStopping
from keras.models import Sequential
from keras.layers import Dense
# 예제 데이터 생성
import numpy as np
x_train = np.random.rand(100, 1)
y_train = 3 * x_train + 2 + 0.1 * np.random.randn(100, 1)
# Sequential 모델 생성
model = Sequential()
model.add(Dense(units=1, input_dim=1))
# 모델 컴파일
model.compile(optimizer='sgd', loss='mean_squared_error')
# EarlyStopping 콜백 생성
early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
# 모델 훈련
model.fit(x_train, y_train, validation_split=0.1, epochs=100, callbacks=[early_stopping])
위의 예제에서:
- monitor: 모니터링할 지표를 지정합니다. 여기서는 검증 손실(val_loss)을 모니터링하고 있습니다.
- patience: 성능이 향상되지 않은 상태를 얼마나 기다릴지를 지정합니다. 지정된 횟수 동안 성능이 향상되지 않으면 훈련이 중지됩니다.
- restore_best_weights: 최선의 성능을 보인 시점에서의 가중치로 복원할지 여부를 결정합니다. 이를 True로 설정하면 최선의 성능을 보인 모델의 가중치로 복원됩니다.
EarlyStopping 콜백은 훈련 중에 검증 손실을 모니터링하며, 설정된 기준에 따라 성능이 향상되지 않으면 훈련을 조기에 중지시킵니다. 이는 과적합을 방지하고 효율적인 모델 훈련을 가능케 합니다.
💡 Dense
keras.layers.Dense는 딥러닝에서 사용되는 fully connected 레이어를 나타내는 클래스입니다. Dense 레이어는 각 노드가 이전 레이어의 모든 노드와 연결된 완전 연결 층을 나타냅니다. 각 노드는 입력과 연결된 가중치와 함께 활성화 함수를 통과하여 출력을 생성합니다.
간단한 예제를 통해 keras.layers.Dense를 설명하겠습니다:
from keras.layers import Dense
# Dense 레이어 생성
dense_layer = Dense(units=64, activation='relu', input_dim=100)
위의 코드에서:
- units: 레이어의 출력 차원을 나타냅니다. 즉, 레이어에 있는 노드의 개수를 의미합니다. 이 값이 클수록 레이어의 표현력이 풍부해집니다.
- activation: 활성화 함수를 지정합니다. ReLU, sigmoid, tanh, softmax 등이 흔히 사용되며, 각 노드의 출력을 계산하는 데 사용됩니다.
- input_dim: 첫 번째 레이어에서만 사용되며, 입력 데이터의 차원을 나타냅니다.
Dense 레이어는 주로 신경망의 은닉층과 출력층에서 사용됩니다. 은닉층에서는 비선형성을 추가하여 모델이 복잡한 관계를 학습할 수 있게 하고, 출력층에서는 최종 예측을 만들기 위해 사용됩니다.
예를 들어, 다음과 같이 Sequential 모델에 Dense 레이어를 추가하여 간단한 신경망을 만들 수 있습니다:
from keras.models import Sequential
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))
위의 코드에서 첫 번째 Dense 레이어는 100개의 입력을 받아 64개의 출력을 생성하고, 두 번째 Dense 레이어는 64개의 입력을 받아 10개의 출력을 생성합니다. 이런식으로 간단한 신경망 아키텍처를 구성할 수 있습니다.
💡 unit, activation, input_dim
- Units:
- units는 Dense 레이어의 출력 차원을 의미합니다. 간단히 말해서, 레이어에 있는 노드의 개수를 지정합니다. 예를 들어, units=64는 레이어에 64개의 노드가 있다는 것을 의미합니다. 이 값이 클수록 레이어의 표현력이 증가하며, 모델이 더 복잡한 패턴을 학습할 수 있게 됩니다.
- Activation:
- activation은 각 노드에서 출력을 계산하는 데 사용되는 활성화 함수를 지정합니다. 활성화 함수는 노드의 출력을 결정하는 비선형 함수로, 네트워크가 복잡한 패턴을 학습할 수 있도록 도와줍니다.
- 일반적인 활성화 함수:
- ReLU(Rectified Linear Unit): 주로 은닉층에서 사용되며, 양수 입력에 대해 그대로 출력하고 음수 입력에 대해 0으로 출력합니다. activation='relu'로 지정합니다.
- Sigmoid: 주로 이진 분류 문제의 출력층에서 사용되며, 0과 1 사이의 값을 출력합니다. activation='sigmoid'로 지정합니다.
- Softmax: 다중 클래스 분류 문제의 출력층에서 사용되며, 각 클래스에 대한 확률 분포를 출력합니다. activation='softmax'로 지정합니다.
- Input_dim:
- input_dim은 첫 번째 Dense 레이어에서만 사용되며, 입력 데이터의 차원을 나타냅니다. 예를 들어, input_dim=100은 100차원의 입력 데이터를 기대한다는 것을 의미합니다.
- input_dim은 모델의 첫 번째 레이어에서만 필요하며, 나머지 레이어에서는 자동으로 이전 레이어의 출력 차원을 기반으로 결정됩니다.
이러한 매개변수들은 모델의 구조를 정의하는 데 중요하며, 적절한 선택은 모델의 성능에 영향을 미칩니다. 일반적으로는 실험과 조정을 통해 최적의 하이퍼파라미터 값을 찾는 과정이 필요합니다.
💡 model.add()
model.add()는 Keras의 Sequential 모델에서 새로운 층(layer)을 모델에 추가하는 메서드입니다. Sequential 모델은 각 층을 순차적으로 쌓아 나가는 모델 구축 방식을 제공합니다.
model.add() 메서드:
- 사용법:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
- Sequential 모델을 만든 후에 model.add()를 사용하여 층을 추가합니다.
- Dense는 fully connected 층을 의미하며, 여기서는 64개의 뉴런과 ReLU 활성화 함수를 갖는 층을 추가한 예시입니다.
신경망은 데이터를 입력받아 여러 층을 거쳐 최종적으로 원하는 출력을 만들어내는 모델입니다. 각 층은 데이터에 대해 다양한 특징을 학습하고 추상화합니다.
- 초기화:
- 마치 레고 블록을 쌓듯이, Sequential 모델을 만들고 첫 번째 층을 추가합니다.
- 층 추가:
- model.add()로 다음 층을 추가하면, 마치 다음 레이어의 레고 블록을 현재 층 위에 놓는 것과 유사합니다.
- 출력 형태:
- 각 층은 입력을 받아 일종의 변환을 수행하며, 그 변환된 값을 다음 층에 전달합니다. 이것은 데이터에 대한 특징 추출 및 표현 학습 과정입니다.
- 층 쌓기:
- 모델이 데이터를 통과함에 따라, 여러 층이 순차적으로 쌓여가면서 높은 수준의 표현을 학습합니다.
비유적으로 보면, 마치 다층의 레고 블록을 쌓아 탑을 만들듯이, 각 층을 순차적으로 쌓아 나가면서 모델은 복잡한 패턴과 추상적인 특징을 학습하게 됩니다. model.add()를 사용하여 각 층을 추가함으로써, 모델은 데이터에 대한 계층적인 표현을 학습하게 됩니다.
출처: https://youtu.be/hZgbNtyZ-Ow?si=wuSbkZeihTVtIam8
'데이터분석 > Kaggle' 카테고리의 다른 글
[캐글로 시작하는 머신러닝, 딥러닝] 9. 모형별 비교 (0) | 2024.01.17 |
---|---|
[캐글로 시작하는 머신러닝, 딥러닝] 8. 머신러닝 (0) | 2024.01.13 |
[캐글로 시작하는 머신러닝, 딥러닝] 5~6. EDA와 전처리 (0) | 2024.01.08 |
[캐글로 시작하는 머신러닝, 딥러닝] 3~4 .데이터 및 커널 소개, 데이터 불러오기와 기본적 탐색 (0) | 2023.12.29 |
[캐글로 시작하는 머신러닝, 딥러닝] 1~2. 캐글 소개 (1) | 2023.12.20 |