在Keras中只训练网络的一个输出

在Keras中只训练网络的一个输出,keras,neural-network,theano,reinforcement-learning,q-learning,Keras,Neural Network,Theano,Reinforcement Learning,Q Learning,我在Keras有一个网络,有许多输出,但是,我的训练数据一次只提供单个输出的信息 目前,我的培训方法是对有问题的输入进行预测,更改我正在培训的特定输出的值,然后进行单批更新。如果我是对的,这与将所有输出的损耗设置为零相同,除了我试图训练的输出 有更好的办法吗?我试过在课堂上给所有人设置一个零权重,除了我训练的输出,但它没有给我预期的结果 我正在使用Theano后端。为了实现这一点,我最终使用了“功能API”。基本上可以创建多个模型,使用相同的输入层和隐藏层,但不同的输出层 例如: 输出多个结果

我在Keras有一个网络,有许多输出,但是,我的训练数据一次只提供单个输出的信息

目前,我的培训方法是对有问题的输入进行预测,更改我正在培训的特定输出的值,然后进行单批更新。如果我是对的,这与将所有输出的损耗设置为零相同,除了我试图训练的输出

有更好的办法吗?我试过在课堂上给所有人设置一个零权重,除了我训练的输出,但它没有给我预期的结果


我正在使用Theano后端。

为了实现这一点,我最终使用了“功能API”。基本上可以创建多个模型,使用相同的输入层和隐藏层,但不同的输出层

例如:

输出多个结果并仅优化其中一个 假设您希望返回来自多个层的输出,可能来自一些中间层,但您只需要优化一个目标输出。以下是您如何做到这一点:

让我们从这个模型开始: 使用多个输出进行编译,对于额外输出,将损耗设置为
None
: 对于不希望用于损耗计算和优化的输出,给出
None

model = Model(inputs=inputs, outputs=[result, useful_info])
model.compile(optimizer='rmsprop',
              loss=['categorical_crossentropy', None],
              metrics=['accuracy'])
培训时仅提供目标输出。跳过额外输出: 有人预测会把他们都弄到手 拥有一个模型,您只能运行一次
predict
,以获得所需的所有输出:

predicted_labels, useful_info = model.predict(new_x)

对于监督学习来说,这是一个不常见的环境。展示一些示例数据,并解释一下为什么会有这种设置。我用它来进行深度Q学习。输入是一个状态,每个输出是一个动作的分数。选择一个操作,然后根据该操作的结果更新网络。但是,您只想更新一个输出,因为您不知道其他操作的结果…我明白了。这是不同的处理方式。请看(我在链接中标记了行)。您只需保留其他操作的当前值!我想实现一个具有多个输出(多任务学习)的类似CNN。我会在网络上运行输入(图像),得到其中一个输出;然后根据输出,选择其他输出之一以运行网络并获得最终输出。在培训中,我一次只更新一个流。我认为这是一个非常常见的问题,但奇怪的是,没有示例或文档来描述解决方案@你解决了你的问题了吗?如果是,怎么做?Thx.前几天我确实做了,我已经忘记了这篇文章。不过,今晚我会给出更详细的回答,在Keras中,你可以使用相同的层制作多个模型,在这些层中共享值(在我的脑海中,你需要使用“序列”的替代方案)。我基本上为每个共享层的输出创建了一个模型。它工作得很好。这里的问题是-您必须运行预测两次才能获得两个输出。@Serhiy他可以创建第三个
predictions=Concatenate()([predictions\u a,predictions\u B])
并将其设置为第三个模型的输出。不知何故,这在v2.3.0中不起作用,因为我得到了错误:
ValueError:这两个结构的序列长度不相同。输入结构的长度为1,而浅层结构的长度为3。
在尝试将此应用于我的网络时,我遇到以下错误:“ValueError:变量的梯度值为
None
。请确保所有操作都定义了梯度值(即可微)。没有梯度值的常见操作:K.argmax、K.round、K.eval。”我的tensorflow==1.14.0。我的损失是[无”,“绝对交叉熵”]@omsrisagar是的,我也是!你能找到解决办法吗?
model = Model(inputs=inputs, outputs=[result, useful_info])
model.compile(optimizer='rmsprop',
              loss=['categorical_crossentropy', None],
              metrics=['accuracy'])
model.fit(my_inputs, {'result': train_labels}, epochs=.., batch_size=...)

# this also works:
#model.fit(my_inputs, [train_labels], epochs=.., batch_size=...)
predicted_labels, useful_info = model.predict(new_x)