tf.contrib.learn.DNNClassifier提取的权重和偏差的含义和维度

时间:2017-07-24 19:10:07

标签: tensorflow

我对张量流量相对较新,但即使经过大量研究,我也无法找到某些变量意义的文档。

对于我目前的项目,我想在tensorflow的帮助下训练DNN,之后我想从中提取权重和偏置矩阵,以便在另一个应用程序OUTSIDE tensorflow中使用它。第一次尝试时,我建立了一个带有[4,10,2]结构的简单网络,它可以预测二进制结果。

我使用了3个real_valued_columns和一个sparse_column_with_keys(包含在embedding_column中)作为功能:

def build_estimator(optimizer=None, activation_fn=tf.sigmoid):
    """Build an estimator"""
    # Sparse base columns
    column_stay_point = tf.contrib.layers.sparse_column_with_keys(
        column_name='stay_point',
        keys=['no', 'yes'])

    # Continuous base columns
    column_heading = tf.contrib.layers.real_valued_column('heading')
    column_velocity = tf.contrib.layers.real_valued_column('velocity')
    column_acceleration = tf.contrib.layers.real_valued_column('acceleration')

    pedestrian_feature_columns = [column_heading, 
                                  column_velocity, 
                                  column_acceleration,
                                  tf.contrib.layers.embedding_column(
                                      column_stay_point, 
                                      dimension=8, 
                                      initializer=tf.truncated_normal_initializer)]

    # Create classifier
    estimator = tf.contrib.learn.DNNClassifier(
        hidden_units=[10],
        feature_columns=pedestrian_feature_columns,
        model_dir='./tmp/pedestrian_model',
        n_classes=2,
        optimizer=optimizer,
        activation_fn=activation_fn)

    return estimator

我使用默认参数调用此函数,并使用estimator.fit(...)来训练DNN。除了一些关于被弃用的标量概述的警告之外。功能,它运行成功,产生了合理的结果。我使用以下行打印了模型的所有变量:

var = {k: estimator.get_variable_value(k) for k in estimator.get_variable_names())

我期望得到大小为10x4和2x10的权重矩阵以及大小为10x1和2x1的偏置矩阵。但我得到了以下内容:

'dnn/binary_logistic_head/dnn/learning_rate': 0.05 (actual value, scalar)

'dnn/input_from_feature_columns/stay_point_embedding/weights': 2x8 array

'dnn/hiddenlayer_0/weights/hiddenlayer_0/weights/part_0/Adagrad': 11x10 array

'dnn/input_from_feature_columns/stay_point_embedding/weights/int_embedding/weights/part_0/Adagrad': 2x8 array

'dnn/hiddenlayer_0/weights': 11x10 array

'dnn/logits/biases': 1x1' array

'dnn/logits/weights/nn/dnn/logits/weights/part_0/Adagrad': 10x1 array

'dnn/logits/weights': 10x1 array

'dnn/logits/biases/dnn/dnn/logits/biases/part_0/Adagrad': 1x1 array

'global_step': 5800, (actual value, scalar)

'dnn/hiddenlayer_0/biases': 1x10 array

'dnn/hiddenlayer_0/biases//hiddenlayer_0/biases/part_0/Adagrad': 1x10 array

有没有任何文件说明这些神秘的名称是什么意思,为什么矩阵有这些奇怪的尺寸?另外,为什么尽管没有指定它,仍然引用了Adagrad优化器?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

网络中的输入节点数为11而不是4 8(embedding_column)+ column_heading(1),column_velocity(1),column_acceleration(1)= 11

根据变量名称,输出是二进制逻辑节点,因此输出节点的数量只有一个,而不是2.

以下是您感兴趣的权重/偏见。

dnn / hiddenlayer_0 / weights':11x10数组 - >从输入到隐藏节点有权重

dnn / hiddenlayer_0 / biases':1x10数组 - >隐藏节点的偏差

dnn / logits / weights':10x1数组 - >从隐藏节点到输出节点的权重

dnn / logits / biases':1x1'数组 - >输出节点的偏差。

为什么引用Adagrad优化器,尽管从未指定它?
最有可能的默认优化器是AdaGrad。