TensorFlow中MNIST研究的最佳DNNC分类器配置

时间:2017-10-13 14:21:08

标签: tensorflow mnist

我正在使用深度神经网络分类器研究TensorFlow上的MNIST数据集。我正在使用以下网络结构。

MNIST_DATASET = input_data.read_data_sets(mnist_data_path)
train_data = np.array(MNIST_DATASET.train.images, 'int64')
train_target = np.array(MNIST_DATASET.train.labels, 'int64')
test_data = np.array(MNIST_DATASET.test.images, 'int64')
test_target = np.array(MNIST_DATASET.test.labels, 'int64')

classifier = tf.contrib.learn.DNNClassifier(
    feature_columns=[tf.contrib.layers.real_valued_column("", dimension=784)],
    n_classes=10, #0 to 9 - 10 classes
    hidden_units=[2500, 1000, 1500, 2000, 500],
    model_dir="model"
)

classifier.fit(train_data, train_target, steps=1000)

但是,当我运行以下行时,我面临40%的准确率。

accuracy_score = 100*classifier.evaluate(test_data, test_target)['accuracy']

如何调整网络?我做错了什么?类似的研究在学术界取得了99%的准确性。

谢谢。

2 个答案:

答案 0 :(得分:1)

我在GitHub上找到了最佳配置。

首先,这不是最好的配置。学术研究have already reached测试集的准确率为99.79%。

classifier = tf.contrib.learn.DNNClassifier(
    feature_columns=feature_columns
    , n_classes=10
    , hidden_units=[128, 32]
    , optimizer=tf.train.ProximalAdagradOptimizer(learning_rate=learning_rate)
    , activation_fn = tf.nn.relu
)

此外,以下参数将转移到分类器。

epoch = 15000
learning_rate = 0.1
batch_size = 40

通过这种方式,模型在测试集上分类为97.83%,在列车集上分类为99.77%。

答案 1 :(得分:0)

根据经验,对于MNIST数据集,在完全连接的网络中不超过2个隐藏层是个好主意。即hidden_units=[500, 500]。这应该达到90%以上的准确度。

有什么问题?极端数量的模型参数。例如,只有第二个隐藏层需要(2500 * 1000 + 1000)个参数。经验法则是保持可训练参数的数量与训练样本的数量有些可比,或者在经典机器学习中至少如此。否则,严格规范模型。

这里可以采取哪些步骤?

  • 使用更简单的模型。减少隐藏单位数量,层数
  • 使用参数数量较少的模型。例如,卷积层通常对相同数量的单元使用更少数量的参数。例如,1000个具有3x3内核的系膜神经元只需要1000 *(3 * 3 + 1)个参数
  • 应用正则化:批量归一化,噪声注入到您的输入,丢失,重量衰减将是很好的例子。