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')
你的代碼亂七八糟。如果有任何結構,我都看不到它。請將代碼分成功能,描述性名稱,不超過25行。每個功能應該執行一項任務,並且該功能應該僅取決於其輸入。創建一個調用其他函數來完成你的任務的main()函數(最外層沒有代碼)。一旦你轉換了你的代碼,請編寫測試函數來測試每個函數(例如'def test_foo():...'來測試你的'def foo(...):..'函數) - 檢查你從一系列輸入中獲得您期望的輸出。 – thebjorn
類型問題「爲什麼此代碼無法工作?」並不適合SO,並且很快就會關閉。如果您仔細閱讀之前的評論中的步驟,則應該能夠回過頭來查看正確的問題(https://stackoverflow.com/help/how-to-ask)。在任何情況下,「盯着這個和調整好幾個小時的東西」不是一種調試技術,它可能會讓你在任何地方。 – thebjorn
好的,謝謝你們。我基本上感到沮喪,因爲我寫了一些類似於我編寫的代碼的其他代碼,這些代碼使用TensorFlow解決了相同的問題。我想也許一個神經網絡專家可以看着它30秒,看到一個明顯的缺陷。我會讓我的代碼更實用,並嘗試提出更具體的問題。 – Paul