(作者:陈玓玏)
一、查看tensor具体数据
在使用tensorflow训练模型的过程中,想要查看某些变量的具体内容,以便更好地掌握训练过程,但是tensorflow的变量都是tensor对象,而直接查看tensor对象只能看到其shape信息和数据类型信息,看不到具体的信息。
想要查看具体数据,需要通过session,代码如下:
#引入tensorflow
import tensorflow as tf
#定义一个变量x并赋值为常数10
x = tf.constant(10)
#开启一个会话,在会话中执行graph,这里的graph中只包含x的赋值操作
with tf.Session() as sess:
#方法一:通过session.run获取数据
print(sess.run(x))
#方法二:通过eval函数获取数据
print(x.eval())
二、InvalidArgumentError: Shape [-1,2186] has negative dimensions错误
上面的例子中,x是一个常数,是一个已经有确切赋值的函数,但有时并不是这种情况,比如建模过程中,样本特征x只是一个占位符,而非具体数值,那么你想要通过sess.run(y)获取y的具体数值就会报这个错,因为x值并没有输入。错误场景如下:
#引入tensorflow
import tensorflow as tf
#定义占位符x,以便之后传入任意条样本数据,每条样本784个特征,定义权重为w,shape为[784,10]
#服从截尾高斯分布,标准差为0.1,y为矩阵x和矩阵y的乘积,shape为[样本条数,10]
x = tf.placeholder(tf.float32,[None, 784])
w = tf.truncated_normal([784,10], stddev=0.1)
y = x*w
#开启一个会话,在会话中执行graph,这里的graph中包含y的计算公式
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(y))
使用上述代码获取y时,就会出现以上的错误。
解决方案:
通过sess.run(y)获取y时,需要指定数据x的来源,否则x只是个占位符,没有实际数据,自然计算不出y值。应该把print(sess.run(y))
改为print(sess.run(y,{x:input}))
,这里假设input是我们获取的具体的样本数据,{x:input}参数名实际叫feed_dict,是把具体数据喂给模型,而sess.run执行的是fetch操作,是把数据取出来。通过指定feed_dict,问题解决。