python - 获取softmax层之前CNN最后一层获得的向量

标签 python tensorflow keras conv-neural-network nlp

我正在尝试使用 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_trainY_train训练模型,然后测试它。然而,在我的系统中,我没有 Y_trainY_test,我只需要 softmax 层之前最后一个隐藏层中的向量。我怎样才能获得它?

最佳答案

为此,您可以定义一个后端函数来获取任意层的输出:

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 documentation 中已对此进行了介绍。更彻底,所以我建议您阅读该内容。

关于python - 获取softmax层之前CNN最后一层获得的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53280916/

相关文章:

python - 如何在pysvn中缓存用户名和密码

python - Tensorflow tf.matmul 示例不正确?

python - 值错误 : A `Concatenate` layer requires inputs with matching shapes

tensorflow - keras 的 model.fit 中没有 tf.Print 的结果

python - 有没有办法在内部打印 Tornado 网络服务器上配置的路由处理程序?

python - 显示时钟时间时如何降低 xticks 标签分辨率

python - 在 iPython Notebook 的 HTML 表中打印 2 个 Python Pandas DataFrame

tensorflow - 如何用元信息丰富卷积神经网络?

python - 合并多个 BatchEncoding 或从 BatchEncoding 对象列表创建 tensorflow 数据集

python - Keras 回归的模型建议