07-1 인공 신경망
1
2
3
4
import tensorflow as tf
tf.keras.utils.set_random_seed(42)
tf.config.experimental.enable_op_determinism()
패션 MNIST:
- MNIST(Modified National Institute of Standars and Technology Database)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,)
import matplotlib.pyplot as plt
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()
1
2
3
4
5
6
print([train_target[i] for i in range(10)]) # [9, 0, 0, 3, 0, 2, 7, 2, 5, 5]
import numpy as np
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]))
로지스틱 회귀로 패션 아이템 분류하기
1
2
3
4
5
6
7
8
9
10
11
12
13
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)
print(train_scaled.shape) # (60000, 784)
from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log_loss', max_iter=5, random_state=42)
scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
print(np.mean(scores['test_score'])) # 0.8196000000000001
인공신경망
텐서플로와 케라스
1
2
3
import tensorflow as tf
from tensorflow import keras
인공신경망으로 모델 만들기
1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.model_selection import train_test_split
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)
인공신경망으로 패션 아이템 분류하기
1
2
3
4
5
6
7
8
9
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
print(train_target[:10]) # [7 3 5 8 6 9 3 3 9 9]
model.fit(train_scaled, train_target, epochs=5)
model.evaluate(val_scaled, val_target)
# [0.45262545347213745, 0.8464999794960022]
Perceptron
인공지능 관련 인물들
Marvin Minsky:
- 정보:
- 1927년에 태어난 미국의 컴퓨터 과학자 및 인공지능 연구자.
- MIT 미디어 랩의 공동 창립자로, 인공지능 및 인지과학 분야에서 큰 영향을 끼침.
- “인공지능의 아버지” 중 한 명으로 불림.
- 심리학 및 컴퓨터 과학을 접목시켜 인간의 지능을 모델링하려는 노력을 기울임.
- “프레임(Frame)”이라는 개념을 소개하여 지식 표현을 발전시킴.
- ‘퍼셉트론(Perceptron)’의 한계를 지적하며, 기호주의 접근법을 비판함.
Frank Rosenblatt:
- 정보:
- 1928년에 태어난 미국의 심리학자 및 컴퓨터 과학자.
- “퍼셉트론(Perceptron)” 개념을 개발한 인공지능의 선구자 중 한 명.
- 퍼셉트론은 초기 인공 신경망 모델로, 단순한 이진 분류를 수행하는 모델이다.
- 기계 학습에서 신경망을 활용한 패턴 인식의 초기 기초를 마련한 인물로 평가됨.
Geoffrey Everest Hinton:
- 정보:
- 1947년에 태어난 캐나다의 컴퓨터 과학자.
- ‘딥 러닝’ 분야의 선구자 중 한 명으로 꼽힘.
- 역전파 알고리즘을 개발하여 다층 퍼셉트론의 학습을 가능하게 함.
- ‘드롭아웃(Dropout)’과 같은 기법을 도입하여 신경망의 과적합 문제를 해결하는데 기여.
- 이미지 인식 등 다양한 분야에서 혁신적인 딥러닝 모델을 개발하며 인공지능 분야를 선도.
Yann LeCun:
- 정보:
- 1960년에 태어난 프랑스 출신의 컴퓨터 과학자 및 머신러닝 연구자.
- “딥 러닝의 아버지”로 불리며, 현대 딥러닝의 발전에 큰 역할을 한 인물 중 하나.
- 합성곱 신경망(CNN, Convolutional Neural Network)의 개념과 구조를 개발하여 컴퓨터 비전 분야에서의 중요한 기여를 함.
- 손글씨 숫자를 인식하는 MNIST 데이터셋을 활용한 CNN의 성공적인 적용으로 유명.
- 뉴욕대학교 (NYU) 교수이자, Facebook 인공지능 연구부 (FAIR)의 연구원이기도 함.
인공지능 파벌
기호주의자(Symbolist or Symbolic AI):
1
2
3
4
- 기호와 기호 간의 관계에 중점을 둠.
- 추론과 논리를 핵심적인 요소로 간주.
- 수작업으로 시스템에 규칙과 지식을 프로그래밍하여 지능적 행동을 유도.
- 복잡한 지식을 처리하는 데 어려움이 있음.
연결주의자(Connectionist or Connectionist AI):
1
2
3
4
- 뉴런과 신경망을 모방한 인공 신경망 활용.
- 데이터와 패턴을 학습하여 시스템이 스스로 지능적 행동을 개발하도록 함.
- 신경망을 통한 특징 추출, 패턴 학습, 문제 해결에 초점.
- 대량의 데이터와 학습이 필요하며 복잡한 문제에 강점을 보임.
sparse_categorical_crossentropy
categorical_crossentropy
: skit-learn의'log-loss'
와sparse
: 원핫-인코딩
batch_size: (dafault: 32)
- 의미: 32번의 평균을 구해서 가중치를 수정
07-2 신층 신경망
2개의 층
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import tensorflow as tf
tf.keras.utils.set_random_seed(42)
tf.config.experimental.enable_op_determinism()
from tensorflow import keras
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
from sklearn.model_selection import train_test_split
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)
train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size=0.2, random_state=42)
dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))
dense2 = keras.layers.Dense(10, activation='softmax')
심층 신경망 만들기
1
2
3
model = keras.Sequential([dense1, dense2])
model.summary()
층을 추가하는 다른 방법
1
2
3
4
5
6
model = keras.Sequential([
keras.layers.Dense(100, activation='sigmoid', input_shape=(784,), name='hidden'),
keras.layers.Dense(10, activation='softmax', name='output')
], name='패션 MNIST 모델')
model.summary()
1
2
3
4
5
model = keras.Sequential()
model.add(keras.layers.Dense(100, activation='sigmoid', input_shape=(784,)))
model.add(keras.layers.Dense(10, activation='softmax'))
model.summary()
1
2
3
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=5)
렐루 활성화 함수
1
2
3
4
5
6
model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28, 28)))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))
model.summary()
1
2
3
4
5
6
7
8
9
10
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
train_scaled = train_input / 255.0
train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size=0.2, random_state=42)
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=5)
1
model.evaluate(val_scaled, val_target) # [0.3683287501335144, 0.8725833296775818]
옵티마이저
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics='accuracy')
sgd = keras.optimizers.SGD()
model.compile(optimizer=sgd, loss='sparse_categorical_crossentropy', metrics='accuracy')
sgd = keras.optimizers.SGD(learning_rate=0.1)
sgd = keras.optimizers.SGD(momentum=0.9, nesterov=True)
adagrad = keras.optimizers.Adagrad()
model.compile(optimizer=adagrad, loss='sparse_categorical_crossentropy', metrics='accuracy')
rmsprop = keras.optimizers.RMSprop()
model.compile(optimizer=rmsprop, loss='sparse_categorical_crossentropy', metrics='accuracy')
model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28, 28)))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=5)
1
2
model.evaluate(val_scaled, val_target)
정리
Activation
- 히든 레이어의 activation은 성능에는 영향을 주지만 다 들어갈 수 있다
- 출력 레이어의 activation은 원하는 출력에 따라 정해야한다
딥러닝의 히든 레이어에는 비선형 activation을 써야한다: 선형을 쓸 순 있지만 의미가없음
시그모이드함수는 3번 이상 쓰이면 효과가 없어짐
Relu: 가장 흔히 쓰이는 hidden layer의 activation 함수
Ricky: Relu의 업그레이드
Flatten Layer: 2차원 데이터를 1차원 데이터로 바꿔준다(reshape으로 했었음)
옵티마이저:
- Adam, RMSprop를 많이 씀
local minima, global minima
auto-ml: 옵티마이징 과정, 하이퍼-파라미터 튜닝 등 과정을 자동화 하려는 학문
07-3 신경망 모델 훈련
신경망 모델 훈련
1
2
3
4
5
# 실행마다 동일한 결과를 얻기 위해 케라스에 랜덤 시드를 사용하고 텐서플로 연산을 결정적으로 만듭니다.
import tensorflow as tf
tf.keras.utils.set_random_seed(42)
tf.config.experimental.enable_op_determinism()
손실 곡선
1
2
3
4
5
6
7
8
9
10
from tensorflow import keras
from sklearn.model_selection import train_test_split
(train_input, train_target), (test_input, test_target) = \
keras.datasets.fashion_mnist.load_data()
train_scaled = train_input / 255.0
train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size=0.2, random_state=42)
1
2
3
4
5
6
7
8
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 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4422102/4422102 [==============================] - 1s 0us/step
1
2
3
4
5
6
7
8
def model_fn(a_layer=None):
model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28, 28)))
model.add(keras.layers.Dense(100, activation='relu'))
if a_layer:
model.add(a_layer)
model.add(keras.layers.Dense(10, activation='softmax'))
return model
1
2
3
model = model_fn()
model.summary()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 784) 0
dense (Dense) (None, 100) 78500
dense_1 (Dense) (None, 10) 1010
=================================================================
Total params: 79,510
Trainable params: 79,510
Non-trainable params: 0
_________________________________________________________________
1
2
3
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
history = model.fit(train_scaled, train_target, epochs=5, verbose=0)
1
print(history.history.keys())
1
dict_keys(['loss', 'accuracy'])
1
2
3
4
5
6
import matplotlib.pyplot as plt
plt.plot(history.history['loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
1
2
3
4
plt.plot(history.history['accuracy'])
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.show()
1
2
3
4
model = model_fn()
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
history = model.fit(train_scaled, train_target, epochs=20, verbose=0)
1
2
3
4
plt.plot(history.history['loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
검증 손실
1
2
3
4
5
model = model_fn()
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
history = model.fit(train_scaled, train_target, epochs=20, verbose=0,
validation_data=(val_scaled, val_target))
1
print(history.history.keys())
1
dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])
1
2
3
4
5
6
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
1
2
3
4
5
6
model = model_fn()
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
metrics='accuracy')
history = model.fit(train_scaled, train_target, epochs=20, verbose=0,
validation_data=(val_scaled, val_target))
1
2
3
4
5
6
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
드롭아웃
1
2
3
model = model_fn(keras.layers.Dropout(0.3))
model.summary()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Model: "sequential_4"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_4 (Flatten) (None, 784) 0
dense_8 (Dense) (None, 100) 78500
dropout (Dropout) (None, 100) 0
dense_9 (Dense) (None, 10) 1010
=================================================================
Total params: 79,510
Trainable params: 79,510
Non-trainable params: 0
_________________________________________________________________
1
2
3
4
5
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
metrics='accuracy')
history = model.fit(train_scaled, train_target, epochs=20, verbose=0,
validation_data=(val_scaled, val_target))
1
2
3
4
5
6
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
모델 저장과 복원
1
2
3
4
5
6
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
metrics='accuracy')
history = model.fit(train_scaled, train_target, epochs=10, verbose=0,
validation_data=(val_scaled, val_target))
1
model.save_weights('model-weights.h5')
1
model.save('model-whole.h5')
1
!ls -al *.h5
1
2
-rw-r--r-- 1 root root 333320 Jul 14 08:12 model-weights.h5
-rw-r--r-- 1 root root 981176 Jul 14 08:12 model-whole.h5
1
2
3
model = model_fn(keras.layers.Dropout(0.3))
model.load_weights('model-weights.h5')
1
2
3
4
import numpy as np
val_labels = np.argmax(model.predict(val_scaled), axis=-1)
print(np.mean(val_labels == val_target))
1
2
375/375 [==============================] - 1s 1ms/step
0.8775
1
2
3
model = keras.models.load_model('model-whole.h5')
model.evaluate(val_scaled, val_target)
1
2
3
4
375/375 [==============================] - 1s 3ms/step - loss: 0.3388 - accuracy: 0.8775
[0.3387581408023834, 0.8774999976158142]
콜백
1
2
3
4
5
6
7
8
9
10
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.h5',
save_best_only=True)
model.fit(train_scaled, train_target, epochs=20, verbose=0,
validation_data=(val_scaled, val_target),
callbacks=[checkpoint_cb])
1
<keras.callbacks.History at 0x7883a41d8f40>
1
2
3
model = keras.models.load_model('best-model.h5')
model.evaluate(val_scaled, val_target)
1
2
3
375/375 [==============================] - 1s 3ms/step - loss: 0.3201 - accuracy: 0.8841
[0.3201218545436859, 0.8840833306312561]
1
2
3
4
5
6
7
8
9
10
11
12
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-model.h5',
save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2,
restore_best_weights=True)
history = model.fit(train_scaled, train_target, epochs=20, verbose=0,
validation_data=(val_scaled, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])
1
print(early_stopping_cb.stopped_epoch)
1
7
1
2
3
4
5
6
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
1
model.evaluate(val_scaled, val_target)
1
2
3
375/375 [==============================] - 1s 2ms/step - loss: 0.3307 - accuracy: 0.8768
[0.33070704340934753, 0.8768333196640015]
Layer:
- dropout
- 출력 network중 일부를 날려버림
- dense
- flatten
- reshape
pre-trained model: 대기업에서 멋지게 만들어놓고 공유하는 모델