728x90
단층 인공신경망
# pip install tensorflow
https://www.tensorflow.org/install?hl=ko
TensorFlow
시스템에 TensorFlow를 설치하는 방법을 알아봅니다. pip 패키지를 다운로드하거나 Docker 컨테이너에서 실행하거나 소스에서 빌드합니다. 지원되는 카드에서 GPU를 사용 설정합니다.
www.tensorflow.org
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import cross_validate, train_test_split
from sklearn.linear_model import SGDClassifier
데이터 확인
# 패션 MNIST 데이터 로드
(x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
29515/29515 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26421880/26421880 ━━━━━━━━━━━━━━━━━━━━ 1s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
5148/5148 ━━━━━━━━━━━━━━━━━━━━ 0s 3us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4422102/4422102 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
# load된 훈련데이터 확인
print(x_train.shape, y_train.shape)
(60000, 28, 28) (60000,)
- 훈련 데이터는 60000개의 이미지로 이루어져 있음
- 각 이미지의 크기는 28 * 28
- 타깃은 60000개의 원소가 있는 1차원 배열
# 테스트 데이터 확인
print(x_test.shape, y_test.shape)
(10000, 28, 28) (10000,)
np.unique(x_test)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155,
156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168,
169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181,
182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220,
221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246,
247, 248, 249, 250, 251, 252, 253, 254, 255], dtype=uint8)
# 샘플 이미지 확인
fig, axs = plt.subplots(1, 10, figsize = (15, 15))
for i in range(10):
axs[i].imshow(x_train[i], cmap = "gray_r") # _r : 색 반전
axs[i].axis("off")
plt.show()

# 종속변수 확인
# print([y_train[i] for i in range(10)])
y_train[:10]
array([9, 0, 0, 3, 0, 2, 7, 2, 5, 5], dtype=uint8)
- 패션 MNIST 레이블의 의미
- 0 : 티셔츠
- 1 : 바지
- 2 : 스웨터
- 3 : 드레스
- 4 : 코트
- 5 : 샌달
- 6 : 셔츠
- 7 : 스니커즈
- 8 : 가방
- 9 : 앵클부츠
# 각 레이블 당 샘플 개수 확인
print(np.unique(y_train, return_counts = True))
(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8), array([6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000],
dtype=int64))
- 0 ~ 9 까지 레이블마다 정확히 6000개의 샘플이 들어있음
확률적 경사하강법으로 패션 아이템 분류
scaled_train = x_train / 255 # 각 픽 셀은 0 ~ 255 사이의 정숫값을 가짐
scaled_train.shape
(60000, 28, 28)
# SGDClassifier 는 2차원 입력을 다루지 못하기 때문에 데이터를 1차원 배열로 변환
scaled_train = scaled_train.reshape(-1, 28 * 28)
print(scaled_train.shape)
# 확률적 경사 하강법의 로지스틱회귀 모델
sgd = SGDClassifier(loss = "log_loss", max_iter = 5, random_state = 26) # max_iter = 5 는 지정 안 해도 됨
scores = cross_validate(sgd, scaled_train, y_train, n_jobs = -1)
print(np.mean(scores["test_score"]))
0.8322333333333333
인공신경망
- 로지스틱 회귀

- 로지스틱 회귀식
- z_티셔츠 = w1 * 픽셀1 + w2 * 픽셀2 + ...... + w784 * 픽셀784 + b
- z_바지 = w1' * 픽셀1 + w2' * 픽셀2 + ...... + w784' * 픽셀784 + b'
- 퍼셉트론 인공신경망

