Получение вектора, полученного в последнем слое CNN перед слоем softmax - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь реализовать систему путем кодирования входов с использованием CNN. После CNN мне нужно получить вектор и использовать его в другом методе глубокого обучения.

  def get_input_representation(self):
    # get word vectors from embedding
    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

    # this returns a tensor
    print("Creating Model...")
    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='valid', kernel_initializer='normal', activation='relu')(reshape)
    conv_1 = Conv2D(num_filters, kernel_size=(filter_sizes[1], embedding_dim), padding='valid', kernel_initializer='normal', activation='relu')(reshape)
    conv_2 = Conv2D(num_filters, kernel_size=(filter_sizes[2], embedding_dim), padding='valid', kernel_initializer='normal', activation='relu')(reshape)

    maxpool_0 = MaxPool2D(pool_size=(sequence_length - filter_sizes[0] + 1, 1), strides=(1,1), padding='valid')(conv_0)
    maxpool_1 = MaxPool2D(pool_size=(sequence_length - filter_sizes[1] + 1, 1), strides=(1,1), padding='valid')(conv_1)
    maxpool_2 = MaxPool2D(pool_size=(sequence_length - filter_sizes[2] + 1, 1), strides=(1,1), padding='valid')(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("Traning Model...")
    model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, callbacks=[checkpoint], validation_data=(X_test, y_test))  # starts training


    return ??

Приведенный выше код обучает модель с использованием X_train и Y_train, а затем проверяет ее. Однако в моей системе у меня нет Y_train или Y_test, мне нужен только вектор в последнем скрытом слое перед слоем softmax. Как я могу получить его?

1 Ответ

0 голосов
/ 13 ноября 2018

Для этого вы можете определить бэкэнд-функцию для получения выходных данных произвольных слоев:

from keras import backend as K

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

Вы можете найти индекс нужного слоя, используя model.summary(), где слои перечислены, начиная с нуля индекса. Если вам нужен слой перед последним слоем, вы можете использовать -2 в качестве индекса (т.е. атрибут .layers на самом деле является списком, поэтому вы можете индексировать его как список в Python). Затем вы можете использовать функцию, которую вы определили, передав список входных массивов:

outputs = func(inputs)

Кроме того, вы также можете определить модель для этой цели. Это более подробно описано в документации Keras , поэтому я советую вам прочитать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...