드디어 과제 1의 마지막 문제이다. 전에 구현했던 것들을 그대로 가져와서 적용하는 문제들이라 시간이 많이 걸리진 않았다. 이전 문제들과 다른 건 raw image pixel들 대신에 HOG(Histogram of Oriented Gradient)와 HSV 추출을 사용한다. 간단히 설명하자면, HOG는 이미지의 gradient에 대한 정보를 가지고 있고, HSV는 RBG로 표현되어 있던 이미지를 Hue(색),Saturation (채도) Value (명도)를 이용한다. 우리의 실습에서는 색인 Hue 정보만 이용한다.
이 문제에서 내가 어려웠던 부분은 아래 코드이다.
from cs231n.classifiers.fc_net import TwoLayerNet
from cs231n.solver import Solver
input_dim = X_train_feats.shape[1]
hidden_dim = 500
num_classes = 10
data = {
'X_train': X_train_feats,
'y_train': y_train,
'X_val': X_val_feats,
'y_val': y_val,
'X_test': X_test_feats,
'y_test': y_test,
}
net = TwoLayerNet(input_dim, hidden_dim, num_classes)
best_net = None
best_accuracy=-1
################################################################################
# TODO: Train a two-layer neural network on image features. You may want to #
# cross-validate various parameters as in previous sections. Store your best #
# model in the best_net variable. #
################################################################################
# *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
learning_rates = [1, 0.1,1e-2]
regularization_strengths = [0., 0.1]
for lr in learning_rates:
for reg in regularization_strengths:
net = TwoLayerNet(input_dim, hidden_dim, num_classes, reg = reg)
solver = Solver(net,data,optim_config={'learning_rate': lr}, num_epochs = 10, verbose = False)
solver.train()
accuracy = solver.check_accuracy(data['X_val'],data['y_val'])
print('learning rate:', lr, 'regularization strength:', reg, 'val accuracy:', accuracy)
if accuracy > best_accuracy:
best_accuracy = accuracy
best_net = net
print('best accuracy:', best_accuracy)
# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
이전 과제를 하면서 모델을 훈련시켰던 learning rate와 regularization array의 값들을 그대로 사용했더니 정확도가 너무 낮게 나왔다. 대부분 0.1 수준에서 높아져 봐야 0.2 수준이었다. 문제에서 적어도 55% 정도의 정확도가 나와야 한다고 했기 때문에 뭔가 잘못되었다는 것을 느꼈다. 이전에 overfitting을 방지하기 위해 regularization strength 값을 좀 크게 설정해 놓았었다. 그런데 정확도가 0.2 수준이라면 overfitting을 걱정할 때는 아니다. regularization strength를 낮추고, learning rate도 조금 수정했더니 정확도가 원하는 수준으로 올라가는 것을 볼 수 있었다.