2016-12-30 71 views
2

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

的图像与批量大小转换成大小 X X 的numpy的阵列和供给到所述神经网络的64.

Full Code Here

编辑:相同的代码为200个纪元。没提升。我做得稍微差一些。

+1

20个时代似乎没有足够的地方...你也需要一个相当大的训练集...这可能需要几个小时来训练......你可能想看看在谷歌已经开始训练的模型(参见https://www.tensorflow.org/how_tos/image_retraining/) –

+0

你使用这个循环的是什么? https://github.com/DollarAkshay/Python-Programs/blob/master/Artificial%20Intelligence/Kaggle_Dogs_vs_Cats.py#L124为什么不''np.argmax'什么的? – martianwars

+0

@Joran Beasley是的,20个时代看起来不是那么简单,但是它不应该做一个体面的预测吗?我的训练集有25k图像。你建议多少个时代?我其实是想学习神经网络,这就是为什么我不使用预先训练的模型:) –

回答

1

提高精度是一门艺术不是一个任务的解决方案,你可以尝试一些方法:

  • 尝试不同的梯度优化,SGD,动量,nestrov,ADAP,...
  • 尝试自适应学习率
  • 改善正则化方法L1,L2,丢失,下降连接,...
  • 扩大你的训练数据(有更多的数据)。
  • 改变你的网络超参数
  • 最后如果没有帮助改变网络结构。
+0

虽然这些都是一些很好的技术,但这适用于准确率达到80%的人试图达到85%的准确度。在我的情况下,我甚至没有超过55% –

+0

如果你不相信,所以这是最后一点说什么改变算法/秒tructure。 , – jfedail

2

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

你有没有标准化的数据(即由255分的像素值)?我不能在脚本中看到这样做。

当你得到可怕的结果,如17 logloss,这意味着你的模型总是以100%的置信度预测一个类。通常在这种情况下,它不是架构或学习速度或时代数量,而是一些愚蠢的错误,如忘记标准化或混合标签。对于这个特定的问题和给定的架构,你应该在40个时代内看到大约80%和0.4的logloss的准确性。不需要数以千计的时代:)

+0

我还没有将输入图像从255归一化为1,但是归一化会产生如此巨大的差异吗? –

+0

是的,它通常会产生很大的不同。 –