2017-07-15 26 views
0

我試圖用NumPy來獲得一個簡單,相對準確的數字閱讀神經網絡。我的代碼運行並獲取正確的MNIST數字信息,但最終得出的預測每個數字不可能落入任何10位數類別的相同結果。所有輸出將爲零MNIST NumPy解決方案,簡單的神經網絡

我認爲我的錯誤必須有點基本。沒有門檻有沒有一個大問題?我的數據類型搞砸了嗎?任何指向正確方向的東西都會受到極大的讚賞。我一直在盯着這個和調整好幾個小時的東西。

這裏是我的代碼的鏈接在GitHub上:https://github.com/popuguy/ai-tests/blob/master/npmnistnn.py

而這裏的糊狀:

import numpy as np 

from tensorflow.examples.tutorials.mnist import input_data 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
import matplotlib 

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 

np.set_printoptions(precision=3) 
np.set_printoptions(suppress=True) 

def display_mnist(img, label): 
    '''Visually display the 28x28 unformatted array 
    ''' 
    basic_array = img 
    plt.imshow(basic_array.reshape((28,28)), cmap=cm.Greys) 
    plt.suptitle('Image is of a ' + label) 
    plt.show() 

hidden_layer_1_num_nodes = 500 
hidden_layer_2_num_nodes = 500 
hidden_layer_3_num_nodes = 500 
output_layer_num_nodes = 10 
batch_size = 100 
dimension = 28 
full_iterations = 10 

def convert_digit_to_onehot(digit): 
    return [0] * digit + [1] + [0] * (9 - digit) 

images = mnist.train.images 
# images = np.add(images, 0.1) 
labels = mnist.train.labels 
def sigmoid(x): 
    return 1/(1 + np.exp(-x)) 

def slope_from_sigmoid(x): 
    return x * (1 - x) 

syn1 = 2 * np.random.random((dimension**2, hidden_layer_1_num_nodes)) - 1 
syn2 = 2 * np.random.random((hidden_layer_1_num_nodes, hidden_layer_2_num_nodes)) - 1 
syn3 = 2 * np.random.random((hidden_layer_2_num_nodes, hidden_layer_3_num_nodes)) - 1 
syn4 = 2 * np.random.random((hidden_layer_3_num_nodes, output_layer_num_nodes)) - 1 
testing = False 
test_n = 3 
for iter in range(full_iterations): 
    print('Epic epoch bro, we\'re at #' + str(iter+1)) 
    for section in range(0, len(images), batch_size): 
     if testing: 
      print('Syn before',syn1) 

     training_images = images[section:section+batch_size] 
     training_labels = labels[section:section+batch_size] 
     l0 = training_images 
     l1 = sigmoid(np.dot(l0, syn1)) 
     l2 = sigmoid(np.dot(l1, syn2)) 
     l3 = sigmoid(np.dot(l2, syn3)) 
     l4 = sigmoid(np.dot(l3, syn4)) 
     l4_err = training_labels - l4 
     l4_delta = l4_err * slope_from_sigmoid(l4) 
     l3_err = np.dot(l4_delta, syn4.T) 
     l3_delta = l3_err * slope_from_sigmoid(l3) 
     l2_err = np.dot(l3_delta, syn3.T) 
     l2_delta = l2_err * slope_from_sigmoid(l2) 
     l1_err = np.dot(l2_delta, syn2.T) 
     l1_delta = l1_err * slope_from_sigmoid(l1) 
     syn4_update = np.dot(l3.T, l4_delta) 
     syn4 += syn4_update 
     syn3_update = np.dot(l2.T, l3_delta) 
     syn3 += syn3_update 
     syn2_update = np.dot(l1.T, l2_delta) 
     syn2 += syn2_update 
     syn1_update = np.dot(l0.T, l1_delta) 
     syn1 += syn1_update 
     if testing: 
      print('Syn after',syn1) 
      print('Due to syn1 update', syn1_update) 
      print('Number non-zero elems', len(syn1_update.nonzero())) 
      print('Which were', syn1_update.nonzero()) 
      print('From the l1_delta', l1_delta) 
      print(l0[0:test_n]) 
      print("----------") 
      print(l1[0:test_n]) 
      print("----------") 
      print(l2[0:test_n]) 
      print("----------") 
      print(l3[0:test_n]) 
      print("----------") 
      print(l4[0:test_n]) 
      print("----------") 
      print(training_labels[0:test_n]) 
      a=input() 
      if len(a) > 0 and a[0]=='s': 
       testing=False 
correct = 0 
total = 0 
l4list = l4.tolist() 
training_labelslist = training_labels.tolist() 
print('Num things', len(l4list)) 
for i in range(len(l4list)): 
    print(["{0:0.2f}".format(a) for a in l4list[i]]) 
    # print(l4list[i]) 
    # display_mnist(l0[i], str(l4list[i].index(max(l4list[i])))) 
    if l4list[i].index(max(l4list[i])) == training_labelslist[i].index(max(training_labelslist[i])): 
     correct += 1 
    total += 1 
print('Final round', 100*(correct/total),'percent correct') 
+0

你的代碼亂七八糟。如果有任何結構,我都看不到它。請將代碼分成功能,描述性名稱,不超過25行。每個功能應該執行一項任務,並且該功能應該僅取決於其輸入。創建一個調用其他函數來完成你的任務的main()函數(最外層沒有代碼)。一旦你轉換了你的代碼,請編寫測試函數來測試每個函數(例如'def test_foo():...'來測試你的'def foo(...):..'函數) - 檢查你從一系列輸入中獲得您期望的輸出。 – thebjorn

+0

類型問題「爲什麼此代碼無法工作?」並不適合SO,並且很快就會關閉。如果您仔細閱讀之前的評論中的步驟,則應該能夠回過頭來查看正確的問題(https://stackoverflow.com/help/how-to-ask)。在任何情況下,「盯着這個和調整好幾個小時的東西」不是一種調試技術,它可能會讓你在任何地方。 – thebjorn

+0

好的,謝謝你們。我基本上感到沮喪,因爲我寫了一些類似於我編寫的代碼的其他代碼,這些代碼使用TensorFlow解決了相同的問題。我想也許一個神經網絡專家可以看着它30秒,看到一個明顯的缺陷。我會讓我的代碼更實用,並嘗試提出更具體的問題。 – Paul

回答

0

超參數在這種情況下只是調整不當。將每個隱藏層的節點數量降低到15,並將學習速率降低到0.1會使性能顯着提高。