从Estimator返回一个tf.Variable

时间:2017-09-29 08:02:48

标签: tensorflow

我有一个Tensorflow Estimator,它以通常的方式由模型函数定义。 我想确定哪些(zscore标准化)输入对结果有意义,哪些可以消除。我更改了模型以引入两个更改:

(1)一个新的层weight_layer,它是随机初始化的,并且元素乘以input_layer

weight_layer   =  tf.Variable(tf.random_normal([1, inputs_n], 0.5, 1))
weighted_input = tf.multiply(weight_layer, input_layer)
first_hidden_layer =  tf.layers.dense(weighted_input,  
                                      int(inputs_n), 
                                      activation=tf.nn.relu, 
                                      name='dense1') 

(2)惩罚sparsity被添加到损失函数中以通过weight_layer

中的权重总和来惩罚损失
 sparsity = tf.reduce_sum(weight_layer)    
 loss = tf.losses.mean_squared_error(labels, predictions) + (1000*sparsity)

当我尝试返回weight_layer的值时,问题出现在预测时间,如下所示:

if mode == tf.estimator.ModeKeys.PREDICT:
   return tf.estimator.EstimatorSpec( mode=mode, 
                                      predictions={
                                       "predictions": predictions, 
                                       "sparsity" : weight_layer})

我收到以下错误:

 TypeError: predictions[sparsity] must be Tensor, 
 given: <tf.Variable 'Model/Variable:0' shape=(1, 275) dtype=float32_ref>  

这看起来很奇怪,因为虽然预测[稀疏性]不是张量,但它是一个变量,并且tf.Variable文档表明我可以将tf.Variable视为正常的tf.Tensor'。

如何修复上面的内容以返回weight_layer,或者如果我有更基本的错误,请为我推荐一种方法来确定哪些输入变量很重要。

1 个答案:

答案 0 :(得分:0)

虽然我不太了解EstimatorSpec的动态,但似乎您试图将模型weight_layer转换为sparsity变量,但因为它们具有不同的形状由于tf.reduce_sum,因此它引起了错误。