2017-10-13 214 views
0

我正在使用深度神经网络分类器对TensorFlow上的MNIST数据集进行研究。我正在为网络使用以下结构。TensorFlow中MNIST研究的最佳DNNClassifier配置

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%的准确性。

谢谢。

回答

0

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

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

可以采取哪些措施?

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

我在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%的精度进行分类。