神经网络的准确性非常差

时间:2016-12-30 16:53:35

标签: python tensorflow neural-network classification kaggle

我试图解决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)

将图像转换为大小 128 x 128 x 3 的numpy数组,并将其输入神经网络,批量大小为64。

Full Code Here

编辑:为200个纪元保留相同的代码。没有得到改善。我做得稍差。

2 个答案:

答案 0 :(得分:2)

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

您是否规范了数据(即将像素值除以255)?我不能在脚本中看到这样做。

当你得到像17 logloss这样糟糕的结果时,这意味着你的模型总是以100%的信心预测一个类。通常在这种情况下,它不是建筑或学习速度或时代数量,而是一些愚蠢的错误,比如忘记标准化或混合标签。对于这个特殊问题,考虑到您的架构,您应该在40个时期内看到大约80%和0.4 logloss的准确度。不需要成千上万的时代:)

答案 1 :(得分:1)

提高准确性是一项技术而非一项任务解决方案,您可以尝试其中一些方法:

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