Tensorflow 为什么我的损失和准确性似乎是无关的?

Tensorflow 为什么我的损失和准确性似乎是无关的?,tensorflow,neural-network,conv-neural-network,Tensorflow,Neural Network,Conv Neural Network,我有一个用于预测CIFAR10类的CNN,这是我根据MNIST数据集的工作解决方案改编的 该模型是image->conv->pool->conv->pool->FC->dropout->FC->class_prediction,我认为它比完全连接的网络(我在进行测试时实现了约50%)要好得多 我收到了一些奇怪的结果,其中的准确性和损失似乎并没有真正联系起来: 如图所示,损失持续下降,这是一件好事,但它似乎并没有真正影响准确性,即使是在训练集上 很抱歉把这些都放在这里,但下面我已经提取了所有我认为

我有一个用于预测CIFAR10类的CNN,这是我根据MNIST数据集的工作解决方案改编的

该模型是image->conv->pool->conv->pool->FC->dropout->FC->class_prediction,我认为它比完全连接的网络(我在进行测试时实现了约50%)要好得多

我收到了一些奇怪的结果,其中的准确性和损失似乎并没有真正联系起来:

如图所示,损失持续下降,这是一件好事,但它似乎并没有真正影响准确性,即使是在训练集上

很抱歉把这些都放在这里,但下面我已经提取了所有我认为相关的代码。因此,请让我知道,如果我可以添加任何进一步的信息

with tf.name_scope('Model'):
    # Construct model
    pred = conv_net(x, weights, biases, keep_prob)

with tf.name_scope('Loss'):
    # Define loss function and optimizer
    net = tf.nn.softmax_cross_entropy_with_logits(pred, y_true, name='Softmax_Loss')
    cost = tf.reduce_mean(net)

with tf.name_scope('Adam_Descent'):
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate, name='Adam_Descent').minimize(cost)   

# Evaluate the model
correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y_true, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

#
# Code omitted
#

with tf.Session() as sess:
    sess.run(init)

    step = 1
    # Train for a while
    while step * batch_size < training_iters:

        batch_x, batch_y = get_rand_train_batch(batch_size, 10000)

        # Run optimization        
        _, summary = sess.run([optimizer, merged_summary_op], feed_dict={x: batch_x, 
                                                                         y_true: batch_y, 
                                                                         keep_prob: 0.75})
        if step * index % display_step == 0:
            # Calculate loss and accuracy
            loss, acc = sess.run([cost, accuracy], feed_dict={x: batch_x, 
                                                              y_true: batch_y, 
                                                              keep_prob: 1})
            print_blue("Iter " + str(step*batch_size) + ", Minibatch Loss= " + \
                  "{:.6f}".format(loss) + ", Training Accuracy= " + \
                  "{:2.3f}%".format(acc*100))
        summary_writer.add_summary(summary, step * batch_size)
        step += 1

    # Calculate test accuracy
    print("\nTesting Accuracy:", \
    sess.run(accuracy, feed_dict={x: X_test[:1000],
                                  y_true: y_test[:1000],
                                  keep_prob: 1.}))
带有tf.name\u范围('Model')的
:
#构造模型
pred=转换网络(x、权重、偏差、保持概率)
使用tf.name\u范围(“损失”):
#定义损失函数和优化器
net=tf.nn.softmax\u cross\u entropy\u与logits(pred,y\u true,name='softmax\u Loss')
成本=tf.减少平均值(净额)
使用tf.name_scope('Adam_Descent'):
优化器=tf.train.AdamOptimizer(学习率=学习率,name='Adam\u下降')。最小化(成本)
#评估模型
正确的pred=tf.equal(tf.argmax(pred,1),tf.argmax(y\u true,1))
准确度=tf.reduce_平均值(tf.cast(correct_pred,tf.float32))
#
#代码省略
#
使用tf.Session()作为sess:
sess.run(初始化)
步骤=1
#训练一段时间
步骤*批量大小<培训内容:
批次x、批次y=获取批次(批次大小,10000)
#运行优化
_,summary=sess.run([optimizer,merged_summary_op],feed_dict={x:batch_x,
y_真:批次y,
保持(概率:0.75})
如果步骤*索引%display\u步骤==0:
#计算损失和准确度
损耗,acc=sess.run([成本,精度],进料量={x:batch\u x,
y_真:批次y,
保持_prob:1})
打印蓝色(“Iter”+str(步进*批量大小)+”,小批量损耗=“+\
“{.6f}”。格式(丢失)+”,训练精度=“+\
“{:2.3f}%.”格式(acc*100))
摘要编写器。添加摘要(摘要、步骤*批量大小)
步骤+=1
#计算测试精度
打印(“\n测试精度:”\
sess.run(精度,进给量={x:x\u测试[:1000],
y_true:y_测试[:1000],
保持(问题:1.})

可能是安装过度了。你试过交叉验证吗?你能给我们发一张重新缩放的损失图吗?比如日志错误或损失历史记录,因为错误不大于10?这个比例使你的图表很难解释。也许它太过拟合了。你试过交叉验证吗?你能给我们发一张重新缩放的损失图吗?比如日志错误或损失历史记录,因为错误不大于10?这种比例使图形难以解释。