Keras 误解了训练数据的形状

Posted

技术标签:

【中文标题】Keras 误解了训练数据的形状【英文标题】:Keras misinterprets training data shape 【发布时间】:2018-02-19 00:23:02 【问题描述】:

我的训练数据格式为 (?,15) where ?是可变长度。

在创建我的模型时,我会指定:

inp = Input(shape=(None,15))
conv = Conv1D(32,3,padding='same',activation='relu')(inp)
...

我的训练数据的形状为 (35730,?,15)。

在python中检查这个我得到:

X.shape

输出:(35730,)

X[0].shape

输出:(513, 15)

当我尝试将我的模型拟合到我的训练数据上时,我得到了 ValueError:

Error when checking input: expected input_1 to have 3 dimensions, but got array with shape (35730, 1)

我只能通过对单个样本使用 model.train_on_batch() 来训练我的模型。

我该如何解决这个问题?似乎 keras 认为我的输入数据的形状是 (35730, 1),而实际上它是 (35730, ?, 15)

这是 keras 中的错误还是我做错了什么?

如果这很重要,我正在使用 tensorflow 后端。这是 keras 2

【问题讨论】:

【参考方案1】:

(已编辑,根据 OP 对此问题的评论,他们发布此链接的位置:https://github.com/fchollet/keras/issues/1920)


您的 X 不是单个 numpy 数组,它是一个数组数组。 (否则它的形状将是X.shape=(35730,513,15)

对于 fit 方法,它必须是单个 numpy 数组。由于你有一个可变长度,你不能有一个包含所有数据的 numpy 数组,你必须将它分成更小的数组,每个数组包含相同长度的数据。

为此,您可能应该按形状创建字典,然后手动循环字典(可能还有其他更好的方法...):

#code in python 3.5
xByShapes = 
yByShapes = 
for itemX,itemY in zip(X,Y):
    if itemX.shape in xByShapes:
        xByShapes[itemX.shape].append(itemX)
        yByShapes[itemX.shape].append(itemY)
    else:
        xByShapes[itemX.shape] = [itemX] #initially a list, because we're going to append items
        yByShapes[itemX.shape] = [itemY]

最后,你循环这个字典进行训练:

for shape in xByShapes:
    model.fit(
              np.asarray(xByShapes[shape]), 
              np.asarray(yByShapes[shape]),...
              )

屏蔽

或者,您可以使用零或一些虚拟值填充数据,使所有样本具有相同的长度。

然后,您可以在模型中的任何内容之前添加一个Masking 层,该层将忽略这些填充段。 (警告:某些类型的图层不支持遮罩)

【讨论】:

卷积层不需要静态输入形状(通道数除外),我的网络是完全卷积的。 github.com/fchollet/keras/issues/1920 你可以在这里阅读更多关于这些东西的信息。我需要我的数据长度可变。我以前使用过具有不同大小图像的卷积网络,它工作得完美无缺。我今天会更乱,如果我找到解决方案,我会在这里回复! 很高兴知道!! -- 基于这个链接,我更新了我的答案。 非常感谢!真的很感激!我现在完全明白为什么批量训练不起作用了 所以,如果这个答案没问题,请将其标记为已回答,以便其他用户可以从这个问题和答案中受益。 @user3537014 你能告诉我在这种情况下我的时期数应该是多少,因为在我的情况下,数据是在一个非常少的样本上训练的,一次最多 4 个?跨度>

以上是关于Keras 误解了训练数据的形状的主要内容,如果未能解决你的问题,请参考以下文章

由于numpy形状张量流,keras无法训练模型

Keras 为多层感知器正确输入形状

使用 Keras 模型进行预测时出错

如何在 Keras 中的预训练 InceptionResNetV2 模型的不同层中找到激活的形状 - Tensorflow 2.0

在 Keras 中训练对象检测模型时出现不兼容张量形状的问题

在构建和训练 3D Keras U-NET 时遇到 ValueError