Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 限制神经网络回归(Keras)中的输出总和_Python_Tensorflow_Keras_Activation Function - Fatal编程技术网

Python 限制神经网络回归(Keras)中的输出总和

Python 限制神经网络回归(Keras)中的输出总和,python,tensorflow,keras,activation-function,Python,Tensorflow,Keras,Activation Function,我预测了7个目标,这是一个值的比率,所以对于每个样本,所有预测值的总和应该是1。 除了在输出端使用softmax(这显然是不正确的),我无法找到其他方法来限制所有预测输出的总和为=1.. 谢谢你的建议 input_x = Input(shape=(input_size,)) output = Dense(512, activation=PReLU())(input_x) output = Dropout(0.5)(output) output = Dense(512, activation=PR

我预测了7个目标,这是一个值的比率,所以对于每个样本,所有预测值的总和应该是1。 除了在输出端使用
softmax
(这显然是不正确的),我无法找到其他方法来限制所有预测输出的总和为=1..
谢谢你的建议

input_x = Input(shape=(input_size,))
output = Dense(512, activation=PReLU())(input_x)
output = Dropout(0.5)(output)
output = Dense(512, activation=PReLU())(output)
output = Dropout(0.5)(output)
output = Dense(16, activation=PReLU())(output)
output = Dropout(0.3)(output)
outputs = Dense(output_size, activation='softmax')(output)
#outputs = [Dense(1, activation=PReLU())(output) for i in range(output_size)] #multioutput nn

nn = Model(inputs=input_x, outputs=outputs)
es = EarlyStopping(monitor='val_loss',min_delta=0,patience=10,verbose=1, mode='auto')
opt=Adam(lr=0.001, decay=1-0.995)
nn.compile(loss='mean_absolute_error', optimizer=opt)
history = nn.fit(X, Y, validation_data = (X_t, Y_t), epochs=100, verbose=1, callbacks=[es])

目标示例:

因此,这是一个特征的所有比率,每行的总和=1。
例如,要素—“总计”=100分,A=25分,B=25分,所有其他要素—10分。因此,我的7个目标比率将为0.25/0.25/0.1/0.1/0.1/0.1/0.1/0.1


我需要训练和预测这样的比率,所以在未来,知道‘总计’我们可以从预测的比率中恢复分数。

我想我理解你的动机,以及为什么“softmax不会削减它”

这是因为softmax不会线性缩放,因此:

>>> from scipy.special import softmax
>>> softmax([1, 2, 3, 4])
array([0.0320586 , 0.08714432, 0.23688282, 0.64391426])
>>> softmax([1, 2, 3, 4]) * 10
array([0.32058603, 0.87144319, 2.36882818, 6.4391426 ])
看起来与原始数组完全不同

但不要太轻易地忽略softmax-它可以处理诸如负值、零、预激活信号的零和等特殊情况。。。但是,如果您希望将最终回归标准化为1,并期望结果为非负,您可以简单地将其除以总和:

input_x = Input(shape=(input_size,))
output = Dense(512, activation=PReLU())(input_x)
output = Dropout(0.5)(output)
output = Dense(512, activation=PReLU())(output)
output = Dropout(0.5)(output)
output = Dense(16, activation=PReLU())(output)
output = Dropout(0.3)(output)
outputs = Dense(output_size, activation='relu')(output)
outputs = Lambda(lambda x: x / K.sum(x))(outputs)

nn = Model(inputs=input_x, outputs=outputs)

当然,
密集
层需要不同于
'softmax'
的激活(relu或甚至线性都可以)。

你能写下这个比率是如何构造的,应该如何预测的吗?我不清楚为什么softmax在这种情况下是错误的。softmax可以生产这些口粮,我也不明白为什么这样做是错误的。是的,它正在生产,但似乎这不是最好的选择。如果我用relu将最后一层作为多输出,我会在MAE,RMSE上得到更好的分数。尽管它并不总是预测比率的总和=1,并且我不能从这个比率中恢复实际的点。它产生不同的性能并不意味着它是错误的,我认为最终你不会有编程问题。在查看损失和度量之前,您必须确保其预测正确。当然,为了使此体系结构有意义,培训和验证集(
Y
Y\u t
)也应该具有此属性-每行的总和应为=1。谢谢!我将尝试比较这两种情况。最终回归解决方案失败-无法收敛。一个缺点是,使用此Lambda层,您无法将结果模型导出为其他格式,例如将其移植到Deep Learning 4 Java。真遗憾,在Keras中没有标准的“除以和”激活可以导出为标准层。类似于其他一些操作,如数据的对数和百分位数阈值化,这些操作都需要不可移植的lambda。