You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow实现Ladder Network:各层存活特征与Softmax前输出查询

解答:查看Ladder Network中间层输出与特征使用情况

针对你用TensorFlow实现的Ladder Network处理少样本多特征数据集的需求,我给你整理了两个具体的实现方案:

一、获取Softmax层之前的输出

要拿到Softmax前的中间输出其实很简单,只需要在模型代码里稍作修改,把需要的张量暴露出来:

  1. 修改模型定义,保留中间张量
    找到模型文件(比如ladder.py)里定义Softmax层的代码块,通常会有类似这样的结构:

    # 最后一个隐藏层输出
    h_final = tf.layers.dense(prev_hidden_layer, units=256, activation=tf.nn.relu)
    # Softmax分类层
    logits = tf.layers.dense(h_final, units=num_classes)
    predictions = tf.nn.softmax(logits)
    

    你可以把h_final(激活后的隐藏层输出)或者logits(Softmax前的原始得分)作为额外返回值。比如在模型的构建函数末尾,改成:

    # 同时返回预测结果和Softmax前的中间输出
    return predictions, h_final
    
  2. 推理时提取中间输出
    当你用模型做预测时,同时获取这个中间结果:

    # sess是你的TensorFlow会话,x是输入占位符
    pred_results, pre_softmax_output = sess.run(
        [model.predictions, model.h_final], 
        feed_dict={x: your_dataset}
    )
    

    这样pre_softmax_output就是你要的Softmax层之前的输出,形状为(样本数, 最后隐藏层维度)。

二、追踪每层的特征/神经元激活情况

首先要明确:Ladder Network的全连接层默认会用到所有输入特征(每个神经元是输入特征的加权组合),没有原生的“特征存活”概念——除非你用了正则化让部分权重归零。针对你的多特征场景,有两种思路:

1. 识别被忽略的原始特征(通过权重稀疏性)

如果给模型的输入层添加L1正则化(可以有效压缩无用特征的权重到0),就能找出哪些原始特征没被模型用到:

  • 先在构建输入层时添加L1正则:
    input_layer = tf.layers.dense(
        input_features, 
        units=hidden_units, 
        activation=tf.nn.relu,
        kernel_regularizer=tf.contrib.layers.l1_regularizer(scale=0.001)
    )
    
  • 训练完成后,提取输入层的权重并分析:
    # 获取输入层的权重矩阵,形状为(原始特征数, 第一层隐藏单元数)
    input_weights = sess.run(model.input_layer.kernel)
    # 标记每个原始特征是否有非零权重(即被模型用到)
    active_features = np.any(input_weights != 0, axis=1)
    print(f"原始特征中被激活的数量:{np.sum(active_features)}")
    
    这里active_features是布尔数组,True对应的就是模型实际用到的原始特征。

2. 查看各隐藏层的活跃神经元

如果你想知道各隐藏层中哪些神经元是“活跃”的(比如ReLU激活后输出大于0),可以把所有隐藏层的输出都暴露出来:

  • 在模型构建时,把每个隐藏层的张量存入列表并返回:
    # 假设你有三层隐藏层
    h1 = tf.layers.dense(input_features, units=512, activation=tf.nn.relu)
    h2 = tf.layers.dense(h1, units=256, activation=tf.nn.relu)
    h_final = tf.layers.dense(h2, units=128, activation=tf.nn.relu)
    # 返回预测结果和所有隐藏层输出
    return predictions, [h1, h2, h_final]
    
  • 推理时提取这些输出并统计:
    pred_results, hidden_outputs = sess.run(
        [model.predictions, model.hidden_layers], 
        feed_dict={x: your_dataset}
    )
    for idx, layer_output in enumerate(hidden_outputs):
        # 统计该层中至少有一个样本激活的神经元数量
        active_neurons = np.any(layer_output > 0, axis=0)
        print(f"第{idx+1}层隐藏层活跃神经元数:{np.sum(active_neurons)}")
    

最后提个小建议:你的数据集是1000样本对应20200特征,属于典型的高维小样本场景,非常容易过拟合。除了查看特征使用情况,建议先给输入层加强正则化(比如L1+L2),或者先做PCA降维,能有效提升模型的泛化能力。

内容的提问来源于stack exchange,提问作者user8279969

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:17:15