目前我正在玩基於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))
好的,幫助了我。謝謝!但是現在我面臨着另一個問題:當我將圖像與第一層相乘時(在隨機生成的開始處),結果矩陣中的值非常大,以致nonlin(sigmoid)方法中的exp函數不能計算。任何想法誰可以接近呢?或者是否有更好的S形功能? – Cilenco
你可以使用Relu功能。目前沒有使用sigmoid函數,因爲它們具有漸變消失問題。 ReLU是幾乎所有情況下的最佳解決方案 – Hulk
好的,謝謝你,我會試試這個!我是否也使用這個函數的導數來計算'error_delta',因爲它只是'0'或'1',這對我來說看起來有點奇怪。 – Cilenco