Python Tensorflow汇总指标未初始化(用于Tensorboard)

Python Tensorflow汇总指标未初始化(用于Tensorboard),python,machine-learning,tensorflow,data-science,tensorboard,Python,Machine Learning,Tensorflow,Data Science,Tensorboard,我正在尝试使用tensorflow记录精度和召回率的汇总统计数据,以便使用tensor board和以下代码 我已经添加了全局变量和局部变量的初始值设定项,但是这仍然会引发一个错误,告诉我“recall”有一个未初始化的值 有人知道为什么这仍然会抛出错误吗 错误消息位于代码块下方 def分类器图(x,y,学习率=0.1): 使用tf.name_作用域(“分类器”): 使用tf.name_范围('model'): W=tf.Variable(tf.zeros([xdim,ydim]),name='

我正在尝试使用tensorflow记录精度和召回率的汇总统计数据,以便使用tensor board和以下代码

我已经添加了全局变量和局部变量的初始值设定项,但是这仍然会引发一个错误,告诉我“recall”有一个未初始化的值

有人知道为什么这仍然会抛出错误吗

错误消息位于代码块下方

def分类器图(x,y,学习率=0.1):
使用tf.name_作用域(“分类器”):
使用tf.name_范围('model'):
W=tf.Variable(tf.zeros([xdim,ydim]),name='W')
b=tf.Variable(tf.zeros([ydim]),name='b')
y=tf.matmul(x,W)+b
使用tf.name_scope('cross_entropy'):
diff=tf.nn.softmax\u cross\u entropy\u与logits(labels=y,logits=y)
交叉熵=tf.减少平均值(差异)
summary=tf.summary.scalar('cross\u entropy',cross\u entropy)
使用tf.name_范围(“列车”):
#交叉熵=tf.reduce\u均值(-tf.reduce\u和(y*tf.log(y\u),还原指数=[1]),name='cross\u熵')
训练步长=tf.train.GradientDescentOptimizer(学习率)。最小化(交叉熵)
#通过GD最小化交叉熵
#使用tf.name_作用域('init'):
#init=tf.global_variables_initializer()
#local\u init=tf.local\u variables\u initializer()
#init=tf.group(tf.global\u variables\u initializer(),tf.local\u variables\u initializer())
使用tf.name_作用域('init'):
init=tf.global_variables_initializer()
init_l=tf.local_variables_initializer()
使用tf.name_范围(“度量”):
召回=tf.metrics.recall(y,y)
精度=tf.metrics.precision(y,y)
v_rec=tf.summary.scalar('recall',recall)
v_prec=tf.summary.scalar('精度',精度)
metrics=tf.summary.merge_all()
返回[W,b,y,交叉熵,训练步长,初始,初始,度量]
def序列分类器(样本内、样本外、批次大小、迭代次数、特征集索引=1、模型=None、设备):
x=tf.placeholder(tf.float32,[None,xdim],name='x')#None表示任意第一维度
y=tf.placeholder(tf.float32,[None,ydim],name='y')
W、 b,y,交叉熵,训练步长,初始,初始,度量=分类器图(x,y)
使用tf.Session(config=config)作为sess,tf.device(device):
sess.run(初始化)
sess.run(初始化)
file\u writer=tf.summary.FileWriter(logdir,tf.get\u default\u graph())
t=0
当t<迭代时:
t+=1
_,err,metrics_str=sess.run([train_step,cross_entropy,metrics],feed_dict={x:batch_x,y:batch_y})
所有错误追加(错误)
文件\u编写器。添加\u摘要(度量\u str,t)
返回“完成”
确切的错误信息如下:

FailedPremissionError(回溯见上文):尝试使用未初始化的值回调/true\u正数/计数
[[Node:recall/true\u positives/count/read=Identity[T=DT\u FLOAT,[u class=[“loc:@recall/true\u positives/count”],[u device=“/job:localhost/replica:0/task:0/gpu:0”](recall/true\u positives/count)]]
谢谢

编辑:

在进行下面@Ishant Mrinal建议的更改时,我遇到了一个我以前遇到的错误:

InvalidArgumentError (see above for traceback): tags and values not the same shape: [] != [2] (tag 'precision_1')

这表明精度张量与其他张量的形状不同,它不会为交叉熵或回忆抛出此错误。

由于两条初始化行的位置,将这两条行移动到
训练分类器
函数。该错误表明某些变量未初始化

def train_classifier(...):
    ...
    init = tf.global_variables_initializer()
    init_l = tf.local_variables_initializer()
    with tf.Session(config=config) as sess, tf.device(device):
        sess.run(init)
        sess.run(init_l)

由于放置了两条初始化行,请将这两条行移动到
train\u分类器
功能。该错误表明某些变量未初始化

def train_classifier(...):
    ...
    init = tf.global_variables_initializer()
    init_l = tf.local_variables_initializer()
    with tf.Session(config=config) as sess, tf.device(device):
        sess.run(init)
        sess.run(init_l)

第二个问题是因为
tf.metrics
返回两个张量。相反,你应该这样做

                    _, recall = tf.metrics.recall(y, y_ )
                    _, precision = tf.metrics.precision(y, y_)

                    v_rec = tf.summary.scalar('recall', recall)
                    v_prec = tf.summary.scalar('precision', precision)

第二个问题是因为
tf.metrics
返回两个张量。相反,你应该这样做

                    _, recall = tf.metrics.recall(y, y_ )
                    _, precision = tf.metrics.precision(y, y_)

                    v_rec = tf.summary.scalar('recall', recall)
                    v_prec = tf.summary.scalar('precision', precision)

谢谢,我曾经尝试过,这会引发一个奇怪的错误:
InvalidArgumentError(回溯请参见上文):标记和值的形状不同:[]!=[2] (标记“precision_1”)
您知道为什么标记和值仅在precision标记上具有不同的维度吗?它没有抛出交叉熵或召回的错误。问题与
tf.summary.scalar
有关。谢谢,我曾经尝试过,这会引发一个奇怪的错误:
InvalidArgumentError(回溯请参见上文):标记和值的形状不同:[]!=[2] (标记“precision_1”)
您知道为什么标记和值仅在precision标记上具有不同的维度吗?它没有抛出交叉熵或召回的错误。问题与
tf.summary.scalar
有关。