【问题标题】:Really bad Accuracy with Neural Network神经网络的准确性真的很差
【发布时间】:2017-03-03 01:59:07
【问题描述】:

我试图解决 Kaggle 上的 Dogs vs. Cats Redux: Kernels Edition 问题。这是一个简单的图像分类问题。但是,我比得分为 17+ 的随机预测器做得更差。有谁知道为什么会这样?

神经网络模型

def convolutional_neural_network():
    weights = {
        # 3x3x3 conv => 1x1x8
        'conv1': tf.Variable(tf.random_normal([3, 3, 3, 8])),
        # 5x5x8 conv => 1x1x16
        'conv2': tf.Variable(tf.random_normal([5, 5, 8, 16])),
        # 3x3x16 conv => 1x1x32
        'conv3': tf.Variable(tf.random_normal([3, 3, 16, 32])),
        # 32 FC => output_features
        'out': tf.Variable(tf.random_normal([(SIZE//16)*(SIZE//16)*32, output_features]))
    }

    biases = {
        'conv1': tf.Variable(tf.random_normal([8])),
        'conv2': tf.Variable(tf.random_normal([16])),
        'conv3': tf.Variable(tf.random_normal([32])),
        'out': tf.Variable(tf.random_normal([output_features]))
    }
    conv1 = tf.add(conv2d(input_placeholder, weights['conv1'], 1), biases['conv1'])
    relu1 = relu(conv1)
    pool1 = maxpool2d(relu1, 4)

    conv2 = tf.add(conv2d(pool1, weights['conv2'], 1), biases['conv2'])
    relu2 = relu(conv2)
    pool2 = maxpool2d(relu2, 2)

    conv3 = tf.add(conv2d(pool2, weights['conv3'], 1), biases['conv3'])
    relu3 = relu(conv3)
    pool3 = maxpool2d(relu3, 2)

    pool3 = tf.reshape(pool3 , shape=[-1, (SIZE//16)*(SIZE//16)*32])

    output = tf.add(tf.matmul(pool3, weights['out']), biases['out'])
    return output

输出没有激活函数。

预测、优化器和损失函数

output_prediction = convolutional_neural_network()
loss = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(output_prediction, output_placeholder) )
trainer = tf.train.AdamOptimizer()
optimizer = trainer.minimize(loss)
test_prediction = tf.nn.softmax(output_prediction)

图像被转换为​​大小为 128x128x3 的 numpy 数组,并以批量大小为64.

Full Code Here

编辑: 运行相同的代码 200 个 epoch。没提升。我做的稍微差一点。

【问题讨论】:

  • 20 个 epochs 似乎还远远不够……你还需要一个相当大的训练集……训练可能需要很多小时……你可能想看看 googles inception已经训练好的模型(另见tensorflow.org/how_tos/image_retraining
  • 你用这个循环做什么? github.com/DollarAkshay/Python-Programs/blob/master/… 为什么不np.argmax 之类的?
  • @Joran Beasley 是的 20 epochs 似乎少了,但它至少不应该做一个像样的预测吗?我的训练集有 25k 张图像。你建议多少个时代?我实际上想学习神经网络,这就是我不使用预训练模型的原因:)
  • @martianwars 这个循环是采用 2 个概率,猫的概率和狗的概率,并将它们转换为 0 到 1 之间的 1 个数字。我确实使用了 np.argmax,但它返回 0或者1.这个问题的评分算法不同,也接受浮动值

标签: python tensorflow neural-network classification kaggle


【解决方案1】:

这更像是一个评论,但没有足够的特权点:

您是否对数据进行了标准化(即将像素值除以 255)?我在脚本中看不到这样做。

当您得到像 17 logloss 这样的糟糕结果时,这意味着您的模型始终以 100% 的置信度预测一个类别。通常在这种情况下,它不是架构或学习率或时期数,而是一些愚蠢的错误,例如忘记标准化或混淆标签。对于这个特定的问题,并根据您的架构,您应该会在 40 个 epoch 内看到大约 80% 的准确度和 0.4 logloss。不需要数千个 epoch :)

【讨论】:

  • 我还没有将输入图像从 255 归一化为 1。但是归一化会产生如此巨大的差异吗?
  • 是的,它通常会产生很大的影响。
【解决方案2】:

提高准确性是一门艺术,而不是一项任务解决方案,您可以尝试以下一些方法:

  • 尝试不同的梯度优化、SGD、动量、nesrov、adap、...
  • 尝试自适应学习率
  • 改进正则化方法 L1,L2,dropout, drop connect, ...
  • 扩充您的训练数据(拥有更多数据)。
  • 更改您的网络超参数
  • 最后,如果没有任何帮助改变网络结构。

【讨论】:

  • 虽然这些是一些很好的技术,但它适用于那些试图达到 85% 准确率的人。就我而言,我什至没有超过 55%
  • 如果您不相信,那么这就是最后一点所说的。改变算法/结构。 ,
猜你喜欢
  • 2020-06-03
  • 2017-08-31
  • 1970-01-01
  • 2018-04-10
  • 2017-07-05
  • 1970-01-01
  • 2019-01-07
  • 2017-11-17
  • 2016-08-02
相关资源
最近更新 更多