ValueError: Argument must be a dense tensor

问题

程序运行过程中抛出异常:

ValueError: Argument must be a dense tensor: [array([[0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]], dtype=float32)] - got shape [1, 10000, 10], but wanted [1].

源代码

...
final_result = sess.run(fetches=[y], feed_dict={x: mnist.test.images})
...
y = tf.Variable(initial_value=final_result, name=TENSOR_NAME)
...

源代码的目的将一个神经网络的输出final_result作为参数传给另一个方法, 方法中以这个参数为初始值创建一个tf.Variable对象.

解决

...
final_result = sess.run(fetches=y, feed_dict={x: mnist.test.images})
...
y = tf.Variable(initial_value=final_result, name=TENSOR_NAME)
...

sess.run中包裹y的方括号去除就可以了.

分析

由报错信息可以看出, final_result的形状为[1,10000,10], 其中10000batch_size, 10output_size, 而1则是因为将y包裹在list中传递给fetches导致的.

所以传递给y的时候, 会进行类型检查, 发现final_result是一个由tensor组成的list. 这与initial_value的设置不同.

initial_value : A `Tensor`, or Python object convertible to a `Tensor`,
        which is the initial value for the Variable. The initial value must have
        a shape specified unless `validate_shape` is set to False. Can also be a
        callable with no argument that returns the initial value when called. In
        that case, `dtype` must be specified. (Note that initializer functions
        from init_ops.py must first be bound to a shape before being used here.)

initial_value可以传入Tensor或者是可以转换为TensorPython对象.
validate_shape设置为False的时候, initial_value必须设置shape.
也可以是一个无参数, 可通过调用产生初始值的对象. 如果是这种情况的话, 则必须指明dtype.

所以由list包裹的Tensor不满足条件, 会抛出该异常.

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据