2016-11-30 45 views
1

目前我正在玩基於this website(第二部分是關於圖像識別)的Python中的機器學習。我想培訓一個網絡來識別圖像中的4個特定點,但我的問題是:機器學習輸入和輸出的大小

神經網絡是通過簡單地將矩陣相乘在一起,計算給定輸出和識別輸出之間的增量並重新計算權重在矩陣中。現在讓我們說我有一個600x800像素圖像作爲輸入。如果我將這與我的圖層矩陣相乘,我不能得到一個4x2矩陣作爲輸出(每個點的x,y)。

我的第二個問題是我應該爲這個問題隱藏多少層?更多的圖層總是更好,但需要更長的時間來計算?我們可以猜測我們需要多少隱藏層,或者我們應該測試一些值並使用最好的值?

我當前神經網絡代碼:

from os.path import isfile 
import numpy as np 

class NeuralNetwork: 

    def __init__(self): 
     np.random.seed(1) 
     self.syn0 = 2 * np.random.random((480000,8)) - 1 

    @staticmethod 
    def relu(x, deriv=False): 
     if(deriv): 
      res = np.maximum(x, 0) 
      return np.minimum(res, 1) 
     return np.maximum(x, 0) 

    def train(self, imgIn, out): 
     l1 = NeuralNetwork.relu(np.dot(imgIn, self.syn0)) 

     l1_error = out - l1 

     exp = NeuralNetwork.relu(l1,True) 
     l1_delta = l1_error * exp 

     self.syn0 += np.dot(imgIn.T,l1_delta) 
     return l1 #np.abs(out - l1) 

    def identify(self, img): 
     return NeuralNetwork.relu(np.dot(imgIn, self.syn0)) 

回答

1

問題1.輸入數據。

您必須序列化輸入。例如,如果您有一個600 * 800像素的圖像,輸入必須是1 * 480000(行,列)。行意味着數據和列的數量意味着數據的維度。

問題2.分類。

如果您想對4種不同類別進行分類,則應使用(1,4)向量進行輸出。例如,有4個班級('魚','貓','老虎','汽車')。然後,vector(1,0,0,0)表示Fish。

問題3.完全連接網絡。

我認爲這個主頁中的例子使用完全連接的網絡。它使用整個圖像進行一次分類。如果你想分類圖像的子集。你應該使用卷積神經網絡或其他方法。我對此不太瞭解。

問題4.超參數

這取決於數據。你必須測試各種超參數。然後選擇最佳超參數。

+0

好的,幫助了我。謝謝!但是現在我面臨着另一個問題:當我將圖像與第一層相乘時(在隨機生成的開始處),結果矩陣中的值非常大,以致nonlin(sigmoid)方法中的exp函數不能計算。任何想法誰可以接近呢?或者是否有更好的S形功能? – Cilenco

+0

你可以使用Relu功能。目前沒有使用sigmoid函數,因爲它們具有漸變消失問題。 ReLU是幾乎所有情況下的最佳解決方案 – Hulk

+0

好的,謝謝你,我會試試這個!我是否也使用這個函數的導數來計算'error_delta',因爲它只是'0'或'1',這對我來說看起來有點奇怪。 – Cilenco

相關問題