簡體   English   中英

Python中的神經網絡-權重矩陣形狀和后置支撐有麻煩

[英]Neural Network in Python - Having trouble with weight matrix shapes and back prop

我一直在努力用直線python編寫神經網絡。 我正在嘗試使其識別MNIST圖像。

我認為初始化體重時一定做錯了。

我的假設是,因為MNIST數據是形狀為28x28的數據,所以第一組權重的形狀應為(28,類似東西),最后一組權重的形狀應為(X,1),X為數據集中的類數。

我感到困惑的一件事是,我的結尾矩陣(下面的變量l5)的形狀為(28,1)。 我需要怎么做才能使輸出的形狀為(9,1)? 我已經打印了形狀,並且在理解神經網絡和線性代數方面發現了空白:

l5 shape: (28, 1)
l4 shape: (28, 9)
l3 shape: (28, 14)
l2 shape: (28, 21)
l1 shape: (28, 28)

我認為理論上我可以做一個SVM(支持向量機),然后將形狀(784,1)的(展平)圖像與(784,9)的矩陣相乘,但是我不確定這是否是唯一的方法這一點,如果實際上,我的能力遠遠不能滿足要求。

以下基於本教程的代碼: http : //iamtrask.github.io/2015/07/12/basic-python-network/

    syn0 = np.random.random((28, 28))
    syn1 = np.random.random((28, 21))
    syn2 = np.random.random((21, 14)) 
    syn3 = np.random.random((14, 9)) 
    syn4 = np.random.random((9, 1))
    images, labels = mndata.load_training()
    print(len(images))
    for index, image in enumerate(images):
        X = np.array(image).reshape((28, 28))
        print(X)        
        y = np.zeros((9)) # getImageCategory(fileName)
        y[labels[index]] = 1

        print(y)

        l0 = X
        l1 = sigmoid(np.dot(l0, syn0)) # + bias?
        l2 = sigmoid(np.dot(l1, syn1)) # + bias?
        l3 = sigmoid(np.dot(l2, syn2)) # + bias?
        l4 = sigmoid(np.dot(l3, syn3)) # + bias?
        l5 = sigmoid(np.dot(l4, syn4)) # + bias?

        print("l5 shape: " + str(l5.shape))
        print("l4 shape: " + str(l4.shape))
        print("l3 shape: " + str(l3.shape))
        print("l2 shape: " + str(l2.shape))
        print("l1 shape: " + str(l1.shape))
        print("Y shape: " + str(y.shape))

        l5_error = y - l5

        if index % 10 == 0:
            print("Error: " + str(np.mean(np.abs(l5_error)))) # +" | Prediction: " + str(l5))

        l5_delta = l5_error * sigmoid(l5, True) # True = derivative of sigmoid

        l4_error = l5_delta.dot(syn4.T)
        l4_delta = l4_error * sigmoid(l4, True) # True = derivative of sigmoid

        l3_error = l4_delta.dot(syn3.T)
        l3_delta = l3_error * sigmoid(l3, True) # True = derivative of sigmoid

        l2_error = l3_delta.dot(syn2.T)
        l2_delta = l2_error * sigmoid(l2, True) # True = derivative of sigmoid

        l1_error = l2_delta.dot(syn1.T)
        l1_delta = l1_error * sigmoid(l1, True) # True = derivative of sigmoid

#             print("layer_4_delta shape: " + str(l4_delta.shape))
#             print("layer_3_delta shape: " + str(l3_delta.shape))
#             print("layer_2_delta shape: " + str(l2_delta.shape))
#             print("layer_1_delta shape: " + str(l1_delta.shape))

#             print("L1 Error" + str(layer_1_delta) + " | L2 Error: " + str(layer_2_delta) + " | L3 Error: " + str(layer_3_delta) + " | L4 Error: " + str(layer_4_delta))
        # update weights
        syn4 += l4.T.dot(l5_delta)
        syn3 += l3.T.dot(l4_delta)
        syn2 += l2.T.dot(l3_delta)
        syn1 += l1.T.dot(l2_delta)
        syn0 += l0.T.dot(l1_delta)            

另外,我知道反向傳播是根據適應度函數(正在考慮中的問題,我可能會丟失它)找到輸出的梯度並更新權重以最小化誤差。 我不明白為什么在更新權重和計算圖層誤差時必須轉置圖層。

我得到的當前錯誤如下,但是我確定我的代碼還有其他問題

Traceback (most recent call last):
  File "C:\Users\Username\Development\Python\updatedKernel.py", line 128, in <module>
    main()
  File "C:\Users\Username\Development\Python\updatedKernel.py", line 104, in main
    l4_error = l5_delta.dot(syn4.T)
ValueError: shapes (28,9) and (1,9) not aligned: 9 (dim 1) != 1 (dim 0) 

通常

輸入的形狀(MNIST數據)為(nb_samples_in_bacth,input_dimensions),其中input_dimensions = 784 = 28 * 28

第一組權重的形狀為(input_dimensions,hidden_​​dimension),其中input_dimensions = 784 = 28 * 28,hidden_​​dimension由用戶設置(通常應與input_dimension大小相同)。

第二個權重的形狀是(hidden_​​dimension,nb_classes),其中nb_class = 10(對於MNIST中的10位數字)。

最終輸出的形狀應為(nb_samples_in_batch,nb_classes)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM