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?
Odpowiedz
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.
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.
Proszę pokazać, co już próbowałem tak daleko i to, co wydaje się być nie działa dla Ciebie. –
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
Pytanie brzmi, w jaki sposób ImageNet formatuje swoje dane obrazu, aby były przydatne do treningu? – mskw