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 误解了训练数据的形状的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Keras 中的预训练 InceptionResNetV2 模型的不同层中找到激活的形状 - Tensorflow 2.0