Wyszkoliłem binarny model klasyfikacji w CNN, a oto mój kod
model = Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],
border_mode='valid',
input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (16, 16, 32)
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (8, 8, 64) = (2048)
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2)) # define a binary classification problem
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adadelta',
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
nb_epoch=nb_epoch,
verbose=1,
validation_data=(x_test, y_test))
I tutaj chcę uzyskać dane wyjściowe każdej warstwy, tak jak TensorFlow, jak mogę to zrobić?
źródło
K.function([inp]+ [K.learning_phase()], [out])
oznacza w twoim kodzie?np.random.random(input_shape)[np.newaxis,...]
można ją również zapisać jakonp.random.random(input_shape)[np.newaxis,:]
K.function
tutaj , a predykcja używa jej w pętli predykcji tutaj . Przewiduj pętle na podstawie rozmiaru partii (jeśli nie ustawisz wartości domyślnej na 32), ale to złagodzi ograniczenia pamięci GPU. Więc nie jestem pewien, dlaczego obserwujesz,model.predict
jest szybszy.Z https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer
Jednym prostym sposobem jest utworzenie nowego modelu, który wygeneruje warstwy, które Cię interesują:
Alternatywnie możesz zbudować funkcję Keras, która zwróci dane wyjściowe określonej warstwy przy określonych danych wejściowych, na przykład:
źródło
layer_output = get_3rd_layer_output([X, 0])[0]
ilayer_output = get_3rd_layer_output([X, 1])[0]
Dokumentacja wspomina o trybie pociągu i trybie testowymOpierając się na wszystkich dobrych odpowiedziach tego wątku, napisałem bibliotekę do pobierania danych wyjściowych z każdej warstwy. Abstrahuje od całej złożoności i został zaprojektowany tak, aby był jak najbardziej przyjazny dla użytkownika:
https://github.com/philipperemy/keract
Obsługuje prawie wszystkie przypadki skrajne
Mam nadzieję, że to pomoże!
źródło
Następujące wygląda dla mnie bardzo prosto:
Powyżej znajduje się obiekt tensorowy, więc możesz go modyfikować za pomocą operacji, które można zastosować do obiektu tensora.
Na przykład, aby uzyskać kształt
model.layers[idx].output.get_shape()
idx
jest indeksem warstwy i można go znaleźć na podstawiemodel.summary()
źródło
Napisałem tę funkcję dla siebie (w Jupyter) i zainspirowała ją odpowiedź indraforyou . Automatycznie wykreśli wszystkie wyniki warstw. Twoje obrazy muszą mieć kształt (x, y, 1), gdzie 1 oznacza 1 kanał. Po prostu wywołujesz plot_layer_outputs (...), aby plotować.
źródło
Od: https://github.com/philipperemy/keras-visualize-activations/blob/master/read_activations.py
źródło
Chciałem dodać to jako komentarz (ale nie mam wystarczająco wysokiego przedstawiciela) do odpowiedzi @ indraforyou, aby poprawić problem wymieniony w komentarzu @ mathtick. Aby uniknąć
InvalidArgumentError: input_X:Y is both fed and fetched.
wyjątek, wystarczy zamienić linięoutputs = [layer.output for layer in model.layers]
zoutputs = [layer.output for layer in model.layers][1:]
, tjdostosowywanie minimalnego przykładu roboczego indraforyou:
ps moje próby wypróbowania rzeczy takich jak
outputs = [layer.output for layer in model.layers[1:]]
nie zadziałały.źródło
keras
modelu). Twoja warstwa osadzania słów jest równoważna warstwie wejściowej w podanym przykładzie.Zakładając, że masz:
1- Keras wstępnie przeszkolony
model
.2- Wprowadź
x
jako obraz lub zestaw obrazów. Rozdzielczość obrazu powinna być zgodna z wymiarami warstwy wejściowej. Na przykład 80 * 80 * 3 dla obrazu 3-kanałowego (RGB).3- Nazwa wyjścia, które
layer
ma zostać aktywowane. Na przykład warstwa „flatten_2”. Powinno to być zawarte wlayer_names
zmiennej, reprezentuje nazwę warstw podanychmodel
.4-
batch_size
to argument opcjonalny.Następnie możesz łatwo użyć
get_activation
funkcji, aby uzyskać aktywację wyjścialayer
dla danego wejściax
i wstępnie wytrenowaćmodel
:źródło
Jeśli masz jeden z następujących przypadków:
InvalidArgumentError: input_X:Y is both fed and fetched
Musisz wprowadzić następujące zmiany:
outputs
zmiennejfunctors
pętliMinimalny przykład:
źródło
[x1, x2, xn, 1]
? Mój x1 nie jest zdefiniowany i chciałbym zrozumieć, co tam definiujesz.x1
ix2
są danymi wejściowymi modelu. Jak stwierdzono, o ile masz 2 wejścia w swoim modelu.Cóż, inne odpowiedzi są bardzo kompletne, ale istnieje bardzo podstawowy sposób „zobaczenia”, a nie „uzyskania” kształtów.
Po prostu zrób
model.summary()
. Drukuje wszystkie warstwy i ich kształty wyjściowe. Wartości „Brak” będą wskazywać zmienne wymiary, a pierwszym wymiarem będzie rozmiar partii.źródło