为什么张量流等于给出不正确的结果

时间:2017-01-19 12:46:56

标签: python tensorflow

当我们应用CNN网络时似乎需要tf.equal()功能。在下面的情况中,tf.equal()返回不正确的结果。

with tf.Graph().as_default():

            images, labels = inputs("./test_data", [64, 64], 10, True)

            logits = inference(images, 2, 1.0)

            acc = accuracy(logits, labels)

            saver = tf.train.Saver()

            #predict_image(saver, logits)

            eval_once(saver, logits, acc, labels)



def eval_once(saver, logits, acc, labels):
    with tf.Session() as sess:
            ckpt = tf.train.get_checkpoint_state("./model/")
            if ckpt and ckpt.model_checkpoint_path:
                    saver.restore(sess, ckpt.model_checkpoint_path)
                    print "Model Loaded!"
            else:
                    print "Model Not Found!"
                    return

            coord = tf.train.Coordinator()

            threads = tf.train.start_queue_runners(sess, coord = coord)

            l = tf.argmax(labels,1)
            p = tf.argmax(logits,1)

            print "labels"
            print sess.run(l)

            print "preds"
            print sess.run(p)

            print sess.run(tf.equal(l, p))

            print "%.5f" % sess.run(acc)

            coord.request_stop()

            coord.join(threads, stop_grace_period_secs = 10)

在代码中,输入将按file_queue读取图像,inference定义我们的CNN网络。 inference的输出是最后一个完全连接的层的logits。在我的例子中,标签是one_hot编码的,有2个类,所以它应该是[1,0]或[0,1]。

结果如下:

labels
[0 0 1 0 1 0 0 0 1 0]
preds
[0 1 0 1 0 0 1 0 1 1]
[ True  True  True  True  True  True  True  True  True  True]
0.90000

从结果中我们发现标签和preds在索引1处不相等(从索引0开始)。但是,tf.equal()为我们提供了True。它与索引2和索引3相同。

然后我在其他一些案例中测试tf.equal(),结果是正确的。

那么,怎么会发生呢?

(我使用file_queue读取图像并应用tf.train.batchtf.train.shuffle来创建用于训练和测试的批处理。就像张量流示例中的cifar 10示例一样)

1 个答案:

答案 0 :(得分:1)

在思考之后,有一种可能性,即每次拨打sess.run() file_queue时,<Style TargetType="StackPanel" x:Key="expand"> <Setter Property="Width" Value="48"></Setter> <Style.Triggers> <!--TO EXPAND--> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding IsPressed, ElementName=btnExpandirMenu,PresentationTraceSources.TraceLevel=High}" Value="True" /> <Condition Binding="{Binding Width, ElementName=menuLateral,PresentationTraceSources.TraceLevel=High, UpdateSourceTrigger=PropertyChanged}" Value="48" /> </MultiDataTrigger.Conditions> <MultiDataTrigger.EnterActions> <StopStoryboard BeginStoryboardName="OUT"/> <BeginStoryboard Name="IN"> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Width" To="358" Duration="0:00:0.2"/> </Storyboard> </BeginStoryboard> </MultiDataTrigger.EnterActions> </MultiDataTrigger> <!--TO CLOSE--> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding IsPressed, ElementName=btnExpandirMenu}" Value="True"/> <Condition Binding="{Binding ActualWidth, ElementName=menuLateral}" Value="358"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.EnterActions> <StopStoryboard BeginStoryboardName="IN"/> <BeginStoryboard Name="OUT"> <Storyboard> <DoubleAnimation Storyboard.TargetProperty="Width" To="48" Duration="0:00:0.2"/> </Storyboard> </BeginStoryboard> </MultiDataTrigger.EnterActions> </MultiDataTrigger> </Style.Triggers> </Style> 都会读取随机播放的图片和标签,以便获得结果。