Keras 使用权重提取文本中的信息特征
Keras Extraction of Informative Features in Text Using Weights
我正在做一个文本分类项目,我想用keras
对每个词(token)的重要性进行排序。我的直觉是我应该能够从 Keras 模型中排序权重来对单词进行排名。
可能我在使用 argsort
或 tf.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]
.
我尝试使用两种不同的技术来构建列表:
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>)
我还没有确定如何从这个结果中得到一个列表。
argsort
sorted_indices = model.get_weights()[0].argsort(axis=0)
print(sorted_indices.shape)
# Returns (10000, 1000)
函数argsort
returns一个矩阵,但是我需要的是一维列表
如何使用权重对文本特征进行排名?
我觉得不可能
第一层输出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]) )
我正在做一个文本分类项目,我想用keras
对每个词(token)的重要性进行排序。我的直觉是我应该能够从 Keras 模型中排序权重来对单词进行排名。
可能我在使用 argsort
或 tf.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]
.
我尝试使用两种不同的技术来构建列表:
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>)
我还没有确定如何从这个结果中得到一个列表。
argsort
sorted_indices = model.get_weights()[0].argsort(axis=0) print(sorted_indices.shape) # Returns (10000, 1000)
函数
argsort
returns一个矩阵,但是我需要的是一维列表
如何使用权重对文本特征进行排名?
我觉得不可能 第一层输出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]) )