¿Cómo generar la segunda capa de una red?

9

Mi modelo está entrenado en imágenes de dígitos ( MNIST dataset). Estoy tratando de imprimir la salida de la segunda capa de mi red: una matriz de 128 números.

Después de leer un montón de ejemplos - por ejemplo este , y esto , o esto .

No logré hacer esto en mi propia red. Ninguna de las soluciones funciona con mi propio algoritmo.

Enlace a Colab: https://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv?fbclid=IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxY4tZaDRXxAx3U98HT6

Recibí muchos mensajes de error diferentes. Traté de manejar cada uno de ellos, pero no pude resolverlo por mi cuenta.

¿Qué me estoy perdiendo? ¿Cómo dar salida a la segunda capa? Si mi forma es (28,28), ¿cuál debería ser el tipo y el valor de input_shape?


Pruebas fallidas y errores, por ejemplo:

(1)

for layer in model.layers:

    get_2nd_layer_output = K.function([model.layers[0].input],[model.layers[2].output])
    layer_output = get_2nd_layer_output(layer)[0]
    print('\nlayer output: get_2nd_layer_output=, layer=', layer, '\nlayer output: get_2nd_layer_output=', get_2nd_layer_output)

TypeError: las entradas deben ser una lista o tupla.

(2)

input_shape=(28, 28)
inp = model.input                                           # input placeholder
outputs = [layer.output for layer in model.layers]          # all layer outputs
functor = K.function([inp, K.learning_phase()], outputs )   # evaluation function

# Testing
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = functor([test, 0.])
print('layer_outs',layer_outs)

tensorflow.python.framework.errors_impl.FailedPreconditionError: Error al leer la variable de recursos dense_1 / sesgo del Contenedor: localhost. Esto podría significar que la variable no fue inicializada. No encontrado: el contenedor localhost no existe. (No se pudo encontrar el recurso: localhost / dense_1 / bias) [[{{node dense_1 / BiasAdd / ReadVariableOp}}]]

Shir K
fuente
1
Los enlaces en su pregunta están rotos, agréguelos para tener una idea de lo que intentó
Théo Rubenach
@ ThéoRubenach Hecho
Shir K

Respuestas:

3

Parece que está mezclando viejos keras (antes de tensorflow 2.0:) import kerasy nuevos keras ( from tensorflow import keras).

Intente no usar keras antiguas junto con tensorflow> = 2.0 (y no hacer referencia a la documentación antigua como en su primer enlace), ya que se confunde fácilmente con la nueva (aunque nada estrictamente ilógico):

from tensorflow import keras
from keras.models import Model
print(Model.__module__) #outputs 'keras.engine.training'

from tensorflow.keras.models import Model
print(Model.__module__) #outputs 'tensorflow.python.keras.engine.training'

El comportamiento será altamente inestable al mezclar esas dos bibliotecas.

Una vez hecho esto, utilice una respuesta de lo que intentó, siendo su modelo y my_input_shapela forma de entrada de sus modelos, es decir, la forma de una imagen (aquí (28, 28) o (1, 28, 28) si tiene lotes):

from tensorflow import keras as K
my_input_data = np.random.rand(*my_input_shape) 
new_temp_model = K.Model(m.input, m.layers[3].output) #replace 3 with index of desired layer
output_of_3rd_layer = new_temp_model.predict(my_input_data) #this is what you want

Si tienes una imagen imgpuedes escribir directamentenew_temp_model.predict(img)

Théo Rubenach
fuente
Rubenach, ¿qué quieres decir con 'my_input_shape'? ¿Cuál debería ser el valor de esa var?
Shir K
1
Bueno, la forma de entrada de su modelo, incluso lo tiene en su propio código al definir su modelo:input_shape=(28, 28)
Théo Rubenach
1
Aquí utilizo datos aleatorios, pero en su caso debería reemplazarlos my_input_datacon sus propios datos, por supuesto
Théo Rubenach
¿Qué quieres decir con 'tus propios datos'? ¿Cuáles deberían ser los valores internos: datos de entrenamiento? ¿datos de prueba? ¿debería ser solo 1 objeto (imagen) o una lista / matriz / tupla de objetos (imágenes)? Intenté muchas combinaciones diferentes de esto y ninguna funcionó. Cuando configuré 'input_shape' como usted mencionó, recibí el error '' AttributeError: el objeto 'tupla' no tiene atributo 'forma' '
Shir K
1
Actualicé mi respuesta en consecuencia. La imagen que desea usar depende de su caso de uso, no tiene nada que ver con el código. Si todavía está confundido, ¿quizás haga una nueva pregunta en otro sitio de stackexchange?
Théo Rubenach
3

(Suponiendo TF2)

Creo que el enfoque más directo sería nombrar sus capas y luego llamarlas con una entrada estándar, para que su modelo se vea así

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28), name='flatten'),
    keras.layers.Dense(128, activation='relu', name='hidden'),
    keras.layers.Dense(10, activation='softmax')
])

Luego solo crea una entrada y

my_input = tf.random.normal((1, 28, 28)) # Should be like the standard input to your network
output_of_flatten = model.get_layer('flatten')(my_input)
output_of_hidden = model.get_layer('hidden')(output_of_flatten)

output_of_hidden es lo que buscas

Enfoque alternativo

Si está buscando una solución más general, suponiendo que su modelo sea secuencial, puede usar la indexpalabra clave de get_layeresta manera

my_input = tf.random.normal((1, 28, 28)) # Should be like the standard input to your network
desired_index = 1  # 1 == second layer

for i in range(desired_index):
    my_input = model.get_layer(index=i)(my_input)

Al final de este ciclo my_inputdebería ser lo que estás buscando

verano azul
fuente
¿Qué quiere decir con 'my_input = ... # debe ser como la entrada estándar a su red'? ¿Cuál debería ser el valor de esa var?
Shir K
1
Cualquier entrada estándar, como lo que espera el modelo secuencial: si su entrada es 28x28, debe pasar la matriz 1x28x28 para un solo ejemplo
bluesummers
1
Edité mi respuesta a
bluesummers
¿Cómo imprimir los valores dentro de 'output_of_hidden'? El resultado actual es 'output_of_hidden Tensor ("hidden_1 / Relu: 0", shape = (1, 128), dtype = float32)'. Intenté usar session & eval pero recibo errores.
Shir K
1
Si está en TF2, generalmente debería llamar output_of_hidden.numpy()y lo convertirá en una matriz
numpy