신경망 사용 Pt.3

5153 단어
지난 주 블로그 이후에 저는 우리가 만든 신경망을 계속 훈련시켰는데, 그때 제 모델이 훈련 데이터에서 1의 정확도를 실행하고 있지만 검증 데이터에서는 .8 정도밖에 되지 않는다는 것을 깨달았습니다. 이것은 내 모델이 내 데이터를 과대적합하기 시작했다는 것을 말해주기 때문에 아래와 같이 속도를 높이는 데 도움이 되는 추가 배치 정규화와 함께 내 네트워크에 드롭아웃 레이어를 몇 개 더 추가하기로 결정했습니다. 또한 모델이 모든 epoch 실행을 마친 후 훈련을 계속하려면 "history"가 포함된 셀을 다시 실행하면 마지막 epoch 이후에 또 다른 세트가 계속됩니다.

model.add(Conv2D(16, kernel_size = (3, 3), activation='relu', input_shape=(image_size, image_size, 3)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())

model.add(Conv2D(32, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())

model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())
model.add(Dropout(0.2))

model.add(Conv2D(168, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())
model.add(Dropout(0.2))

model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.6))

model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.4))

model.add(Dense(64, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))

model.add(Dense(1, activation = 'sigmoid'))


새 하이퍼파라미터



이제 모델을 저장했으므로 모델 학습 시간을 크게 절약할 수 있는 몇 가지 멋진 하이퍼파라미터를 보여드리겠습니다. 콜백 EarlyStopping 및 Model Checkpoint가 됩니다.

from keras.callbacks import EarlyStopping, ModelCheckpoint


조기 중지를 사용하면 모델이 과적합되기 시작하거나 개선이 중지될 때 모델이 자체적으로 중지됩니다. restore_best_weights를 true로 설정하면 에포크가 끝나기 전에 가장 잘 수행되었던 가중치로 모델을 반환합니다. 그런 다음 마지막으로 인내 설정을 설정하여 모델이 중지되기 전에 모델이 더 나은 가중치를 찾기 위해 시도할 에포크 수에 대한 허용 오차를 설정할 수도 있습니다. 따라서 전반적으로 Early Stopping을 사용하면 모델이 영원히 실행되거나 과적합되는 것에 대해 걱정할 필요 없이 많은 에포크를 실행하도록 모델을 설정할 수 있습니다.

es = EarlyStopping(monitor='val_accuracy', patience=10,
restore_best_weights=True)


다음으로 Model Checkpoint가 있습니다. 이 기능은 교육 진행 상황을 저장하는 데 사용됩니다. 마지막에 그냥 저장하는 대신 모델이 실행되는 동안 저장한다는 점을 제외하면 지난 블로그에서 사용한 model.save와 매우 유사합니다. 또한 Early Stopping의 restore_best_weights와 유사하게 Model Checkpoint에는 성능이 더 좋은 모델을 덮어쓰지 않도록 하는 save_best_only라는 기능이 있습니다.

checkpoint_cb = ModelCheckpoint("pneu_model2.h5",
save_best_only=True)


따라서 이 두 가지 기능 사이에서 많은 에포크로 모델을 실행할 수 있으며, 저장된 모델이 없을 때 최상의 모델을 저장하거나, 과대적합되거나, 심지어 더 나쁜 경우 컴퓨터가 다운되는 것에 대한 두려움을 덜 수 있습니다.

*저장된 모델을 사용하여 로드할 수 있습니다model = load_model('pneu_model2.h5').

epochs = 50
steps_per_epoch = train_generator.n // batch_size
validation_steps = test_generator.n // batch_size
es = EarlyStopping(monitor='val_accuracy', patience=10, restore_best_weights=True)
checkpoint_cb = ModelCheckpoint("pneu_model2.h5",
                                                    save_best_only=True)
cb_list = [es,checkpoint_cb]
history = model.fit(train_generator,
                              steps_per_epoch=steps_per_epoch,
                              epochs=epochs,
                              validation_data=test_generator,
                              validation_steps=validation_steps,
                              class_weight=class_weight,
                              callbacks=cb_list)




모델 평가



교육 데이터에 대한 메트릭을 테스트하는 것은 Keras를 사용하면 매우 간단합니다. 액세스하려는 메트릭을 선택하고 다음과 같이 호출하기만 하면 됩니다. loss, acc, rec = model.evaluate(test_generator) .

그 다음에는 보통 내 모델이 어떻게 작동하는지 시각적으로 확인할 수 있도록 작은 혼란 행렬을 만드는 것을 즐깁니다. 이를 수행하는 가장 쉬운 방법은 모든 예측 목록을 만들고 모두 0 또는 1로 반올림하는 것입니다. 왜냐하면 신경망은 실제로 일종의 신뢰 구간을 생성하여 작동하기 때문입니다. 그런 다음 Sklearns 메트릭 패키지를 통해 혼동_매트릭스를 사용합니다.

predictions = []
for x in model.predict(test_generator):
    for z in x:
        predictions.append(np.round(z))

metrics.confusion_matrix(test_generator.classes,predictions)




결론



높은 회상 점수를 받으려는 우리의 목표와 함께 우리는 0.98의 점수로 매우 잘한 것처럼 보입니다. 즉, 폐렴에 걸린 사람을 건강하다고 진단할 가능성이 매우 낮습니다. 우리는 이것에 대해 잘했지만 .86의 전반적인 정확도는 약간의 개선이 필요할 수 있으며 이를 수행하는 가장 좋은 방법은 일반적으로 더 많은 이미지, 특히 건강한 사람들의 이미지를 더 많이 수집하는 것이라고 생각합니다. 이런 식으로 우리의 신경망은 작업할 더 균형 잡힌 데이터를 갖게 됩니다. 이 튜토리얼에서는 이 모델이 마음에 들지만 일부 레이어를 변경 및 추가하고 결과를 확인하는 것이 좋습니다.

이 자습서에서는 테스트 데이터를 유효성 검사 데이터로 사용했지만 일반적으로 이것은 사용해야 하는 데이터가 아닙니다. 이 블로그의 요점이 신경망 설정 방법을 보여주기 때문에 이렇게 했습니다. 그러나 직접 생성하는 경우 train_test 분할을 사용하여 훈련 데이터에서 검증 세트를 생성하는 것이 가장 좋습니다.

좋은 웹페이지 즐겨찾기