Treinei um modelo de classificação binária com a CNN, e aqui está o meu 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))
E aqui, eu quero obter a saída de cada camada como o TensorFlow, como posso fazer isso?
fonte
K.function([inp]+ [K.learning_phase()], [out])
significa no seu código?np.random.random(input_shape)[np.newaxis,...]
também pode ser escrito comonp.random.random(input_shape)[np.newaxis,:]
K.function
aqui e a previsão usa-a no loop de previsão aqui . Preveja loops sobre o tamanho do lote (se não definido, o padrão será 32), mas isso atenua as restrições na memória da GPU. Então, eu não sei por que você está observandomodel.predict
é mais rápido.De https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer
Uma maneira simples é criar um novo modelo que produza as camadas nas quais você está interessado:
Como alternativa, você pode criar uma função Keras que retornará a saída de uma determinada camada, dada uma determinada entrada, por exemplo:
fonte
layer_output = get_3rd_layer_output([X, 0])[0]
elayer_output = get_3rd_layer_output([X, 1])[0]
Os documentos mencionam o modo de trem e o modo de testeCom base em todas as boas respostas deste tópico, escrevi uma biblioteca para buscar a saída de cada camada. Ele abstrai toda a complexidade e foi projetado para ser o mais amigável possível:
https://github.com/philipperemy/keract
Ele lida com quase todos os casos extremos
Espero que ajude!
fonte
A seguir parece muito simples para mim:
Acima, há um objeto tensor, para que você possa modificá-lo usando operações que podem ser aplicadas a um objeto tensor.
Por exemplo, para obter a forma
model.layers[idx].output.get_shape()
idx
é o índice da camada e você pode encontrá-lo emmodel.summary()
fonte
Eu escrevi essa função para mim (em Jupyter) e foi inspirada na resposta de indraforyou . Ele plotará todas as saídas da camada automaticamente. Suas imagens devem ter um formato (x, y, 1) em que 1 representa 1 canal. Você acabou de chamar plot_layer_outputs (...) para plotar.
fonte
De: https://github.com/philipperemy/keras-visualize-activations/blob/master/read_activations.py
fonte
Queria adicionar isso como um comentário (mas não possui representante suficiente) à resposta de @ indraforyou para corrigir o problema mencionado no comentário de @ mathtick. Para evitar a
InvalidArgumentError: input_X:Y is both fed and fetched.
exceção, basta substituir a linhaoutputs = [layer.output for layer in model.layers]
comoutputs = [layer.output for layer in model.layers][1:]
, ou seja,adaptando o exemplo de trabalho mínimo da indraforyou:
ps minhas tentativas tentando coisas como
outputs = [layer.output for layer in model.layers[1:]]
não funcionou.fonte
keras
modelo). Sua camada de incorporação de palavras é equivalente à camada de entrada no exemplo fornecido aqui.Supondo que você tenha:
1- Keras pré-treinado
model
.2- Insira
x
como imagem ou conjunto de imagens. A resolução da imagem deve ser compatível com a dimensão da camada de entrada. Por exemplo 80 * 80 * 3 para imagem de 3 canais (RGB).3- O nome da saída
layer
para obter a ativação. Por exemplo, camada "flatten_2". Isso deve ser incluído nalayer_names
variável, representa o nome das camadas do dadomodel
.4-
batch_size
é um argumento opcional.Em seguida, você pode usar facilmente a
get_activation
função para obter a ativação da saídalayer
para uma determinada entradax
e pré-treinadamodel
:fonte
Caso você tenha um dos seguintes casos:
InvalidArgumentError: input_X:Y is both fed and fetched
Você precisa fazer as seguintes alterações:
outputs
variávelfunctors
loopExemplo mínimo:
fonte
[x1, x2, xn, 1]
? Meu x1 não está definido e eu gostaria de entender o que você está definindo lá.x1
ex2
são as entradas do modelo. Como foi dito, você tem 2 entradas no seu modelo.Bem, outras respostas são muito completas, mas há uma maneira muito básica de "ver", não de "obter" as formas.
Apenas faça um
model.summary()
. Ele imprimirá todas as camadas e suas formas de saída. Os valores "Nenhum" indicarão dimensões variáveis e a primeira dimensão será o tamanho do lote.fonte