2017-10-13 43 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%的精度進行分類。