Python 机器学习输入和输出的大小
目前,我正在使用基于的python进行机器学习(第二部分是关于图像识别)。我想训练网络识别am图像中的4个特定点,但我的问题是: 神经网络是通过简单地将矩阵相乘,计算给定输出和识别输出之间的增量,并重新计算矩阵中的权重来创建的。现在让我们假设我有一个Python 机器学习输入和输出的大小,python,machine-learning,Python,Machine Learning,目前,我正在使用基于的python进行机器学习(第二部分是关于图像识别)。我想训练网络识别am图像中的4个特定点,但我的问题是: 神经网络是通过简单地将矩阵相乘,计算给定输出和识别输出之间的增量,并重新计算矩阵中的权重来创建的。现在让我们假设我有一个600x800像素图像作为输入。如果我将其与我的图层矩阵相乘,我无法得到一个4x2矩阵作为输出(x,y) 我的第二个问题是,对于这个问题,我应该有多少隐藏层?层数越多越好,但计算时间越长?我们能猜出我们需要多少隐藏层吗?或者我们应该测试一些值并充分利
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。输入数据
您必须序列化输入。例如,如果您有一个600*800像素的图像,则输入必须为1*480000(行、列)。
行表示数据的数量,列表示数据的维度
问题2。分类
如果要对4种不同类型的类进行分类,应该使用(1,4)向量作为输出。例如,有4个类(“鱼”、“猫”、“老虎”、“汽车”)。那么向量(1,0,0,0)表示鱼
问题3。完全连接的网络
我认为本主页中的示例使用完全连接的网络。它使用整个图像进行一次分类。如果要使用图像的子集进行分类。您应该使用卷积神经网络或其他方法。我对此不太了解
问题4。超参数
这取决于数据。必须使用各种超参数进行测试。然后选择最佳超参数。好的,这对我很有帮助。非常感谢。但现在我面临另一个问题:当我将我的图像与我的第一层相乘时(在开始随机生成),结果矩阵中的值太大,以至于无法计算nonlin(sigmoid)方法的
exp
函数。你知道我能接近谁吗?或者是否有更好的S形函数?您可以使用Relu函数。sigmoid函数目前没有使用,因为它们存在梯度消失问题。ReLU是几乎所有情况下的最佳解决方案。凯,谢谢你,我会用这个试试!我是否也使用此函数的导数来计算错误_delta
,因为它只是0
或1
,这对我来说有点奇怪。是的。你必须这么做。有一些修改版本的ReLU,但我认为简单的ReLU很适合。我尝试使用新的ReLU函数,但它总是向我返回0个向量。我把来自神经网络的代码添加到问题中。如果你能看一下就好了。