2 votes

Obtenir le vecteur obtenu dans la dernière couche du CNN avant la couche softmax

Je suis en train de mettre en place un système en encodant les entrées à l'aide de CNN. Après CNN, j'ai besoin d'obtenir un vecteur et de l'utiliser dans une autre méthode d'apprentissage profond.

  def get_input_representation(self):
    # obtenir des vecteurs de mots à partir de l'incrustation
    inputs = tf.nn.embedding_lookup(self.embeddings, self.input_placeholder)

    sequence_length = inputs.shape[1] # 56
    vocabulary_size = 160 # 18765
    embedding_dim = 256
    filter_sizes = [3,4,5]
    num_filters = 3
    drop = 0.5

    epochs = 10
    batch_size = 30

    # cela renvoie un tenseur
    print("Création du modèle...")
    inputs = Input(shape=(sequence_length,), dtype='int32')
    embedding = Embedding(input_dim=vocabulary_size, output_dim=embedding_dim, input_length=sequence_length)(inputs)
    reshape = Reshape((sequence_length,embedding_dim,1))(embedding)

    conv_0 = Conv2D(num_filters, kernel_size=(filter_sizes[0], embedding_dim), padding='valide', kernel_initializer='normal', activation='relu')(reshape)
    conv_1 = Conv2D(num_filters, kernel_size=(filter_sizes[1], embedding_dim), padding='valide', kernel_initializer='normal', activation='relu')(reshape)
    conv_2 = Conv2D(num_filters, kernel_size=(filter_sizes[2], embedding_dim), padding='valide', kernel_initializer='normal', activation='relu')(reshape)

    maxpool_0 = MaxPool2D(pool_size=(sequence_length - filter_sizes[0] + 1, 1), strides=(1,1), padding='valide')(conv_0)
    maxpool_1 = MaxPool2D(pool_size=(sequence_length - filter_sizes[1] + 1, 1), strides=(1,1), padding='valide')(conv_1)
    maxpool_2 = MaxPool2D(pool_size=(sequence_length - filter_sizes[2] + 1, 1), strides=(1,1), padding='valide')(conv_2)

    concatenated_tensor = Concatenate(axis=1)([maxpool_0, maxpool_1, maxpool_2])
    flatten = Flatten()(concatenated_tensor)
    dropout = Dropout(drop)(flatten)
    output = Dense(units=2, activation='softmax')(dropout)
    model = Model(inputs=inputs, outputs=output)
    adam = Adam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)

    model.compile(optimizer=adam, loss='binary_crossentropy', metrics=['accuracy'])
    adam = Adam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)

    model.compile(optimizer=adam, loss='binary_crossentropy', metrics=['accuracy'])
    print("Formation du modèle...")
    model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, callbacks=[checkpoint], validation_data=(X_test, y_test))  # commence l'entraînement

    return ??

Le code ci-dessus entraîne le modèle en utilisant X_train et Y_train puis le teste. Cependant, dans mon système, je n'ai pas Y_train ou Y_test, j'ai seulement besoin du vecteur dans la dernière couche cachée avant la couche softmax. Comment puis-je l'obtenir?

3voto

today Points 7336

Pour cela, vous pouvez définir une fonction backend pour obtenir la sortie de couche(s) arbitraire(s) :

from keras import backend as K

func = K.function([model.input], [model.layers[index_of_layer].output])

Vous pouvez trouver l'indice de la couche souhaitée en utilisant model.summary() où les couches sont listées en commençant par l'indice zéro. Si vous avez besoin de la couche avant la dernière couche, vous pouvez utiliser -2 comme indice (c'est-à-dire que l'attribut .layers est en fait une liste donc vous pouvez l'indexer comme une liste en python). Ensuite, vous pouvez utiliser la fonction que vous avez définie en passant une liste de tableau(x) d'entrée :

outputs = func(inputs)

Alternativement, vous pouvez également définir un modèle à cette fin. Cela a été couvert plus en détail dans la documentation de Keras donc je vous conseille de la lire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X