Keras使用权重提取文本中的信息特征

时间:2019-05-23 22:17:51

标签: python tensorflow keras feature-extraction

我正在从事一个文本分类项目,我想使用keras对每个单词(令牌)的重要性进行排名。我的直觉是,我应该能够从Keras模型中对权重进行排序,以对单词进行排名。

可能我在使用argsorttf.math.top_k时遇到一个简单的问题。

完整的代码来自Packt

我首先使用sklearn使用10,000个最常用的单词来计算TF-IDF。

vectorizer = TfidfVectorizer(min_df=2, ngram_range=(1, 2), stop_words='english',
                             max_features=10000, strip_accents='unicode', norm='l2')

x_train_2 = vectorizer.fit_transform(x_train_preprocessed).todense()
x_test_2 = vectorizer.transform(x_test_preprocessed).todense()

我可以查看这样的单词列表:

print(vectorizer.get_feature_names()[:10])

然后我使用Keras构建并拟合模型。 Keras正在使用tensorflow后端。

# Deep Learning modules
import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import Adadelta, Adam, RMSprop
from keras.utils import np_utils

# Definiting hyper parameters
np.random.seed(1337)
nb_classes = 20
batch_size = 64
nb_epochs = 20

Y_train = np_utils.to_categorical(y_train, nb_classes)
model = Sequential()

model.add(Dense(1000, input_shape=(10000,)))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(500))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(50))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(nb_classes))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam')

print(model.summary())

# Model Training
model.fit(x_train_2, Y_train, batch_size=batch_size, epochs=nb_epochs, verbose=1)

然后我可以得到这样的权重:

weight = model.weights[0]
# Returns <tf.Variable 'dense_1/kernel:0' shape=(10000, 1000) dtype=float32_ref>

由于行数(10,000)等于要素数,因此我认为我的方向正确。我需要获取可用于获取功能名称的索引列表:informative_features = vectorizer.get_feature_names()[sorted_indices]

我尝试使用两种不同的技术来构建列表:

  1. tf.nn.top_k

    sorted_indices = tf.nn.top_k(weight)
    # Returns TopKV2(values=<tf.Tensor 'TopKV2_2:0' shape=(10000, 1) dtype=float32>, indices=<tf.Tensor 'TopKV2_2:1' shape=(10000, 1) dtype=int32>)
    

    我尚未确定如何从此结果中获取列表。

  2. argsort

    sorted_indices = model.get_weights()[0].argsort(axis=0)
    print(sorted_indices.shape)
    # Returns (10000, 1000)
    

    函数argsort返回一个矩阵,但是我需要一个一维列表。

如何使用权重对文本特征进行排名?

1 个答案:

答案 0 :(得分:1)

我认为不可能 第一层输出1000值 每个值都与每个特征绑定在一起,并带有一些权重值 并且同一件事继续到网络末端

如果输入直接绑定到分类层,并且经过训练,则

tfidf =  Input(shape=(10000,))
output = Dense(nb_classes, activation='softmax')(tfidf)
model = Model(tfidf,output)
model.summary()

# train model ...

last_layer = model.layers[-1]
weights = last_layer.get_weights()[0]
for i in range(nb_classes):
    print('class : ',i,' ->  Feature : ',np.argmax(weights[:,i]) )