张量流量 - CNN Mnist数据集的低精度/批量精度计算方法

时间:2017-01-18 17:33:31

标签: tensorflow conv-neural-network mnist

代码在带有Tensor流的python 3.5.2中。神经网络返回的精确度在.10和5.00之间,较高的值倾向于训练数据的准确度大约为6。我无法判断神经网络是否合法地比随机猜测更糟或如果我使用的准确度代码有一个我看不到的严重错误。

神经网络由5层组成:

  1. 输入
  2. conv1(最大合并重建和退出)
  3. conv2(最大池化relu和dropout)
  4. 完全连接(使用relu)
  5. 输出
  6. 使用默认的Adam优化器

    我对我的准确度计算非常怀疑,因为我的内容与我所看到的因RAM限制而有所不同。精度计算同时确保列车的准确性和测试数据。

    # app/controllers/invitations_controller.rb
    class Devise::InvitationsController < DeviseController
        ...
        before_action :is_admin?, :only => [:new, :create]
        ...
    
    private
    
        def is_admin?
          current_user.role == 'admin'
        end
    end
    

    这是输出样本:

    • Epoch 0完成20次失败:10333239.3396 83.29 ts 429
    • Epoch 0当前测试设置精度:0.7072
    • 大纪元0当前列车设定精度:3.8039
    • 大纪元1完成了20次损失:1831489.40747 39.24 ts 858
    • Epoch 1当前测试集精度:0.7765
    • Epoch 1当前列车设定精度:4.2239
    • 大纪元2完成了20次损失:1010191.40466 25.89 ts 1287
    • Epoch 2当前测试设置精度:0.8069
    • Epoch 2当前列车设定精度:4.3898
    • 大纪元3完成了20次损失:631960.809082 0.267 ts 1716
    • Epoch 3当前测试集精度:0.8277
    • Epoch 3当前列车设定精度:4.4955
    • 大纪元4完成了20次损失:439149.724823 2.001 ts 2145
    • Epoch 4当前测试设置精度:0.8374
    • Epoch 4当前列车设定精度:4.5674

    完整的代码如下(对不起,我添加了很多评论供我自己使用):

            acc_total = 0
            correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
            accuracy = tf.reduce_mean(tf.cast(correct, 'float'))
            for _ in range(int(mnist.test.num_examples/batch_size)):
                test_x, test_y = mnist.test.next_batch(batch_size)
                acc = accuracy.eval(feed_dict={x: test_x, y: test_y})
                acc_total += acc
                print('Accuracy:',acc_total*batch_size/float(mnist.test.num_examples),end='\r')
            print('Epoch', epoch, 'current test set accuracy : ',acc_total*batch_size/float(mnist.test.num_examples))
    
            acc_total=0
            correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
            accuracy = tf.reduce_mean(tf.cast(correct, 'float'))
            for _ in range(int(mnist.train.num_examples/batch_size)):
                train_x, train_y = mnist.train.next_batch(batch_size)
                acc = accuracy.eval(feed_dict={x: train_x, y: train_y})
                acc_total += acc
                print('Accuracy:',acc_total*batch_size/float(mnist.train.num_examples),end='\r')
            print('Epoch', epoch, 'current train set accuracy : ',acc_total*batch_size/float(mnist.test.num_examples))
    

1 个答案:

答案 0 :(得分:2)

由于4个原因,CNN的结果很低:

  1. 辍学的不当(缺乏)喂养   - 保持率没有被输入accuracy.eval(feed_dict={x: test_x, y: test_y})导致网络在其准确性评估中表现不足
  2. 重量初始化不佳
    • 当权重接近于正态分布时,RELU神经元的工作效果明显更好。
  3. 远高学习率
    • 即使有腐烂,.03的学习率远远高于培训,并且有效地停止了培训
  4. 准确度函数错误
    • 培训数据的准确性功能是从mnist.test.num_examples而不是正确的mnist.train.num_examples接收数据集的大小,并导致无意义的准确度值超过100%