신경망 사용 Pt.2

3745 단어

소개



지난 주 블로그에서 우리는 데이터 세트를 다운로드하고 데이터에 대한 이해를 찾아 사용하려는 메트릭을 결정하고 신경망에서 사용할 수 있도록 이미지를 설정했습니다. 그래서 오늘 저는 계속해서 Neural Net 자체의 설정을 검토하고 직접 시도하는 경우 실행하는 데 영원히 걸리지 않을 만큼 정확하고 효율적인 모델을 준비하기 위해 최선을 다할 것입니다.

배치 및 에포크



이전 블로그의 "이미지 준비"섹션에서 이미지에 수행하는 모든 변환에 대해 이야기했지만 값을 할당한 또 다른 중요한 기능인 batch_size에 대해서는 언급하지 않았습니다. 배치 크기는 한 번에 모델에 맞추는 이미지(이 경우)의 수를 제어합니다. 배치가 모델에 맞을 때마다 신경망은 각 노드에서 가중치를 조정하고 다음 배치를 실행합니다. 모든 배치의 완료를 Epoch라고 하며 모델이 Epoch를 완료하면 이미지를 새 배치로 다시 섞고 다음 Epoch를 시작합니다. 지금 이 문제를 제기하는 이유는 이전에 실수로 배치 크기를 8로 설정했기 때문입니다. 이렇게 하면 더 적은 Epoch에서 더 나은 결과를 얻을 수 있고 각각을 실행하는 데 많은 시간이 걸립니다. 따라서 batch_size를 64로 조정하겠습니다.

네트워크 구축



우리 모델의 경우 dense, convolutional, batch normalization 및 dropout layer와 같은 몇 가지 다른 레이어 유형을 사용할 것입니다.

Dense 레이어는 Keras 설명에서 "정규적으로 densely-connected NN layer"라고 말하듯이 신경망에서 가장 일반적인 레이어입니다. Dense Layers는 입력 텐서의 내적과 모델에 포함된 가중치 커널을 취하여 기능 간의 연관성을 찾습니다.

컨벌루션 레이어는 이미지의 픽셀을 통과하고 주변 픽셀과 비교하여 이미지의 패턴을 찾습니다.

배치 정규화는 내가 이해하지 못하는 레이어 중 하나이지만 입력 레이어를 다시 중심에 놓고 크기를 조정하여 신경망 속도를 높인다는 것은 알고 있습니다.

그런 다음 마지막으로 소리가 나는 것과 정확히 일치하는 드롭아웃 레이어가 있습니다. 과적합을 방지하기 위해 가중치의 일정 비율을 떨어뜨립니다.

이제 모델을 정의하고 레이어를 추가해 보겠습니다.

model = Sequential()



model.add(Conv2D(32, 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(64, 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(Conv2D(96, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization())
model.add(Dropout(.3))

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

model.add(Flatten())
model.add(Dense(128, activation='relu'))
# model.add(Dropout(0.3))
model.add(Dense(1, activation = 'sigmoid'))


먼저 볼 수 있듯이 다양한 크기의 컨볼루션 레이어를 사용하여 이미지를 살펴보고 어떤 패턴이 보이는지 찾은 다음 이미지를 평평하게 하여 밀도가 높은 레이어를 추가한 다음 마지막 레이어를 추가합니다. 단일 출력이 있으므로 진단을 받을 수 있습니다.

그런 다음 마침내 모델을 함께 컴파일할 수 있습니다.

model.compile(optimizer = 'adam',
              loss='binary_crossentropy',
              metrics=['accuracy',keras.metrics.Recall(name='recall')])


시대 수를 선택하고 모델을 실행합니다.

epochs = 25
steps_per_epoch = train_generator.n // batch_size
validation_steps = test_generator.n // batch_size
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)




이렇게 우리는 적합한 신경망을 갖게 되었습니다!

결론



이제 신경망을 장착했으므로 model.save('pneu_model.h5')를 사용하여 저장한 다음 방금 장착한 모델을 잃지 않고 모델을 계속 변경할 수 있습니다. 다음 주에는 우리가 찾고 있는 정확도와 재현율을 얻고 이 시리즈를 마무리하는 데 도움이 되는 몇 가지 하이퍼파라미터를 추가할 것입니다.

좋은 웹페이지 즐겨찾기