Keras神经网络输出函数参数/如何构造损失函数?

2024-03-19 05:09:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究基于Keras/TensorFlow的神经网络。我想做点不同的事。在

通常,网络的输出层产生一个输出张量(即数字列表)。然后使用损失函数(如均方误差)将这些数字直接与训练数据的目标列表(标签)进行比较。在

但是,我希望网络的输出层是作为函数参数的一系列数字。函数对这些参数进行操作以生成新的数字列表。然后,损失函数变成函数输出和标签之间的MSE(而不是通常情况下,输出层和标签之间的MSE)。在

我知道我需要编写一个Keras自定义丢失函数,它从输出层值计算目标函数的值,然后计算并返回目标函数输出和标签之间的MSE。我还意识到所有这些都需要在张量流图中完成,并且目标函数需要是可微的,这样才能计算梯度。我相信我对这一切都很了解。在

这是我无法理解的。假设在输出层有四个神经元-分别称为a,b,c,d,每个神经元都是目标函数F(a,b,c,d)的独立参数。假设我迭代F(a,b,c,d)20次,得到一组20个值。也就是说,F(a,b,c,d,1);F(a,b,c,d,2);等等,那么我只想取这20个值和对应标签张量中的20个值之间的MSE。这就是损失函数。在

我只是不太了解Keras/Tensorflow后端,不知道如何获得输出张量的各个元素。如何处理这个张量中的第零个、第一个、第二个等元素,以便我可以用它们来计算函数值?我知道如何对整个张量执行操作,但不知道如何处理单个张量元素。在

我希望我已经把这个问题解释清楚了。在

谢谢你的帮助!在


Tags: 函数网络元素目标列表参数tensorflow数字
1条回答
网友
1楼 · 发布于 2024-03-19 05:09:37

由于预测结果和标签的形状必须相同,我们应该创建一个完整的模型,包含您想要的函数(而不是将函数留给loss函数)。在

稍后我们可以获取前一层的输出,这将是所需的参数。在

所以,假设你已经准备好了模型到输出参数的层(很可能是一个Dense(4),它将为每个输入样本输出4个参数)。在

让我们在它后面添加两个lambda层。在

  • 一个用于输出4个独立于样本的唯一参数,因为您稍后将要检索它们
  • 一个是实际函数a*sin(bx + c) + d

所以:

#add them to your model the usual way you do
model.add(Lambda(getParameters,output_shape=(4,),name='paramLayer'))
model.add(Lambda(yourFunction,output_shape=(1,),name='valueLayer'))

其中:

^{pr2}$

现在你可以训练这个模型通过标签。在

当您要检索四个参数时,需要另一个模型,该模型在前面结束:

from keras.models import Model

paramModel = Model(model.inputs,model.get_layer('paramLayer').output)
params = paramModel.predict(testOrTrainData)

结果的形状将类似(20,4),但所有20行都将重复。在

相关问题 更多 >