with tf.device('/device:GPU:0'): # GPU 잡는 법 history = model.fit(train_scaled, train_target, epochs=10, validation_data=(val_scaled, val_target), callbacks=[checkpoint_cb, early_stopping_cb])
[<keras.layers.convolutional.Conv2D at 0x7fe1487e19d0>,
<keras.layers.pooling.MaxPooling2D at 0x7fe1d0495b50>,
<keras.layers.convolutional.Conv2D at 0x7fe148c92590>,
<keras.layers.pooling.MaxPooling2D at 0x7fe1487fa9d0>,
<keras.layers.core.flatten.Flatten at 0x7fe1446bad10>,
<keras.layers.core.dense.Dense at 0x7fe1446ba210>,
<keras.layers.core.dropout.Dropout at 0x7fe14465cf50>,
<keras.layers.core.dense.Dense at 0x7fe14465dcd0>]
for i inrange(2): for j inrange(16): axs[i, j].imshow(conv_weights[:,:,0,i*16 + j], vmin=-0.5, vmax=0.5) # vmin, vmax는 맷플롯립의 컬러맵으로 표현할 범위를 지정 axs[i, j].axis('off')
for i inrange(2): for j inrange(16): axs[i, j].imshow(no_training_weights[:,:,0,i*16 + j], vmin=-0.5, vmax=0.5) # vmin, vmax는 맷플롯립의 컬러맵으로 표현할 범위를 지정 axs[i, j].axis('off')
plt.show()
전체적으로 가중치가 밋밋하게 초기화되었다.
이 그림을 훈련이 끝난 이전 가중치와 비교해보자.
합성곱 신경망이 패현MNIST 데이터셋의 부류 정확도를 높이기 위해 유용한 패턴을 학습했다는 사실을 눈치챌 수 있다.
from tensorflow import keras (train_input, train_target), (test_input, test_target)= keras.datasets.fashion_mnist.load_data() # load.data()함수는 훈련 데이터와 테스트 데이터를 나누어 반환한다.
데이터 확인
훈련 데이터
60,000개 이미지, 이미지 크기는 28x28
타깃은 60,000개 원소가 있는 1차원 배열
1
print(train_input.shape, train_target.shape)
(60000, 28, 28) (60000,)
테스트 세트
10,000개의 이미지로 이루어짐
1
print(test_input.shape, test_target.shape)
(10000, 28, 28) (10000,)
이미지 시각화
1 2 3 4 5 6
import matplotlib.pyplot as plt fig, axs = plt.subplots(1, 10, figsize=(10,10)) for i inrange(10): axs[i].imshow(train_input[i], cmap='gray_r') axs[i].axis('off') plt.show()
타겟 값 리스트
패션 MNIST의 타깃은 0~9까지의 숫자 레이블로 구성된다.
같은 숫자가 나온다면 타깃이 같은 두 샘플은 같은 종류의 옷이다.
1
print([train_target[i] for i inrange(10)])
[9, 0, 0, 3, 0, 2, 7, 2, 5, 5]
실제 타겟값의 값을 확인
각 라벨당 6000개의 이미지 존재 60,000개
즉, 각 의류마다 6,000개의 샘플이 들어있다.
1 2
import numpy as np print(np.unique(train_target, return_counts = True))
Flatten 클래스를 층처럼 입렬층과 은닉층 사잉에 추가하기 때문에 이를 층이라 부른다.
다음 코드처럼 입력층 바로 뒤에 추가한다.
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')) # relu 로 변경 model.add(keras.layers.Dense(10, activation='softmax'))
적응적 학습률을 사용하는 이 3개의 클래스는 learning_rate 매개변수의 기본값을 0.001로 두고 사용한다.
Adam 클래스의 매개변수 기본값을 사용해 패션 MNIST 모델을 훈련해본다.
일단 모델을 다시 생성한다.
1 2 3 4
model = keras.Sequential() model.add(keras.layers.Flatten(input_shape=(28,28))) # 기존 코드 비교 model.add(keras.layers.Dense(100, activation='relu')) # relu 로 변경 model.add(keras.layers.Dense(10, activation='softmax'))
compile() 메서드의 optimizer를 ‘adam’으로 설정하고 5번의 에포크 동안 훈련한다.
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
40960/29515 [=========================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 1s 0us/step
26435584/26421880 [==============================] - 1s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
16384/5148 [===============================================================================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step
4431872/4422102 [==============================] - 0s 0us/step
모델을 만든다.
사용자 정의함수를 작성함
if 구문을 제외하면 7-2의 코드와 동일하다.
if 구문의 역할은 model_fn() 함수에 케라스 층을 추가하면 은닉층 뒤어 또 하나의 층을 추가하는 것이다.
모델 구조를 출력해본다.
1 2 3 4 5 6 7 8 9 10
defmodel_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(100, activation='softmax')) return model model = model_fn() model.summary()
model = model_fn(keras.layers.Dropout(0.3)) # 30% 드롭아웃 model.compile(optimizer = 'adam', loss='sparse_categorical_crossentropy', metrics='accuracy') # adam 추가
history = model.fit(train_scaled, train_target, epochs=20, verbose=0, # 수치 조정 validation_data=(val_scaled, val_target))
defdraw_fruits(arr, ratio=1): n = len(arr) # n은 샘플 개수입니다 # 한 줄에 10개씩 이미지를 그립니다. 샘플 개수를 10으로 나누어 전체 행 개수를 계산합니다. rows = int(np.ceil(n/10)) # 행이 1개 이면 열 개수는 샘플 개수입니다. 그렇지 않으면 10개입니다. cols = n if rows < 2else10 fig, axs = plt.subplots(rows, cols, figsize=(cols*ratio, rows*ratio), squeeze=False) for i inrange(rows): for j inrange(cols): if i*10 + j < n: # n 개까지만 그립니다. axs[i, j].imshow(arr[i*10 + j], cmap='gray_r') axs[i, j].axis('off') plt.show()
from sklearn.decomposition import PCA pca = PCA(n_components = 50)
# PCA 50개 성분으로 300 x 10000 픽셀값을 압축 pca.fit(fruits_2d)
PCA(n_components=50)
PCA 클래스가 찾은 주성분은 components_ 속성에 저장되어 있다.
1
print(pca.components_.shape)
(50, 10000)
그래프 그리기
draw_fuits()함수를 사용해서 이 주성분을 그림으로 그려보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
import matplotlib.pyplot as plt
defdraw_fruits(arr, ratio=1): n = len(arr) # n은 샘플 개수입니다 # 한 줄에 10개씩 이미지를 그립니다. 샘플 개수를 10으로 나누어 전체 행 개수를 계산합니다. rows = int(np.ceil(n/10)) # 행이 1개 이면 열 개수는 샘플 개수입니다. 그렇지 않으면 10개입니다. cols = n if rows < 2else10 fig, axs = plt.subplots(rows, cols, figsize=(cols*ratio, rows*ratio), squeeze=False) for i inrange(rows): for j inrange(cols): if i*10 + j < n: # n 개까지만 그립니다. axs[i, j].imshow(arr[i*10 + j], cmap='gray_r') axs[i, j].axis('off') plt.show()
0.9933333333333334
0.051814031600952146
/usr/local/lib/python3.7/dist-packages/sklearn/linear_model/_logistic.py:818: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG,
/usr/local/lib/python3.7/dist-packages/sklearn/linear_model/_logistic.py:818: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG,
/usr/local/lib/python3.7/dist-packages/sklearn/linear_model/_logistic.py:818: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG,
차원 축소된 데이터를 k-평균 알고리즘에 추가한다.
1 2 3 4
from sklearn.cluster import KMeans km = KMeans(n_clusters=3, random_state=42) km.fit(fruits_pca) print(np.unique(km.labels_, return_counts = True))
# 가지치기 때와 달리 train_scaled를 사용하지 않았다. 표준화 전처리 할 필요가 없기 때문인 듯. dt.fit(train_input, train_target) print(dt.score(train_input, train_target)) print(dt.score(train_input, train_target))