如何用Keras获取LSTM层输出值?用于Kmeans特征提取
如何获取Keras LSTM层的具体输出值用于Kmeans聚类
你遇到的问题很典型:layers[1].output返回的是TensorFlow计算图中的一个节点,它本身并不存储实际数值,必须喂入真实的输入数据才能触发计算,得到具体的特征值。下面给你两种简单有效的解决方案:
方法1:使用Keras后端的K.function
你可以用K.function定义一个从模型输入到目标层输出的计算函数,然后传入你的输入数据(比如训练集train_x)来获取特征:
from keras import backend as K # 定义计算函数:输入是模型的输入,输出是lstm_67层(索引1)的输出 get_lstm_output = K.function([model.input], [model.layers[1].output]) # 传入训练数据,得到特征值(注意输入要符合模型的输入形状) lstm_features = get_lstm_output([train_x])[0] # 现在lstm_features就是形状为(样本数, 100)的numpy数组,可以直接用于Kmeans print(lstm_features.shape) # 应该输出 (训练样本数, 100)
方法2:用Keras的Model类构建特征提取器
这种方法更直观,适合需要重复提取特征的场景:
from keras.models import Model # 构建新模型:输入和原模型一致,输出为lstm_67层的输出 feature_extractor = Model(inputs=model.input, outputs=model.layers[1].output) # 用predict方法获取特征,和模型预测的用法完全一样 lstm_features = feature_extractor.predict(train_x) # 查看特征形状 print(lstm_features.shape) # (训练样本数, 100)
为什么你的之前代码无法得到数值?
你之前尝试的K.eval(layers[1].output)或者sess.run(layers[1].output)失败,是因为这些Tensor依赖于模型的输入数据,你没有提供输入,TensorFlow不知道要计算哪一批数据的输出。必须把输入数据作为参数传入计算函数或者predict方法,才能触发计算图的执行,得到实际的数值结果。
后续用于Kmeans聚类的示例
拿到lstm_features之后,就可以直接用sklearn的KMeans进行聚类了:
from sklearn.cluster import KMeans # 初始化Kmeans模型,假设你要聚成3类 kmeans = KMeans(n_clusters=3, random_state=42) cluster_labels = kmeans.fit_predict(lstm_features) # cluster_labels就是每个样本对应的聚类标签 print(cluster_labels[:10]) # 打印前10个样本的聚类结果
内容的提问来源于stack exchange,提问作者shaojie
相关产品推荐
相关产品推荐

