在最后几天,我和TensorFlow度过了一段非常奇怪的时光,无法想象atm会出现什么问题。
我建立了这个网络:link。它是TensorFlow的MNIST示例的副本。
基本上,我所做的就是改变网络,从28x28x1图像(MNIST灰度)到600x800x1图像(我自己拍摄的一些图像,背景相对干净的网络摄像头和不同位置的一个对象)。
我想要做的就是玩这样的CNN并让它输出图像中对象的x位置。所以单个输出神经元。
但是,无论我尝试什么,网络总是输出1.0。甚至(当你在代码末尾看我的测试部分时)我把所有的,全部为0或所有随机数输入网络。
当然,由于我只有21个标记的训练和7个标记的测试图片,我预计性能非常糟糕(因为800x600像素图像对于神经网络而言非常大并且定位对象并不容易)。
...但我完全不知道为什么网络总是输出1.0,即使它是无意义的。有什么想法吗?
答案 0 :(得分:6)
查看源代码,似乎在softmax(the code you shared中的L.104)之前的最终完全连接层将每个示例缩小为单输出类,然后再计算SOFTMAX。由于每个示例只有一个类,tf.nn.softmax()
op(y_conv
)的结果将是每个元素中包含1.0的batch_size x 1矩阵,并且tf.argmax()
每个元素包含0,因为只有一个值。类似地,将tf.argmax()
应用于y_train(这是一个batch_size x 1矩阵)将为每个元素产生0,因此“准确度”将为100%。
要解决此问题,您应该(i)将最终完全连接层的输出单元数增加为类数,(ii)将每行y_train
编码为单热矢量代表每个例子的真实类。