2021. 6. 24. 22:57ㆍICT 멘토링/혼자 공부하는 머신러닝+딥러닝
17강 - 인공 신경망 ▶️ 간단한 인공 신경망 모델 만들기
지난 시간
16강 강의 들은 후 수정
패션 MNIST
from tensorflow import keras
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
print(train_input.shape, train_target.shape)
# //(60000, 28, 28) (60000,)
print(test_input.shape, test_target.shape)
# //(10000, 28, 28) (10000,)
딥러닝에서는 새로운 데이터세트를 사용하려면 너무 복잡해져서 보통 고전적으로 사용되는 데이터셋 사용함.
머신러닝 데이터셋 - 붓꽃데이터셋, 보스턴집값,
딥러닝 - MNIST(0~9의 10개의 클래스, 28*28 6만개)
패션 MNIST - MNIST와 비슷하여 이름 붙임. 10개 클래스, 28*28 흑백 6만개
입력과 타깃 샘플
fig, axs = plt.subplots(1, 10, figsize=(10,10))
for i in range(10):
axs[i].imshow(train_input[i], cmap='gray_r')
axs[i].axis('off')
plt.show()
print([train_target[i] for i in range(10)])
# //[9, 0, 0, 3, 0, 2, 7, 2, 5, 5]
print(np.unique(train_target, 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]))
0~255 원래는 큰 값이 더 하얀 쪽이지만 여기서는 반전시켜서 더 어두운 쪽임.
로지스틱 회귀
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)
print(train_scaled.shape)
# //(60000, 784)
sc = SGDClassifier(loss='log', max_iter=5, random_state=42)
scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
print(np.mean(scores['test_score']))
# //0.8195666666666668
0~255 값을 0~1의 값으로 바꿔줌.
하나의 차원으로 펼치기 위해 28*28 배열 사용
loss='log'로 로지스틱 손실함수 사용.
test_score지만 입력한 건 훈련 데이터만 줬기 때문에 5-fold cross validation 한 것이라 검증 점수를 의미하는 것임.
테스트가 아니라 검증!
10개의 클래스를 분류하는 다중 분류인데 왜 log를 손실함수로 사용한 건가??
10개의 이진분류로 본 것
부츠 - 양성, 9개 - 음성
티셔츠 - 양성, 9개 - 음성
...
이런 식으로 이진분류를 하나의 함수로 하여 시그모이드함수에 적용함.
OvR(OvA) 방식!
이를 이용하여 다중 분류에 이진 분류 적용.
로지스틱 회귀 모델
784개의 각 픽셀이 나열됨.
Z = 픽셀1*w1 + 픽셀2*w2 + ... + b
여기서 유의할 것은 각각 다른 가중치와 곱해짐!
인공 신경망 (=딥러닝)
보통 인공신경망은 출력층이 여러 층인데 여기선 개념적으로 보이기 위해 출력층 하나만 존재.
입력층 - 객체. 단순 입력 데이터.
뉴런 - 유닛(unit)이라고도 함.
중요!
Z1, Z2 각각 다른 가중치 곱해짐.
절편은 보통 표기하지 않지만 모든 유닛에 더해짐.
인공 뉴런은 생물학적 뉴런에 영감을 받긴 했지만 전혀 다름.
텐서플로와 케라스
텐서플로(구글에서 만듦. 가장 많이 사용) ↔ Pytorch(페이스북에서 만듦. 텐서플로를 좀 더 쉽게)
from tensorflow import keras
케라스 모델 만들기
train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size=0.2, random_state=42)
print(train_scaled.shape, train_target.shape)
# //(48000, 784) (48000,)
print(val_scaled.shape, val_target.shape)
# //(12000, 784) (12000,)
dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))
model = keras.Sequential(dense)
로지스틱 회귀에서는 교차 검증 사용했지만 딥러닝에서는 교차 검증 하지 않음.
딥러닝은 데이터가 많아서 검증이 안정되어 있고 계산 비용이 높음.
test_size=0.2로 20%를 따로 검증용으로 떼어냄.
Dense - Keras 기본 층. 밀집층, 완전연결층(fully connected layer)
모든 가중치가 다 들어가있음.
10은 unit의 개수. 항상 클래스 개수와 같음.
활성함수로 softmax 함수 지정.
시그모이드함수 사용 원하면 활성함수에 'sigmoid' 입력하면 됨.
입력층은 사실 상 데이터고 아무것도 아니라서 모델은 출력 층 하나의 층만 있음.
input_shape 안 써도 되지만 지정하여 추가해 주는 것이 좋아서 관례적으로 사용함.
Sequential - 여러 층 존재 시 하나씩 층을 쌓음.
또 다른 것도 있지만 대부분 Sequential로 가능함.
모델 설정
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
print(train_target[:10])
# //[7 3 5 8 6 9 3 3 9 9]
손실 함수 지정 먼저!
손실 값 말고 정확도도 지정하고 싶을 때 metrics 사용함.
compile - loss와 metrics 모두 지정하고 싶을 때 사용하는 메소드
실제로 컴파일하는 건 아니고 설정으로 생각하면 됨.
케라스가 C언어에서 출발하여 유래 된 것.
sparse가 붙은 이유는 정수 값일 때 그대로 사용하면 안 됨.
크로스 엔트로피 공식 보면 로그를 취해서 확률값과 곱함. 이렇게 원핫인코딩이 되어 있어야 함.
정수로 된 타깃데이터 사용 원하면 sparse를 떼면 됨.
모델 훈련
model.fit(train_scaled, train_target, epochs=5)
결과 값
Epoch 1/5 1500/1500 [==============================] - 4s 2ms/step - loss: 0.7900 - accuracy: 0.7330 Epoch 2/5 1500/1500 [==============================] - 2s 2ms/step - loss: 0.4875 - accuracy: 0.8357 Epoch 3/5 1500/1500 [==============================] - 2s 2ms/step - loss: 0.4495 - accuracy: 0.8474 Epoch 4/5 1500/1500 [==============================] - 2s 2ms/step - loss: 0.4421 - accuracy: 0.8553 Epoch 5/5 1500/1500 [==============================] - 2s 2ms/step - loss: 0.4373 - accuracy: 0.8549
epochs = 5
loss, 정확도 출력.
model.evaluate(val_scaled, val_target)
결과 값
375/375 [==============================] - 1s 1ms/step - loss: 0.4470 - accuracy: 0.8507
Out[20]:
[0.44698047637939453, 0.8506666421890259]
평가할 때는 evaluate 메소드 사용.
85%의 정확도.
사이킷런-케라스 비교
사이킷런 - 클래스 만들 때 가능한 한 많은 매개변수 지정
케라스 - 층을 따로 만들고, 층에 대한 설정을 compile 메소드에서 함. 훈련, 평가는 유사.
케라스-인공신경망 모델이 더 분산되어 있는 것은 다양한 모델을 조합할 수 있도록 하기 위한 것!
여러 층을 끼워넣거나 할 수 있음.
로지스틱 회귀와 가장 간단한 인공신경망은 유사함.
비슷하지만 api 구현 방식이 다름.
참고 자료
https://www.youtube.com/watch?v=ZiP9erf5Fo0&list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX&index=17
'ICT 멘토링 > 혼자 공부하는 머신러닝+딥러닝' 카테고리의 다른 글
19강 - 신경망 모델 훈련 ▶️인경 신경망 모델 훈련의 모범 사례 학습하기 (0) | 2021.07.08 |
---|---|
18강 - 심층 신경망 ▶️인공 신경망에 층을 추가하여 심층 신경망 만들어 보기 (0) | 2021.07.01 |
11강 - 로지스틱 회귀로 와인 분류하기 & 결정 트리 (0) | 2021.06.24 |
10강 - 확률적 경사 하강법 알아보기 (0) | 2021.06.24 |
9강 - 로지스틱 회귀 알아보기 (0) | 2021.06.24 |