이미지를 분류하는 모델을 훈련 시키려고합니다. 내가 가진 문제는 크기가 다르다는 것입니다. 내 이미지 / 또는 모델 아키텍처를 어떻게 포맷해야합니까?
답변
당신은 당신이 말하는 아키텍처를 말하지 않았습니다. 이미지를 분류하고 싶다고 하셨기 때문에 AlexNet, GoogLeNet 등과 같이 부분적으로 컨볼 루션이고 부분적으로 완전히 연결된 네트워크라고 가정합니다. 일반적으로 질문에 대한 답변은 작업중인 네트워크 유형에 따라 다릅니다.
예를 들어 네트워크에 컨볼 루션 단위 만 포함 된 경우 (즉, 완전히 연결된 레이어가 포함되지 않은 경우) 입력 이미지의 크기에 불변 할 수 있습니다. 이러한 네트워크 는 입력 이미지를 처리하고 차례로 다른 이미지를 반환 할 수 있습니다 ( “전체적으로 컨볼 루션”). 물론 어떤 식 으로든 손실을 결정해야하므로 출력이 예상 한 것과 일치하는지 확인해야합니다.
하지만 완전히 연결된 장치를 사용하는 경우 문제가 있습니다. 여기에는 네트워크에서 작업해야하는 학습 된 가중치 수가 고정되어 있으므로 다양한 입력에 다양한 가중치가 필요하며 이는 불가능합니다.
이것이 문제인 경우 수행 할 수있는 작업은 다음과 같습니다.
- 이미지를 찌그러 뜨리는 것에 신경 쓰지 마십시오. 네트워크는 어쨌든 콘텐츠를 이해하는 법을 배울 수 있습니다. 규모와 관점이 콘텐츠에 어떤 의미가 있습니까?
- 이미지를 특정 크기로 가운데 자릅니다. 데이터 손실이 우려되는 경우 여러 번 자르고이를 사용하여 입력 데이터를 늘리면 원본 이미지가
N
올바른 크기의 다른 이미지 로 분할됩니다 . - 단색으로 이미지를 정사각형 크기로 채운 다음 크기를 조정합니다.
- 그것의 조합을하십시오.
패딩 옵션은 네트워크가 이러한 패딩 테두리를 포함하는 이미지로 편향 될 수 있기 때문에 (읽을 가능성이 높을 것입니다) 네트워크의 예측에 추가 오류 소스를 도입 할 수 있습니다. 아이디어가 필요한 경우 TensorFlow 문서 의 이미지 섹션을 살펴보면 resize_image_with_crop_or_pad
더 큰 작업을 제거하는 것과 같은 부분이 있습니다.
스 쿼싱에 대해 신경 쓰지 마세요. 여기 유명한 Inception 네트워크의 전처리 파이프 라인이 있습니다.
# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.
# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
distorted_image,
lambda x, method: tf.image.resize_images(x, [height, width], method=method),
num_cases=num_resize_cases)
그들은 그것을 완전히 알고 있고 어쨌든 그것을합니다.
얼마나 멀리 가고 싶거나 필요한지에 따라 실제로 시각적 인식을위한 Deep Convolution Networks의 Spatial Pyramid Pooling 이라는 논문이 있습니다. 아주 특별한 방식으로 처리하여 임의의 크기의 손잡이 입력이.
답변
공간 피라미드 풀링 레이어를 만들어보십시오. 그런 다음 FC 레이어가 항상 일정한 차원의 벡터를 입력으로 얻도록 마지막 회선 레이어 뒤에 놓습니다. 훈련하는 동안 한 시대에 특정 이미지 크기를 사용하여 전체 데이터 세트에서 이미지를 훈련합니다. 그런 다음 다음 시대를 위해 다른 이미지 크기로 전환하고 훈련을 계속합니다.