【问题标题】:Keras: ValueError while doing predictions and accuracy is zeroKeras:进行预测时的 ValueError 和准确性为零
【发布时间】:2017-12-13 07:02:47
【问题描述】:

我在 Keras 中编写了以下模型,但是在进行预测时,我遇到了 ValueError(在代码之后说明)。我查看了 StackOverflow 上的其他问题,但只找到了 this one,但我无法理解答案在说什么。

我正在尝试构建一个网络,它以 X 作为输入并隐藏 200 个神经元,最后是一个 sigmodial 神经元来预测输出类。目标是二分类。

模型的输入是 (n x 400) 作为 X 和 (n, 1) 作为 Y。X 和 Y 都是 numpy 数组。代码和错误信息如下。此外,神经网络的结果是:Loss = Infinite 和 Accuracy = 0.0,这意味着我这边的某些事情显然是错误的。

def create_baseline():
    # create model
    model = Sequential()
    model.add(Dense(200, input_dim=400, kernel_initializer='normal', activation='relu'))
    model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))
    # Compile model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

我训练模型如下:

estimator = KerasClassifier(build_fn=create_baseline, nb_epoch=5, batch_size=5, verbose=1)
estimator.fit(X, Y)

我尝试使用以下方法进行预测:

estimator.predict(X[0])

我收到以下错误:

ValueError: Error when checking : expected dense_34_input to have shape (None, 400) but got array with shape (400, 1)

编辑 1:训练数据 X 有 400 个特征(从文档的 word2vec 中学习)。 Y 是一个只有 0 和 1 的标签。我将训练文件读入 pandas 数据帧,然后使用dataframe.values 将 X 和 Y 获取为 numpy 数组。

编辑2:根据下面的答案,我从我的模型中预测为estimator.predict(train_X_vals[0].reshape(1,len(train_X_vals[0]))),我得到以下输出:array([[ nan]], dtype=float32)

编辑 3:我从训练集中预测 1000 个 X 的值,我得到所有这些作为 nan。

编辑 4:我有大约 25 万个训练样本。使用所有这些样本后,我得到 loss = nan 和所有预测为 nan。但是当我抽取 2000 个样本时,我开始得到很好的值。

编辑 5:我的模型似乎无法处理超过 2500 个训练样本。我尝试增加训练规模,在 3000 或更多时,一切都变成了 nan。

【问题讨论】:

  • 你能在这里提供完整的代码,包括一些数据 X,Y 吗? (不一定是您的具体数据,它可能只是一个玩具示例,以便读者能够运行您的代码)

标签: python keras keras-layer


【解决方案1】:

关于您得到的错误 - 当您指定输入维度时,您指定列数,在您的情况下为 400。但是,x[0] 只是一个向量,因此它的维度不是 (None, 400) 形式的维度,而是 (400, 1)。例如,如果您定义

x=np.random.rand(20,400)

x[0].shape 的结果是(400L,)

所以你需要相应地重塑你的x[0],例如通过x[0].reshape(1,len(x[0]))

【讨论】:

  • 这是否意味着模型正在被完美地训练?因为我看到 accuracy = 0 和 Loss = nan(相当于 Inf)。
  • 我不这么认为,(如果你在做分类并且模型是完美的,准确率应该是 1.0)。但是如果不能运行您的代码,就很难说发生了什么。如果你能提供一些 X 和 Y 的例子,那会很有帮助。
  • 更新问题。
  • 在我看来,问题与您使用的特定数据有关。我用 X=np.random.rand(10,400) 和 Y=np.random.randint(0,2,10) 运行您的代码,我得到了合理的损失和准确性(它们都是数字而不是 nan)。您能否提供对您的特定数据的访问权限?
  • 我有大约 250K 的训练样本。使用所有这些样本后,我得到 loss = nan 和所有预测为 nan。但是当我抽取 2000 个样本时,我开始得到很好的值。所有功能都在0.0-1.00之间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2020-10-17
  • 1970-01-01
  • 2017-10-02
  • 2016-06-03
  • 2021-02-08
  • 2012-08-26
相关资源
最近更新 更多