맞습니다. 가능한 한 나머지 데이터 전체에 무작위로 산재 해있는 증강 샘플을 원할 것입니다. 그렇지 않으면 배치가 제대로 샘플링되지 않고 경사 하강 단계가 너무 편향되어 있기 때문에 언급했듯이 문제가 발생합니다. 나는 주로 Torch와 함께 일하기 때문에 cudaconvnet에 너무 익숙하지 않지만 인위적으로 증강 된 데이터를 사용하는 경우와 동일한 상황에 자주 직면합니다.
가장 좋은 방법은 (c)입니다.
저에게있어 데이터를 늘리는 가장 좋은 장소는 트레이너의 내부 루프에 샘플이로드 될 때입니다. 즉시 임의 왜곡, 뒤집기, 자르기 (또는 샘플을 늘리는 경우)를 바로 적용합니다. 단일 데이터 샘플. 이것이 달성 할 것은 트레이너가 샘플을로드하려고 할 때마다 실제로 이전 반복에서 본 다른 이미지와 다를 수있는 수정 된 버전을 받게된다는 것입니다.
물론 1000x 데이터 크기 요소를 가져 오려면 다른 조정이 필요합니다. 둘 중 하나 :
- 이상적으로는 내부 루프가 첫 번째 세트 처리를 마친 후 에포크 당 더 많은 배치를로드합니다. 증강기를 올바르게 설정하면 모든 배치가 계속해서 무작위 샘플을 가져 오므로 모두 잘 작동합니다. Torch는 이것을 허용하지만 다소 까다 롭고 cudaconvnet에서 똑같이 할 수 있을지 확실하지 않습니다.
- 그렇지 않으면 트레이너를 1000 회 이상의 교육 epoch 동안 실행하십시오. 우아하지는 않지만 최종 결과는 동일합니다. 나중에 실제로 훈련 한 Epoch 수를보고해야하는 경우 실제 개수를 1000으로 다시 나누면 1000 배 증가 된 데이터 세트를 기반으로보다 적절한 추정치를 얻을 수 있습니다.
이렇게하면 증가 된 샘플을 캐시하기 위해 추가 디스크 공간을 사용하지 않고 원본 데이터처럼 데이터 세트 전체에 무작위로 대상 클래스를 항상 배포 할 수 있습니다. 물론 이것은 모든 단계에서 필요에 따라 샘플을 생성 할 것이기 때문에 추가 컴퓨팅 성능의 비용이 들지만 이미 알고 있습니다.
또한 더 중요한 것은 배치가 원래 128 크기로 유지되므로 미니 배치 프로세스는 그대로 유지되고 학습 된 매개 변수 업데이트는 다른 방법으로 예상했던 것과 동일한 빈도로 계속 감소합니다. 트레이너가 "동일한"이미지를 두 번 볼 수 없기 때문에이 동일한 프로세스는 SGD 교육 (배치 크기 = 1)에도 적합합니다.
도움이되기를 바랍니다.
출처
https://stackoverflow.com/questions/22050186