目前我正在玩基于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