Como gerar a segunda camada de uma rede?

9

Meu modelo é treinado em imagens de dígitos ( MNIST dataset). Estou tentando imprimir a saída da segunda camada da minha rede - uma matriz de 128 números.

Depois de ler um monte de exemplos - por exemplo este , e este , ou esta .

Não consegui fazer isso na minha própria rede. Nenhuma das soluções funciona com meu próprio algoritmo.

Link para Colab: https://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv?fbclid=IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxY4tZaDRXxAX3b986HToa

Recebi muitas mensagens de erro diferentes. Eu tentei lidar com cada um deles, mas não consegui entender sozinho.

o que estou perdendo? Como produzir a segunda camada? Se minha Forma é (28,28)- qual deve ser o tipo e o valor input_shape?


Tentativas falhas e erros, por exemplo:

(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: as entradas devem ser uma lista ou 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: Erro ao ler a variável de recurso dense_1 / viés do Contêiner: localhost. Isso pode significar que a variável não foi inicializada. Não encontrado: o host local do contêiner não existe. (Não foi possível encontrar o recurso: localhost / dense_1 / viés) [[{{node dense_1 / BiasAdd / ReadVariableOp}}]]

Shir K
fonte
11
Os links da sua pergunta estão quebrados, adicione-os para ter uma idéia do que você tentou
Théo Rubenach 25/02
@ ThéoRubenach Concluído
Shir K

Respostas:

3

Parece que você está misturando keras antigas (antes do tensorflow 2.0:) import kerase novas keras ( from tensorflow import keras).

Tente não usar keras antigas ao lado do tensorflow> = 2.0 (e não se referir à documentação antiga como no seu primeiro link), pois ela é facilmente confundida com a nova (embora nada estritamente 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'

O comportamento será altamente instável, misturando essas duas bibliotecas.

Uma vez feito isso, usando uma resposta do que você tentou, estou sendo seu modelo e my_input_shapesendo a forma dos modelos inseridos, ou seja, a forma de uma imagem (aqui (28, 28) ou (1, 28, 28), se você tiver 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

Se você tem uma imagem, imgpode escrever diretamentenew_temp_model.predict(img)

Théo Rubenach
fonte
Rubenach, o que você quer dizer com 'my_input_shape'? qual deve ser o valor dessa var?
Shir K
11
bem a forma de entrada do seu modelo, você ainda o tem em seu próprio código ao definir seu modelo:input_shape=(28, 28)
Théo Rubenach
11
aqui eu uso dados aleatórios, mas no seu caso você deve substituir my_input_datapelos seus próprios dados, é claro
Théo Rubenach
O que você quer dizer com 'seus próprios dados'? quais devem ser os valores internos - dados de treinamento? dados de teste? deve ser apenas 1 objeto (imagem) ou uma lista / matriz / tupla de objetos (imagens)? Eu tentei muitas combinações diferentes disso e nada disso funcionou. Quando defino 'input_shape' como você mencionou, recebi o erro '' AttributeError: 'tuple' objeto não tem atributo 'shape' '
Shir K
11
Eu atualizei minha resposta de acordo. A imagem que você deseja usar depende do seu caso de uso, não tem nada a ver com código. Se você ainda estiver confuso, talvez faça uma nova pergunta em outro site de stackexchange?
Théo Rubenach 27/02
3

(Supondo TF2)

Acho que a abordagem mais direta seria nomear suas camadas e chamá-las com entrada padrão, para que seu modelo possa parecer

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')
])

Em seguida, basta criar uma entrada e

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 é o que você está procurando

Abordagem alternativa

Se você estiver procurando por uma solução mais geral, assumindo que seu modelo é seqüencial, use a indexpalavra - chave get_layerassim

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)

No final desse loop, my_inputdeve estar o que você está procurando

bluesummers
fonte
o que você quer dizer com 'my_input = ... # Deve ser como a entrada padrão para sua rede'? qual deve ser o valor dessa var?
Shir K
11
Qualquer entrada padrão, como o que o modelo seqüencial espera - se sua entrada for 28x28, você deve passar a matriz 1x28x28 para um único exemplo
bluesummers
11
Editada minha resposta para
bluesummers
Como imprimir os valores dentro de 'output_of_hidden'? O resultado atual é 'output_of_hidden Tensor ("hidden_1 / Relu: 0", shape = (1, 128), dtype = float32)'. Tentei usar a sessão e avaliação, mas recebo erros.
Shir K
11
Se no TF2, você normalmente deve chamar output_of_hidden.numpy()e ele será convertido em array numpy
bluesummers