반응형
안녕하세요! 오늘은 딥러닝의 가장 기초적인 구조인 단층신경망에 대해 알아보고, 간단한 실습을 진행하도록 하겠습니다.
1. 단층신경망이란?
1) 단층신경망(SLP)의 개념
- 단층신경망(Single-Layer Perceptron, SLP)은 가장 기본적인 인공 신경망 구조로, 입력층(Input Layer)과 출력층(Output Layer) 두 개의 층으로만 이루어져 있는 단순한 형태의 신경망입니다.
- 일반적으로 우리가 신경망을 이야기할 때, 중간에 여러 은닉층(Hidden Layer)이 존재하는 다층신경망(Multi-Layer Perceptron, MLP)을 떠올리기 쉬운데, 단층신경망은 그보다 훨씬 구도가 간단하다는 것이 특징입니다.
- 이러한 단층신경망은 선형 분류 문제를 해결하는데 적합합니다.
2) 단층신경망 수식
- 단층신경망의 기본 수식은 다음과 같으며, 출력값 y는 가중치와 입력값의 곱을 모두 더한 뒤 바이어스를 더하고, 활성화 함수를 통해 최종 출력으로 변환됩니다.
- xi : 입력값
- wi : 각 입력값에 대한 가중치
- b : 바이어스
- f : 활성화 함수
2. 단층신경망 한계
- 비선형 문제 해결 어려움 : 단층신경망은 입력층과 출력층 사이의 선형 관계만을 학습할 수 있기 때문에, XOR과 같은 비선형적인 문제 해결이 어렵습니다.
- 복잡한 패턴 학습의 한계 : 은닉층이 존재하지 않기에 데이터 내의 고차원적인 특징을 추출하거나 이미지 인식이나 자연어 처리와 같은 복잡한 패턴을 학습하는 데 한계가 있습니다. 따라서 보다 복잡한 문제 해결을 위해서는 다층 신경망을 활용해야 합니다.
3. 단층신경망 구성 요소
- 입력층 (Input Layer) : 외부에서 데이터를 받아들이는 층으로, 입력층 자체는 픽셀값으로 특별한 계산을 수행하지는 않습니다.
- 출력층 (Output Layer) : 신경망의 최종값을 반환하는 층입니다.
- 가중치 (Weight) : 각 입력값에 곱해지는 계수로, 입력값에 가중치를 더해 출력층으로 전달됩니다.
- 바이어스(Bias) : 신경망의 출력을 조정하는데 사용되는 상수로, 모델의 표현력을 높이는 데 기여합니다.
- 활성화 함수(Activation Function) : 가중치의 합에 활성화 함수를 적용하여 출력값을 생성합니다. 단층신경망에서는 주로 계단 함수나 시그모이드 함수를 사용합니다.
- 계단 함수(Step Function) : 입력값이 일정 임계값을 넘으면 1을 출력하고, 그렇지 않으면 0을 출력하는 이진 활성화 함수입니다.
- 시그모이드 함수(Sigmoid Function) : 입력값을 0과 1 사이의 확률 값으로 변환하는 활성화 함수로, 연속적이고 부드럽게 변하는 것이 특징입니다.
4. 단층신경망 실습(딥러닝 기반)
1) 데이터 불러오기 및 확인
- 단층신경망 실습을 위해서 딥러닝 분야에서 자주 활용되는 Fashion MNIST 데이터를 활용합니다. 이 데이터셋은 의류 이미지로 구성되어 있으며, 각 이미지의 크기는 28x28 픽셀로 구성되어 있습니다.
(1) 데이터 로드
# 관련 모듈 불러기기
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras # 인공신경망 관련
from sklearn.model_selection import train_test_split
# 패선 MNIST 데이터 불러오기
fashion_mnist = keras.datasets.fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
# 훈련 데이터 및 테스트 데이터 확인하기
x_train.shape, y_train.shape
x_test.shape, y_test.shape
- 28x28 크기의 데이터가 총 60,000개 훈련 세트, 10,000개 테스트 세트로 구성되어 있는 것을 확인할 수 있습니다.
(2) 데이터 확인하기
- 시각화를 통해 데이터가 어떻게 생겼는지를 확인합니다.
# 샘플 데이터 시각화해서, 이미지 확인하기
fig, axs = plt.subplots(1, 10, figsize = (15, 15))
for i in range(10):
axs[i].imshow(x_train[i], cmap = "gray_r") # cmap를 통해 색변환
axs[i].axis("off")
plt.show()
# 종속변수 확인_레이블 확인
print([y_train[i] for i in range(10)])
# 각 레이블 당 샘플 개수 확인
print(np.unique(y_train, return_counts = True)) # return_counts : 각 고유값이 배열 내에 몇 번 등장하는지
📌 패션 MNIST 레이블 의미
- 0 : 티셔츠
- 1 : 바지
- 2 : 스웨터
- 3 : 드레스
- 4 : 코트
- 5 : 샌달
- 6 : 셔츠
- 7 : 스니커즈
- 8 : 가방
- 9 : 앵클부츠
2) 데이터 전처리
- 신경망 모델은 2차원 형태의 이미지 데이터를 직접 사용할 수 없기에, 1차원 벡터 형태로 변환해야 합니다. 또한 각 픽셀의 값을 0 ~ 25 범위에서 0 ~ 1 사이로 정규화하여 학습의 효율을 높입니다.
# x_train 전처리
scaled_train = x_train / 255 # 각 픽셀은 0 ~ 25까지의 정숫값을 가지며, 이를 통해 전부 0 ~ 1 사이의 값을 갖게 됨
scaled_train = scaled_train.reshape(-1, 28 * 28) # 입력데이터를 1차원으로
# 전처리된 값 확인하기
scaled_train.shape
# 데이터 분할
scaled_train, scaled_val, y_train, y_val = train_test_split(scaled_train, y_train, test_size = 0.2,
stratify = y_train, random_state = 22)
# 분할된 데이터 확인
scaled_train.shape, y_train.shape
scaled_val.shape, y_val.shape
3) 단층신경망 모델 생성
- 단층신경망 모델을 구성하기 위해 Keras의 Sequential API를 사용합니다. 입력층은 784개의 뉴런(input shape), 출력층은 10개의 뉴런(클래스 수)으로 구성합니다. 출력층에는 softmax 함수를 사용하여 각 클래스에 대한 확률값을 계산합니다.
- 밀집층(Dense Layer)은 입력층의 모든 뉴런이 출력층의 모든 뉴런과 각각 연결되어 있는 층을 말합니다. 입력과 출력이 완전하게 연결되면, 이를 완전 연결층(Fully Connected Layer)이라고 합니다.
📌 Input(shape = (784,))
- scaled_train의 실제 shape는 (48000, 784)입니다. 이 경우 첫 번째 값 48000은 샘플 개수(배치 크기)를 의미하며, 모델 설계 시에 명시적으로 지정하지 않아도 돕니다.
- 그러나 우리는 오직 한 개의 데이터가 어떤 형태고 구성되어 있는지, 즉 특성의 차원만 모델에 알려주면 되므로 (784,)로 표현하는 것입니다. 이렇게 하면 모델은 자동으로 여러 데이터를 배치 단위로 처리할 수 있게 됩니다.
📌 Dense(10, activation = 'softmax')
- Dense는 케라스에서 밀집층을 구성하는 함수입니다.
- layers.Dense(유닛 개수, 출력에 적용할 활성화 함수)의 형태로 표현합니다.
- Dense(10)은 10개의 출력 뉴런을 갖는 밀집층을 만들겠다는 의미입니다. 10은 우리가 풀고자 하는 문제의 클래스 수와 일치해야 하며, Fashion MNIST는 총 10개의 의류 종류로 구성되어 있으므로 출력 뉴런 수도 10개로 설정해야 합니다.
- activation = 'softmax'는 출력층에서 각 클래스에 해당할 확률 값을 계산해 주는 함수로, 다층 분류 문제에서 자주 사용됩니다. softmax는 출력 뉴런의 값을 0 ~ 1 사이의 확률로 변환하며, 전체 출력의 합은 항상 1이 되도록 만들어줍니다.
- 만약 이진 분류 문제를 해결하고자 할 때는 활성화 함수를 sigmoid로 사용하는 것이 일반적입니다. sigmoid는 입력 값을 0과 1 사이로 변환하며, 특정 클래스에 속할 확률을 나타내는 데 적합하기 때문입니다.
# 밀집층 생성
inputs = keras.Input(shape = (784,))
dense = keras.layers.Dense(10, activation = "softmax")
# 신경망 모델 생성
model = keras.Sequential()
# 신경망 모델에 밀집층 추가 및 모델 구조 확인
model.add(inputs)
model.add(dense)
model.summary()
4) 모델 컴파일
- 모델을 학습시키기 전에 손실 함수와 평가 지표를 설정합니다. 즉, compile은 모델의 학습 과정을 설정하는 것입니다.
📌 loss = "sparse_categorical_crossentropy"
- 손실 함수는 모델이 예측한 값과 실제 정답 간의 차이를 계산하는 함수입니다.
- 이 함수는 모델이 예측한 확률값 중에서 실제 정답 클래스에 해당하는 확률이 1에 가까워지도록 유도하고, 반대로 오답 클래스에 해당하는 확률이 0에 가깝게 낮추도록 학습합니다.
📌 metrics = ["accuracy"]
- 케라스(keras)는 모델이 학습하는 동안 매 에포크(epoch)마다 손실 값을 자동으로 출력해 줍니다.
- 하지만 손실 값만으로는 모델의 직관적인 성능을 파악하기 어렵기 때문에, 추가적으로 정확도(accuracy) 같은 평가 지표를 함께 설정해 주는 것이 좋습니다.
- 정확도는 전체 샘플 중에서 모델이 정답을 맞힌 비율을 의미하며, 가장 직관적이고 흔히 사용하는 성능 지표입니다.
# 모델 학습 과정 설정
model.compile(loss = "sparse_categorical_crossentropy", metrics = ["accuracy"])
5) 모델 훈련 및 평가
- 5번의 에포크(epoch) 동안 모델을 학습시킨 뒤, 검증 데이터로 성능을 평가합니다.
- 에포크 수는 적지만, 손실 값이 감소하고 정확도가 향상되는 모습을 확인할 수 있습니다.
# 모델 훈련
model.fit(scaled_train, y_train, epochs = 5)
# 검증 데이터로 성능 평가
model.evaluate(scaled_val, y_val)
이번 글에서는 단층신경망의 개념부터 실습까지 전반적인 흐름을 정리해 보았습니다. 단층신경망의 구조는 간단하면서 신경망의 작동 원리를 이해하기에 좋습니다.
이번 글이 공부하는 과정에서 도움이 되었으면 합니다.
감사합니다:-)
'데이터 분석 관련' 카테고리의 다른 글
의사결정나무 시각화, 어떻게 읽어야 할까? - 의사결정나무 시각화 해석하는 방법 (0) | 2025.03.12 |
---|---|
쉽게 배우는 의사결정나무(Decision Tree) - 주피터 노트북으로 개념부터 실습까지! (1) | 2025.03.08 |
파이썬: mutable과 immutable 구분하기 / PyCharm 활용 (0) | 2025.03.05 |
[통계 개념] 정규분포, 첨도와 왜도 알아보기 (0) | 2025.02.25 |
pandas(6) : 날짜 데이터 변환 및 변환 오류 / 주피터노트북 (0) | 2025.02.19 |