MLP와 CNN 복습
Fashion MNIST로 MLP, 다항 분류, 정칙화, CNN, 이미지 로딩, 데이터 증강을 복습
실습 안내
- 새 Colab 환경에서 문제를 순서대로 풀이
- 실습 문항의 질문 본문과 힌트에 있는 코드를 직접 입력하고 실행
- 앞 문항에서 실행한 코드와 변수를 다음 문항에서 이어서 사용
- 수치형 문항은 실행 결과를 지정된 자릿수까지 입력
첫 셀에 다음 코드를 입력하여 실습 환경과 데이터를 준비합니다.
import os
os.environ["KERAS_BACKEND"] = "torch"
import keras
import numpy as np
keras.utils.set_random_seed(812)
(x_train, y_train), (x_test, y_test) = (
keras.datasets.fashion_mnist.load_data()
)
x_train.shape, y_train.shape, x_test.shape, y_test.shape
퀴즈
XOR 문제를 단층 신경망보다 다층 퍼셉트론(MLP)으로 해결하기 적합한 이유는 무엇입니까?
- ○XOR은 하나의 직선으로 분리할 수 없고 은닉층이 비선형 결정 경계를 만들 수 있기 때문이다
- ○XOR은 출력 클래스가 하나이므로 은닉층의 모든 뉴런을 제거할 수 있기 때문이다
- ○XOR은 입력값을 정렬하기만 하면 항상 하나의 직선으로 분리되기 때문이다
- ○XOR은 손실 함수 없이도 출력층의 가중치를 직접 계산할 수 있기 때문이다
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.
XOR 문제를 단층 신경망보다 다층 퍼셉트론(MLP)으로 해결하기 적합한 이유는 무엇입니까?
두 클래스의 배치를 하나의 직선으로 나눌 수 있는지 생각하세요.
다층신경망의 역전파에 대한 설명으로 가장 알맞은 것은 무엇입니까?
손실의 변화가 마지막 레이어부터 앞쪽 레이어의 파라미터까지 어떻게 전달되는지 생각하세요.
사라지는 경사란 어떤 현상입니까?
0과 1 사이의 작은 값이 여러 번 곱해질 때 결과의 크기를 생각하세요.
은닉층에 비선형 활성화 함수를 넣지 않고 선형 레이어만 여러 개 쌓으면 모형의 표현력은 어떻게 됩니까?
행렬 곱과 덧셈의 결과를 다시 행렬 곱과 덧셈에 넣으면 어떤 형태로 정리되는지 생각하세요.
은닉층의 활성화 함수로 sigmoid 대신 ReLU를 주로 사용하는 이유로 올바른 것을 모두 고르세요.
포화 구간의 기울기 크기와, ReLU의 양수 구간·음수 구간 기울기를 각각 떠올리세요. 음수 영역에 작은 기울기를 두는 것은 Leaky ReLU입니다.
다음 코드를 새 셀에 직접 입력하고 실행해 mlp_model을 정의하세요. 코드의 레이어 역할에 대한 설명으로 올바른 것을 모두 고르세요.
keras.utils.set_random_seed(812)
mlp_model = keras.models.Sequential([
keras.Input(shape=(28, 28)),
keras.layers.Rescaling(1/255),
keras.layers.Flatten(),
keras.layers.Dense(64, activation="relu"),
keras.layers.Dense(10),
])
입력값 조정, 형태 변환, 비선형 특징 학습, 로짓 출력의 순서로 각 레이어의 역할을 구분하세요.
Rescaling(1/255)는 픽셀값을 0~1 범위로 바꾼다Flatten()은 28×28 이미지를 1차원 벡터로 펼친다Dense(64, activation="relu")는 비선형 특징을 학습하는 은닉층이다마지막 Dense(10)은 합이 1인 확률을 직접 출력한다Rescaling(1/255)는 픽셀값을 0~1 범위로 바꾼다, Flatten()은 28×28 이미지를 1차원 벡터로 펼친다, Dense(64, activation="relu")는 비선형 특징을 학습하는 은닉층이다정수 클래스 번호를 레이블로 사용하고 출력층이 로짓 10개를 출력할 때 알맞은 손실 함수는 무엇입니까?
정수 클래스 번호에는 희소 범주형 손실을 사용합니다. 출력층의 값이 정규화되지 않은 로짓이라는 점도 함께 고려하세요.
SparseCategoricalCrossentropy(from_logits=True)SparseCategoricalCrossentropy(from_logits=False)BinaryCrossentropy(from_logits=False)MeanSquaredError()SparseCategoricalCrossentropy(from_logits=True)다음 코드를 새 셀에 직접 입력하고 실행해 MLP를 컴파일하고 학습하세요. 이 코드에서 validation_split=0.2의 의미는 무엇입니까?
mlp_model.compile(
optimizer=keras.optimizers.SGD(learning_rate=0.001),
loss=keras.losses.SparseCategoricalCrossentropy(
from_logits=True
),
metrics=["accuracy"],
)
mlp_history = mlp_model.fit(
x_train,
y_train,
epochs=5,
batch_size=64,
validation_split=0.2,
)
검증용으로 분리된 같은 데이터에서 매 에포크 지표를 계산하며, 이 데이터는 가중치 업데이트에 사용하지 않습니다.
다항 분류의 소프트맥스에 대한 설명으로 올바른 것을 모두 고르세요.
서로 배타적인 클래스 중 하나를 고르는 상황에서 확률 전체가 어떻게 분배되는지 생각하세요.
mlp_model의 테스트 정확도를 소수점 둘째 자리까지 입력하세요.
다음 코드를 실행해 학습에 사용하지 않은 테스트 데이터의 정확도를 확인하세요.
mlp_test_loss, mlp_test_accuracy = mlp_model.evaluate(
x_test, y_test, verbose=0
)
mlp_test_accuracy
클래스별 예측에서 가장 확률이 높은 클래스 번호를 고르는 연산은 무엇입니까?
최댓값 자체가 아니라 최댓값이 있는 위치, 즉 인덱스를 반환하는 연산을 찾으세요.
argmax()sum()mean()sort()argmax()mlp_model이 x_test의 0번째 테스트 이미지에 대해 예측한 클래스 번호를 입력하세요.
다음 코드를 실행해 첫 번째 테스트 이미지의 로짓이 가장 큰 클래스 번호를 구하세요.
mlp_logits = mlp_model.predict(x_test)
np.argmax(mlp_logits[0])
정칙화 방법과 역할의 연결로 올바른 것을 모두 고르세요.
각 방법이 가중치, 훈련 시간, 뉴런 출력, 목표 레이블 중 무엇을 조정하는지 구분하세요.
다음 코드를 새 셀에 직접 입력하고 실행해 regularized_model을 정의하세요. 이 모델에서 Dropout(0.5)의 역할은 무엇입니까?
keras.utils.set_random_seed(812)
regularized_model = keras.models.Sequential([
keras.Input(shape=(28, 28)),
keras.layers.Rescaling(1/255),
keras.layers.Flatten(),
keras.layers.Dense(128, activation="relu"),
keras.layers.Dropout(0.5),
keras.layers.Dense(10),
])
드롭아웃 비율은 훈련할 때 무작위로 제외하는 은닉층 출력의 비율입니다.
다음 코드를 새 셀에 직접 입력하고 실행해 가중치 감쇠와 얼리 스토핑을 적용하세요. 얼리 스토핑의 효과를 확인하기 위해 학습률을 0.1로 높였습니다. EarlyStopping(monitor="val_loss", patience=1)의 동작으로 알맞은 것은 무엇입니까?
regularized_model.compile(
optimizer=keras.optimizers.SGD(
learning_rate=0.1, weight_decay=0.0001
),
loss=keras.losses.SparseCategoricalCrossentropy(
from_logits=True
),
metrics=["accuracy"],
)
early_stopping = keras.callbacks.EarlyStopping(
monitor="val_loss",
patience=1,
)
regularized_model.fit(
x_train,
y_train,
epochs=20,
batch_size=64,
validation_split=0.2,
callbacks=[early_stopping],
)
monitor는 지켜볼 지표이고, patience는 그 지표가 개선되지 않아도 추가로 기다릴 에포크 수입니다.
regularized_model의 테스트 정확도를 소수점 둘째 자리까지 입력하세요.
다음 코드를 실행해 훈련이 끝난 모델을 테스트 데이터로 평가하세요.
regularized_test_loss, regularized_test_accuracy = (
regularized_model.evaluate(
x_test, y_test, verbose=0
)
)
regularized_test_accuracy
이미지 분류에서 MLP보다 CNN이 공간적 특징을 다루기 좋은 이유는 무엇입니까?
필터가 한 번에 이미지 전체가 아니라 작은 영역을 보며 같은 가중치를 반복 사용하는 점을 떠올리세요.
합성곱 신경망의 구성 요소에 대한 설명으로 올바른 것을 모두 고르세요.
합성곱 출력, 다운샘플링, 테두리 처리, 필터 이동 간격의 역할을 각각 구분하세요.
padding="same"은 스트라이드가 1일 때 합성곱 전후 공간 크기를 유지하는 데 사용한다스트라이드가 커질수록 필터가 더 촘촘하게 이동하여 출력 공간 크기가 커진다padding="same"은 스트라이드가 1일 때 합성곱 전후 공간 크기를 유지하는 데 사용한다다음 코드를 새 셀에 직접 입력하고 실행해 cnn_model을 정의하고 컴파일하세요. 합성곱과 풀링으로 추출한 특징을 최종 분류용 Dense 레이어에 전달하기 전에 사용하는 레이어는 무엇입니까?
keras.utils.set_random_seed(812)
cnn_model = keras.models.Sequential([
keras.Input(shape=(28, 28, 1)),
keras.layers.Rescaling(1/255),
keras.layers.Conv2D(
32, (3, 3), padding="same", activation="relu"
),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Conv2D(
64, (3, 3), activation="relu"
),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Flatten(),
keras.layers.Dense(10),
])
cnn_model.compile(
optimizer=keras.optimizers.SGD(learning_rate=0.001),
loss=keras.losses.SparseCategoricalCrossentropy(
from_logits=True
),
metrics=["accuracy"],
)
합성곱 출력은 높이·너비·채널의 공간 구조를 가지므로 Dense 레이어 전에 1차원으로 펼쳐야 합니다.
Flatten()Rescaling(1/255)MaxPooling2D((2, 2))Conv2D(64, (3, 3))Flatten()다음 코드를 새 셀에 직접 입력하고 실행해 채널 차원을 추가하고 CNN을 학습하세요. Fashion MNIST 배열에 np.expand_dims(x_train, axis=-1)을 적용하는 이유는 무엇입니까?
x_train_cnn = np.expand_dims(x_train, axis=-1)
x_test_cnn = np.expand_dims(x_test, axis=-1)
cnn_history = cnn_model.fit(
x_train_cnn,
y_train,
epochs=5,
batch_size=64,
validation_split=0.2,
)
Keras의 기본 Conv2D 입력은 (배치, 높이, 너비, 채널) 형태입니다. 현재 배열에 없는 차원이 무엇인지 확인하세요.
28×28 입력에 padding="same"인 합성곱을 적용한 뒤 2×2 최대 풀링을 통과하면 피처 맵의 공간 크기는 얼마입니까?
세임 패딩은 합성곱 전후 크기를 유지하고, 2×2 최대 풀링은 가로와 세로 크기를 각각 절반으로 줄입니다.
cnn_model의 테스트 정확도를 소수점 둘째 자리까지 입력하세요.
다음 코드를 실행해 CNN의 테스트 정확도를 확인하세요.
cnn_test_loss, cnn_test_accuracy = cnn_model.evaluate(
x_test_cnn, y_test, verbose=0
)
cnn_test_accuracy
torchvision.datasets.ImageFolder가 이미지의 클래스 레이블을 정하는 기준은 무엇입니까?
클래스별로 폴더를 나누는 데이터셋 구조에서 어떤 정보가 레이블 역할을 하는지 생각하세요.
ToTensor()로 변환한 PyTorch 텐서를 Keras 모델에 입력할 때 Conv2D에 data_format="channels_first"를 지정하는 이유는 무엇입니까?
Fashion MNIST에서는 np.expand_dims(x_train, axis=-1)로 채널을 맨 뒤에 붙였습니다. ToTensor()가 만드는 텐서의 축 순서와 비교해 보세요.
데이터 증강을 적용할 때 올바른 원칙을 모두 고르세요.
증강은 데이터의 다양성을 늘리되 정답 레이블의 의미를 바꾸지 않아야 합니다.
여러 이미지 변환 중 하나를 매번 무작위로 선택하려면 어떤 변환을 사용해야 합니까?
후보 목록에서 하나만 선택하는 연산과 변환의 적용 여부나 적용 순서를 무작위화하는 연산을 구분하세요.
transforms.RandomChoicetransforms.RandomApplytransforms.RandomOrdertransforms.CenterCroptransforms.RandomChoice