Machine learning Can神经网络输出数字>;1.

Machine learning Can神经网络输出数字>;1.,machine-learning,neural-network,deep-learning,artificial-intelligence,Machine Learning,Neural Network,Deep Learning,Artificial Intelligence,通常在训练网络从给定数据中选择两个值时,2我注意到的事情 1。)每个决策使用两个输出神经元,并通过偏向具有较高值的神经元,做出+ve决策 2.针对某个阈值(例如0.5)的每个决策都有一个神经元,因此通过检查神经元是否输出值=0.5来做出+ve决策 比如说,人们希望网络根据输入数据进行预测,比如每次从给定图像预测形状的质心,除了使输出神经元成为可能的结果数(这肯定是由于x,Y值对可能导致的像素总数x2) 具体来说,如何使输出神经元激发,例如(432,50)作为质心在这种情况下说可能的质心(X,Y)

通常在训练网络从给定数据中选择两个值时,
2
我注意到的事情

1。)每个决策使用两个输出神经元,并通过偏向具有较高值的神经元,做出+ve决策

2.针对某个阈值(例如
0.5
)的每个决策都有一个神经元,因此通过检查神经元是否输出值=
0.5
来做出+ve决策

比如说,人们希望网络根据输入数据进行预测,比如每次从给定图像预测形状的质心,除了使输出神经元成为可能的结果数(这肯定是由于
x,Y
值对可能导致的像素总数x
2


具体来说,如何使输出神经元激发,例如(
432,50
)作为质心在这种情况下说可能的质心(
X,Y
)坐标是从
0
450
[换句话说,人工神经元可以被建模成类似的行为吗?如果不是,那么为什么]

您可以将[0,1]输出缩放到所需的范围

如果希望输出为X∈ [0500]和Y∈ [0500],您可以有两个同时输出[0,1]的输出,并将每个结果乘以500

您还应该将输入数据缩放到某个统一的范围。一些功能要求输入在特定范围内(例如[0,1]),例如,在[0,10]和[01000]中有一些输入集可能会混淆网络,或者在不同范围内有不同的特征可能会使网络更难适当地加权特征


如果您的输出与输入在同一范围内,则通过缩放输入的多少来确定,也将通过缩放输出的多少来告诉您。

您的问题包含两个部分

1.)神经网络能像奶奶一样学习概念吗。答案是肯定的,但是,所采取的方法通常与您所描述的不同。ML的分支称为表征学习。简单来说,典型的概念如下:用一个向量来描述所有的概念。向量的每个条目对应于神经网络的一个神经元。然而,概念并不能直接映射到单个神经元上。有人可以强制执行,但这毫无意义

2.)神经网络可以预测数字。实际上,就像在另一个答案中一样,您可以使用输出规范化——这是将目标值映射到数字范围0-1,然后进行反规范化。然而,这有一个缺点,那就是神经网络需要很长时间才能收敛到极值。另一种更简单的方法是使用神经网络进行回归。其思想基本上是在输出层中不使用像relu这样的挤压函数,而是使用例如线性激活函数。 例如,以下函数使用Keras预测
iris
中的两列

iris = load_iris()
idf = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                     columns= iris['feature_names'] + ['target'])

X = idf[["sepal length (cm)","sepal width (cm)","target"]] #this is ugly including class not ordinal
Y = idf[["petal length (cm)","petal width (cm)"]]
model = Sequential()
model.add(Dense(8, input_dim=3,
                activation='relu'))
model.add(Dense(16, activation='softmax'))
model.add(Dense(2, activation='linear'))
model.compile(loss='mse', optimizer='adam', metrics=['mae'])
model.fit(X.values, Y.values, epochs=1000, verbose=1)
Yp = model.predict(X.values)
#print([Y.iloc[:,0],Y.iloc[:,1],Y.iloc[:,0]-Yp[:,0],Y.iloc[:,1]-Yp[:,1]])
plt.scatter(Y.iloc[:,0].values,
                        Y.iloc[:,1].values)
for (x,y,dx,dy) in  zip(Y.iloc[:,0].values,
                        Y.iloc[:,1].values,
                        (Y.iloc[:,0].values-Yp[:,0]),
                        (Y.iloc[:,1].values-Yp[:,1])):
    #print(str(x)+" "+str(y)+" "+str(dx)+" "+str(dy))
    plt.arrow(x,y,dx,dy)
plt.show()

您可以让0和1表示数值的二进制位置。假设你有10个输出神经元,那么你可以得到2^10(1024)的值。或者,您可以让十进制值表示1000个乘数,这意味着0.5表示500,1.0表示1000等。您应该了解NN的工作原理,检查:(请特别参阅线性回归)您提到的设置范围不是因为节点,而是因为节点上的激活,也就是说,softmax或Sigmoid或其他类似的函数本身的范围为0到1,如果您不使用激活,那么您的结果将不会受到限制。如果您偶然发现这个问题而没有任何满意的答案,请检查,我不太明白您的答案。我明白你的意思了,如果范围是从0到500,我应该将输出缩放500。因此,如果输出为0.999,这就是
0.999*500
,但我不太明白,根据上面的问题,这对于获得质心的训练是如何起作用的。我的意思是,如果使用一个热标签编码,标签会是什么样子?例如,如果3幅图像的质心是(234300),(300200)和(420480),那么标签会是什么样子,显然绝对不是[0,1],[1,0],[0,1],对吗?@LiNKeR您的训练标签不必只有0或1(嗯,它可能是,取决于您正在使用的实现,但它不是一般规则)。您可以考虑输出与标签之间的距离(<代码> ABS(输出标签)< /代码>)为了训练,我又看了一遍,然后我意识到我没有完全理解你的解释。如果我理解你的意思,我应该只有两个输出神经元,它们的结果必须乘以500,对吗?例如,如果输出结果,例如
X(0.689)
Y(0.42)
这将是
X(500*0.689=345)
Y(500*0.42=210)
,因此这是否意味着我针对这个特定xy值对的训练输出标签将是实数[
345210
]或分数[
0.689,0.42
]@链接器是的,2个输出神经元,将结果乘以500。对于训练标签,可能是[0,1]范围内的数字,尽管这可能取决于实现。只需确保在正确的位置使用正确的刻度-您不希望将乘以500的神经网络输出与未乘以500的训练数据进行比较,也不希望在一个刻度中传递期望另一个刻度的值(例如,反向传播可能期望错误值介于0和1之间)。