2017-01-28 43 views
15

Próbuję pociągu mój model, który klasyfikuje obrazy. Problem w tym, że mam różne rozmiary. Czy istnieje możliwość szkolenia tych obrazów bez zmiany ich rozmiaru.Jak trenować obrazy, gdy mają inny rozmiar?

+1

Proszę pokazać, co już próbowałem tak daleko i to, co wydaje się być nie działa dla Ciebie. –

+0

I bam tam idzie kod Incepcji v4. Nie zgadzam się z tym komentarzem z półki. Mogłoby być nieco więcej danych wejściowych - na przykład, o jakiej sieci mówimy - ale spadki są w ogóle nieuzasadnione. To jest prawdziwy problem. – sunside

+0

Pytanie brzmi, w jaki sposób ImageNet formatuje swoje dane obrazu, aby były przydatne do treningu? – mskw

Odpowiedz

36

Nie powiedziałeś, o jakiej architekturze mówisz. Ponieważ powiedziałeś, że chcesz klasyfikować obrazy, zakładam, że jest to częściowo splotowa, częściowo w pełni połączona sieć, taka jak AlexNet, GoogLeNet itd. Ogólnie rzecz biorąc, odpowiedź na twoje pytanie zależy od rodzaju sieci, z którą pracujesz.

Jeśli, na przykład, twoja sieć zawiera tylko jednostki splotowe - to znaczy nie zawiera w pełni połączonych warstw - to może być niezmienna do rozmiaru obrazu wejściowego. Taka sieć może przetwarzać obrazy wejściowe, a następnie zwracać inny obraz ("splot cały czas"); musiałbyś się upewnić, że wynik pasuje do tego, czego oczekujesz, ponieważ oczywiście musisz w jakiś sposób określić straty.

Jeśli jednak używasz w pełni połączonych jednostek, masz problem: tutaj masz ustaloną liczbę wyuczonych ciężarów, z którymi twoja sieć musi pracować, więc zmienne nakłady wymagałyby różnej liczby wag - a to nie możliwy.

Jeśli to jest Twój problem, oto kilka rzeczy, które możesz zrobić:

  • nie dbają o zgniecenia obrazów. Sieć może i tak nauczyć się rozumieć treść; czy skala i perspektywa nic nie znaczą dla treści?
  • Wyśrodkuj zdjęcia w określonym rozmiarze. Jeśli obawiasz się, że tracisz dane, wykonaj wiele przycinania i użyj ich do rozszerzenia danych wejściowych, aby oryginalny obraz został podzielony na różne obrazy o prawidłowym rozmiarze.
  • Umieść obrazy w jednolitym kolorze na kwadrat, a następnie zmień rozmiar.
  • Wykonaj połączenie tego.

Opcja dopełnienia może wprowadzić dodatkowe źródło błędu w prognozie sieci, ponieważ sieć może (odczyt: prawdopodobny) będzie obciążona obrazami, które zawierają taką wyściełaną granicę. Jeśli potrzebujesz pomysłów, zajrzyj do sekcji Images dokumentacji TensorFlow, są tam takie elementy, jak resize_image_with_crop_or_pad, które zabierają większą pracę.

chodzi o po prostu nie dbając o zgniecenia, here's kawałek rurociągu przeróbki słynnego sieci Incepcja:

# 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) 

Są całkowicie świadomi i zrobić to tak.

W zależności od tego, jak daleko chcesz lub musisz iść, tam faktycznie jest papier here nazywa Spatial Pyramid Pooling w głębokiej splotu Networks for Visual uznawaniu który obsługuje wejść dowolnych rozmiarach, przetwarzając je w bardzo szczególny sposób.

0

Spróbuj stworzyć warstwę łączącą piramidę przestrzenną. Następnie umieść go po swojej ostatniej warstwie splotu, aby warstwy FC zawsze otrzymywały stałe wektory wymiarowe jako dane wejściowe. Podczas treningu trenuj obrazy z całego zestawu danych, używając określonego rozmiaru obrazu dla jednej epoki. Następnie, aby przejść do następnej epoki, przełącz się na inny rozmiar obrazu i kontynuuj trening.