当前位置: 首页 > 面试题库 >

Keras误解了训练数据的形状

董喜
2023-03-14
问题内容

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

创建模型时,请指定以下内容:

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,?,15)是(35730,1)

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

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


问题答案:

(根据OP对这个问题的评论进行了编辑,他们在此发布了此链接:https
:
//github.com/fchollet/keras/issues/1920)

X不是单个numpy数组,而是一个数组数组。(否则其形状为X.shape=(35730,513,15)

该方法必须是单个numpy数组fit。由于长度是可变的,因此不能有一个包含所有数据的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将忽略这些填充段的图层。(警告:某些类型的图层不支持遮罩)



 类似资料:
  • 问题内容: 因此,我一直遵循Google的官方tensorflow指南,并尝试使用Keras构建一个简单的神经网络。但是,在训练模型时,它不使用整个数据集(具有60000个条目),而是仅使用1875个条目进行训练。有可能解决吗? 输出: 这是我一直在为此工作的原始Google colab笔记本:https ://colab.research.google.com/drive/1NdtzXHEpiN

  • 问题内容: 我想知道是否有可能保存经过部分训练的Keras模型并在再次加载模型后继续进行训练。 这样做的原因是,将来我将拥有更多的训练数据,并且我不想再次对整个模型进行训练。 我正在使用的功能是: 编辑1:添加了完全正常的示例 对于10个纪元后的第一个数据集,最后一个纪元的损失将为0.0748,精度为0.9863。 保存,删除和重新加载模型后,第二个数据集上训练的模型的损失和准确性分别为0.171

  • 问题内容: 我正在将Kears与tensorflow一起使用,并且我有一个3输出的模型,我只想训练2个输出。 我尝试使用上面的代码来执行此操作,但是我不确定它是否可以执行我想要的操作。因此,我认为这会加总损失,并且会用该损失来训练每个输出,而我根本不希望进行训练。(我需要,因为它用于测试)。谁能告诉我如何实现这一目标或让我确信代码实际上满足了我的需求? 问题答案: 您必须创建2个这样的不同模型 您

  • /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:174:不推荐使用名称tf.get_default_session。请改用tf.compat.v1.get_default_session。 /usr/local/lib/python3.6/dist-packages/keras/backend/t

  • 问题内容: 我想跑 分句。没有训练模型,因此我将单独训练模型,但是我不确定我使用的训练数据格式是否正确。 我的训练数据是每行一句话。我找不到与此有关的任何文档,只有此线程(https://groups.google.com/forum/#!topic/nltk- users/bxIEnmgeCSM )揭示了一些有关训练数据格式的信息。 句子标记器的正确训练数据格式是什么? 问题答案: 嗯,是的,P

  • 问题内容: 我像这样使用scikit-learn的SVM: 我的问题是,当我使用分类器预测训练集成员的班级时,即使在scikit- learns实现中,分类器也可能是错误的。(例如) 问题答案: 是的,可以运行以下代码,例如: 分数是0.61,因此将近40%的训练数据被错误分类。部分原因是,即使默认内核是(理论上也应该能够对任何训练数据集进行完美分类,只要您没有两个带有不同标签的相同训练点),也可