2016-11-30 47 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

相关问题