如何在Keras中训练网络以适应不同的输出大小

6

我有一个使用Keras创建的基本神经网络。我成功地用数据向量和相应的输出数据进行了训练,输出数据是一个具有两个元素的向量,表示一个坐标(x,y)。因此,输入一个数组,输出一个数组。

问题在于,我无法使用训练数据,其中单个输入向量应对应多个坐标。实际上,我希望输出一个坐标向量,而不需要预先知道坐标的数量。

网络是这样创建的:

model = Sequential()
model.add(Dense(20, input_shape=(196608,)))
model.add(Dense(10))
model.add(Dense(2))

模型摘要显示每个层的输出维度

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
dense_1 (Dense)              (None, 20)                3932180
_________________________________________________________________
dense_2 (Dense)              (None, 10)                210
_________________________________________________________________
dense_3 (Dense)              (None, 2)                 22
=================================================================

我意识到网络结构只允许输出长度为2的向量。密集层也不接受None作为它们的大小。我该如何修改网络,使其能够在训练时输出一个向量列表(坐标列表)?

2个回答

4
一种递归神经网络(RNN)将更加合适,这些模型通常称为seq2seq,即序列到序列。递归网络使用像LSTM和GRU这样的层,可以输入和输出可变长度的序列。只需看看使用RNN完成的机器翻译等内容即可了解其效果。
这可以直接使用keras完成,在互联网上有许多示例,例如此链接

你有使用Keras的示例吗? - Daniel Möller
1
他并不是在一般地询问变量输出模型,问题是关于坐标预测的。这让我相信数据集由图像组成。序列到序列模型无法解决他的问题。 - Matt S

3
一个 rnn 并不适合用于预测坐标。相反,我建议使用一个可以预测坐标和相关置信度的模型。每次通过模型进行前向传递都会有 100 个坐标预测值。每个预测值都会有另外一个关联的预测来确定它是否正确。只有置信度高于某个阈值的预测才会被计算。这个置信度阈值允许模型在每次使用时选择要使用多少个点(此处最大值为输出数量,即 100)。
r-cnn 就是实现了这一点的模型。以下是我在 Github 上找到的第一个 keras 实现:https://github.com/yhenon/keras-frcnn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接