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

Posted

技术标签:

【中文标题】如何在 Keras 中训练网络以适应不同的输出大小【英文标题】:How to train a network in Keras for varying output size 【发布时间】:2017-10-07 16:22:04 【问题描述】:

我有使用 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 作为它们的大小。如何修改网络,使其可以训练并输出向量向量(坐标列表)?

【问题讨论】:

【参考方案1】:

循环神经网络 (RNN) 会更合适,这种模型通常称为 seq2seq,即序列到序列。循环网络使用 LSTM 和 GRU 等层,并且可以输入和输出可变长度序列。看看用 RNN 完成的机器翻译之类的事情吧。

这可以直接用 keras 完成,网上有很多例子,例如this 一个。

【讨论】:

你有只使用 keras 的例子吗? 他一般不是在问变量输出模型,而是关于坐标预测的问题。这让我相信数据集是由图像组成的。序列到序列模型无法解决他的问题。【参考方案2】:

一个 rnn 不是你想要的预测坐标。相反,我建议使用预测坐标和相关置信度的模型。因此,每次通过模型的前向传递都会有 100 个坐标预测。这些预测中的每一个都会有另一个相关的预测来确定它是否正确。只有高于某个置信度阈值的预测才会计算在内。该置信度阈值允许模型每次选择它想要使用的点数(最大数量由输出数量设置,在本例中为 100)。

r-cnn 就是这样做的模型。这是我在 github https://github.com/yhenon/keras-frcnn 上找到的第一个 keras 实现。

【讨论】:

以上是关于如何在 Keras 中训练网络以适应不同的输出大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中使用预训练的 CNN 实现连体网络?

Keras训练神经网络进行分类并使用GridSearchCV进行参数寻优

全卷积网络 - 训练数据中不同大小的图像

如何在 Keras 中将顺序模型添加到预训练模型?

在没有确切答案的情况下如何训练神经网络? [关闭]

如何在 Keras 中保存经过训练的模型以在应用程序中使用它?