- 활성화함수 자리에 로지스틱 회귀의 softmax가 들어가므로 z1 ~ z10까지 10개의 레이블에 대한 확률값을 계산
- 이 z1 ~ z10 까지의 뉴런을 바탕으로 클래스를 예측하기 때문에 신경망의 최종값을 만든다는 의미에서 출력층(output layer)라고 부름
- 인공신경망에서는 z값을 계산하는 단위를 뉴런(neuron)이라고 불렀음
- 현재는 뉴런 대신에 유닛(unit)이라는 표현을 사용
- x1 ~ x784 까지를 입력층(input layer)이라고 부름
- 입력층은 픽셀값 자체이고 특별한 계산을 수행하지는 않음
- 인공신경망은 1943년 워런 매컬러(Warren McCulloch)와 월터 피츠(Walter Pitts)가 제안한 뉴런 모델로부터 시작됨
- 이를 매컬러-피츠 뉴런 이라고 부름
- 인공 뉴런은 생물학적 뉴런에서 영감을 얻어 만들어짐
- 생물학적 뉴런은 수상 돌기로부터 신호를 받아 세포체에 모음
- 신호가 어떤 임곗값에 도달하면 축삭 돌기를 통하여 다른 세포에 신호를 전달
# 많이 사용하는 딥러닝 프레임워크
# (가장 쓰기 쉬움) Tensorflow(Google) + Keras
# PyTorch(facebook)
텐서플로와 케라스
- 텐서플로
- 구글이 2015년 11월 오픈소스로 공개한 딥러닝 라이브러리
- 기본 자료 구조 : Tensor
- 라이센스 apache 2.0을 따르기 때문에 상용화, 상업화가 가능함
- 방대한 자료
- C++ 코어로 개발
- 스타일
- 계산식을 만들고, 데이터를 넣어서 연산은 파이썬 바깥(텐서플로)쪽에서 처리
- 구동원리
- 파이썬에서 무거운 작업을 독립적으로 수행 안함
- 상호연관있는 수행작업들을 그래프로 기술하고
- 연산은 파이썬의 바깥, 텐서플로에서 처리 동작
- 코드는 관계 설정 + 구동
- 케라스
- 텐서플로의 고수준 API
- 엔진이 아니라 인터페이스
- 어떤 엔진을 사용해도 동일한 코드로 작동한다는 것이 모토
- 단, 현재는 텐서플로에 keras가 들어가 있음
- 텐서플로의 고수준 API
pyTorch(파이토치)
- 개요
- python/C++/Java 딥러닝 구현을 위한 오픈소스 라이브러리
- gpu지원은 nvidia만 가능(CUDA만 사용가능)
- Lua(루아, 핵심 사용 언어), C++ 등으로 개발
- Facebook 인공지능팀 개발(뉴욕대 협업)
- 장점
- 복잡하고, 계산양이 큰 그래프를 쉽게 구성
- 계산 그래프를 활용하면 미분/적분도 간단하게 처리
- GPU 연산을 손쉽게 활용하여 빠른 처리가 가능
# 위에서 만든 데이터를 그대로 활용하여 검증세트 나누기
scaled_train, scaled_val, y_train, y_val = train_test_split(scaled_train, y_train, test_size = 0.2,
stratify = y_train,
random_state = 26)
print(scaled_train.shape, scaled_val.shape)
(48000, 784) (12000, 784)
밀집층(dense layer)
- 784개의 픽셀과 10개의 출력층 유닛이 모두 연결되는 층
- 양쪽의 유닛이 모두 연결하고 있기 때문에 완전 연결층(fully connected layer, 전결합층)이라고도 부름
scaled_train.shape
(48000, 784)
# 입력층
inputs = keras.Input(shape = (784,)) # 데이터 개수는 빠지고 모양새만 기재
# 밀집층
# dense 클래스의 매개변수 = 유닛 개수, 출력에 적용할 활성화 함수
dense = keras.layers.Dense(10, activation = "softmax")
- 입력 크기 = (784,)
- 10개의 유닛이 각각 몇 개의 입력을 받는지 튜플로 지정
- 현재 예제에서는 784개의 픽셀값을 1차원으로 받기 때문에 (784,)를 입력
- 유닛 개수 = 10
- 10개의 레이블이 존재하기 때문
- 활성화 함수 = softmax
- 10개의 유닛에서 출력되는 값을 확률값으로 바꾸기 위해서 softmax 사용
- 만약에 이진분류 문제라면 활성화 함수를 시그모이드 함수로 설정하는 것도 가능
- activation = "sigmoid"
# 신경망 모델을 생성
model = keras.Sequential()
model.add(inputs)
model.add(dense)
# 모델 구조 확인
model.summary()

y_train[0]
5
# 모델을 학습시키기 위한 학습과정을 설정
model.compile(loss = "sparse_categorical_crossentropy", metrics = ["accuracy"])
# sparse: 희소행렬
- loss = "sparse_categorical_crossentropy"
- sparse_categorical_crossentropy : 다중 분류에서 주로 사용하는 손실 함수
- 정답의 확률값을 1에 가깝게, 오답의 확률값을 0에 가깝게 만들도록 하는 손실 함수
- 이진 분류에서는 binary_crossentropy를 사용
- sparse_categorical_crossentropy : 다중 분류에서 주로 사용하는 손실 함수
- metrics = ["accuracy"]
- 케라스는 모델이 훈련할 때 기본으로 매 에포크마다 손실 값을 출력해 줌
- 손실값 외에 정확도를 함께 출력해주기 위해 정확도를 나타낼 지표 accuracy를 지정
# 모델 훈련
model.fit(scaled_train, y_train, epochs = 5)

#검증 데이터로 성능 평가
model.evaluate(scaled_val, y_val)

model.predict(scaled_val[[1]])

y_val[1]
3728x90
'09_DL(Deep_Learning)' 카테고리의 다른 글
| 05_다중분류(Iris) (0) | 2025.04.23 |
|---|---|
| 04_신경망 모델 훈련 도구 (1) | 2025.04.23 |
| 월별 사인(sin) 코사인(cos) 시각화 (0) | 2025.04.21 |
| 03_다층 인공신경망 (0) | 2025.04.18 |
| 01_퍼셉트론 구조 (0) | 2025.04.18 |