He entrenado un modelo de clasificación binaria con CNN, y aquí está mi código
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))
Y aquí, quiero obtener la salida de cada capa al igual que TensorFlow, ¿cómo puedo hacer eso?
fuente
K.function([inp]+ [K.learning_phase()], [out])
significa en su código?np.random.random(input_shape)[np.newaxis,...]
también se puede escribir comonp.random.random(input_shape)[np.newaxis,:]
K.function
aquí , y predict la usa en el bucle de predicción aquí . Predecir bucles sobre el tamaño del lote (si no está configurado por defecto en 32), pero eso es para mitigar las restricciones en la memoria de la GPU. Así que no estoy seguro de por qué estás observandomodel.predict
es más rápido.Desde https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer
Una forma simple es crear un nuevo modelo que genere las capas que le interesan:
Alternativamente, puede construir una función Keras que devolverá la salida de una determinada capa dada una determinada entrada, por ejemplo:
fuente
layer_output = get_3rd_layer_output([X, 0])[0]
y?layer_output = get_3rd_layer_output([X, 1])[0]
Los documentos mencionan el modo de tren y el modo de pruebaBasado en todas las buenas respuestas de este hilo, escribí una biblioteca para obtener el resultado de cada capa. Resume toda la complejidad y ha sido diseñado para ser lo más fácil de usar posible:
https://github.com/philipperemy/keract
Maneja casi todos los casos de borde
¡Espero eso ayude!
fuente
Lo siguiente me parece muy simple:
Arriba hay un objeto tensor, por lo que puede modificarlo mediante operaciones que se pueden aplicar a un objeto tensor.
Por ejemplo, para obtener la forma
model.layers[idx].output.get_shape()
idx
es el índice de la capa y puedes encontrarlo enmodel.summary()
fuente
Escribí esta función para mí (en Jupyter) y se inspiró en la respuesta de indraforyou . Trazará todas las salidas de capa automáticamente. Sus imágenes deben tener una forma (x, y, 1) donde 1 representa 1 canal. Simplemente llame a plot_layer_outputs (...) para trazar.
fuente
De: https://github.com/philipperemy/keras-visualize-activations/blob/master/read_activations.py
fuente
Quería agregar esto como un comentario (pero no tengo el representante lo suficientemente alto) a la respuesta de @ indraforyou para corregir el problema mencionado en el comentario de @ mathtick. Para evitar la
InvalidArgumentError: input_X:Y is both fed and fetched.
excepción, simplemente reemplace la líneaoutputs = [layer.output for layer in model.layers]
conoutputs = [layer.output for layer in model.layers][1:]
, es decirAdaptando el ejemplo de trabajo mínimo de indraforyou:
ps mis intentos de probar cosas como
outputs = [layer.output for layer in model.layers[1:]]
no funcionaron.fuente
keras
modelo). Su capa de incrustaciones de palabras es equivalente a la capa de entrada en el ejemplo proporcionado aquí.Asumiendo que tienes:
1- Keras pre-entrenado
model
.2- Entrada
x
como imagen o conjunto de imágenes. La resolución de la imagen debe ser compatible con la dimensión de la capa de entrada. Por ejemplo, 80 * 80 * 3 para imágenes de 3 canales (RGB).3- El nombre de la salida
layer
para obtener la activación. Por ejemplo, la capa "flatten_2". Esto debe incluirse en lalayer_names
variable, representa el nombre de las capas de lo dadomodel
.4-
batch_size
es un argumento opcional.Entonces puede usar fácilmente la
get_activation
función para obtener la activación de la salidalayer
para una entrada determinadax
y pre-entrenadomodel
:fuente
En caso de que tenga uno de los siguientes casos:
InvalidArgumentError: input_X:Y is both fed and fetched
Debe hacer los siguientes cambios:
outputs
variablefunctors
bucleEjemplo mínimo:
fuente
[x1, x2, xn, 1]
? Mi x1 no está definido y me gustaría entender lo que está definiendo allí.x1
yx2
son las entradas del modelo. Como se dijo, en caso de que tenga 2 entradas en su modelo.Bueno, otras respuestas son muy completas, pero hay una forma muy básica de "ver", no de "obtener" las formas.
Solo haz un
model.summary()
. Imprimirá todas las capas y sus formas de salida. Los valores "Ninguno" indicarán dimensiones variables, y la primera dimensión será el tamaño del lote.fuente