Detale:
GPU : GTX 1080
Szkolenie : ~ 1,1 miliona zdjęć należących do 10 klas
Walidacja : ~ 150 tysięcy zdjęć należących do 10 klas
Czas na epokę : ~ 10 godzin
Skonfigurowałem CUDA, cuDNN i Tensorflow (również GPU Tensorflow).
Nie sądzę, że mój model jest tak skomplikowany, że zajmuje 10 godzin na epokę. Nawet sprawdziłem, czy mój procesor graficzny jest problemem, ale tak nie było.
Czy czas szkolenia wynika z w pełni połączonych warstw?
Mój model:
model = Sequential()
model.add()
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dense(4096))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))
model.summary()
opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)
model.compile(loss='categorical_crossentropy',
optimizer=opt,
metrics=['accuracy']
)
Ponieważ jest dużo danych, użyłem ImageDataGenerator.
gen = ImageDataGenerator(
horizontal_flip=True
)
train_gen = gen.flow_from_directory(
'train/',
target_size=(512, 512),
batch_size=5,
class_mode="categorical"
)
valid_gen = gen.flow_from_directory(
'validation/',
target_size=(512, 512),
batch_size=5,
class_mode="categorical"
)
machine-learning
python
keras
Pradyumna Rahul
źródło
źródło
Odpowiedzi:
To mniej więcej oczekiwane. Jeśli podzielisz liczbę sekund przez liczbę przetworzonych obrazów, otrzymasz 33 milisekundy na obraz, co wydaje się być odpowiednie dla tak małej sieci. Większe sieci zwykle pobierają od 50 do 200 milisekund na obraz.
Tak, duża gęsta warstwa może negatywnie wpłynąć na wydajność, ponieważ jest to ogromna matryca (256 na 4096) i duże mnożenie macierzy, z którą można się pogodzić przy każdym uruchomieniu sieci.
źródło
Jak powiedział shimao, właśnie tego można się spodziewać. Pomimo braku wielu warstw, rozmiar wejściowy 512 x 512 jest dużym obrazem do przemyślenia. Duży czas obliczeń jest prawdopodobnie dłuższy z powodu splotu 64 filtrów na dużym obrazie, zamiast w pełni połączonych warstw.
Sieć, którą zbudowałeś, ma jednak zabawne wąskie gardło informacyjne. Zaczynasz od 64 filtrów na oryginalnym obrazie, zmniejszając się tylko wraz ze zmniejszaniem się rozmiaru obrazu. Gdy obraz przechodzi przez sieć, funkcje, których się uczysz, stają się coraz bardziej abstrakcyjne i złożone. Warstwa Conv2D (32, (3, 3)) zasadniczo ogranicza sieć do uczenia się mapy 32 obiektów o wymiarach 128 x 128.
Większość architektur sieciowych podwaja liczbę funkcji za każdym razem, gdy je łączą, a najnowsze architektury imagenet faktycznie porzucają w pełni połączone warstwy na korzyść średniej puli nad ostateczną mapą obiektów i zasadniczo wykonują regresję logistyczną na wyjściu tej puli.
Spróbuj zacząć od mniejszej liczby filtrów, powiedz 16 w pierwszej warstwie splotu, podwajając za każdym razem, gdy kroczysz lub zbierasz. Zrób to jeszcze kilka razy, aby zwiększyć pole odbioru i zmniejszyć rozmiar mapy obiektów. Zrób to w dół do 64x64 lub 32x32, czyli 128 lub 256 filtrów. Możesz użyć globalnej puli średniej i maksymalnej Keras, aby wyeliminować również w pełni połączone warstwy. To powinno podwoić prędkość sieci, a jednocześnie oczekiwałbym wzrostu dokładności.
źródło