我有一个模型,它有几个密集层,在各个方面都表现正常。
然后,我将权重添加到训练事件中(它们的值在0和1之间(:
w = mydata.Weight
#...
kfold = GroupKFold(n_splits=num_folds)
for train, test in kfold.split(X, y, groups=groups):
X_train, X_test = X.iloc[train], X.iloc[test]
y_train, y_test = y.iloc[train], y.iloc[test]
w_train = w.iloc[train]
#...
le_fit = model.fit(X_train, y_train, batch_size=200, epochs=10, sample_weight=w_train, verbose=0)
#...
predictions = np.rint(model.predict(X_test))
预测变得毫无用处:
InvalidArgumentError: `predictions` contains negative values
Condition x >= 0 did not hold element-wise:
x (confusion_matrix_1/Cast:0) =
[-9223372036854775808 .......
为了安全起见,我在层中添加了约束,例如:
layers.Dense(units=800, activation='relu', kernel_constraint=constraints.MinMaxNorm(min_value=0.0, max_value=1.0))
但一切都没有改变。
你能告诉我出了什么问题吗?
编辑:我现在才意识到,这次训练失利也是一个楠。
编辑:我使所有权重等于一。结果不会改变。
编辑:我不知道为什么这个问题被关闭为要求调试。答案表明这与调试无关。它是关于两个非常常用的项目(Keras with GroupKFold(的正确使用,结果发现它包含了一个反直觉的元素,并且它不是特定于问题的。
我会尝试打印样本,看看是否有错误的样本。此外,我会尝试在层之间添加规范化,或者尝试使用更简单的数据(比如生成你认为你的机器肯定应该学习和预测的虚拟数据,并检查你的机器是否在学习一些东西(。
问题是sample_weight
采用np.array作为输入,但w_train
是ndarray。
它是通过显式创建一个数组来解决的:
w_train_tmp = w.iloc[train]
w_train = np.array(w_train_tmp)
注意:我知道np.array和ndarray在技术上是一样的。如果有人能澄清为什么他们没有在这种情况下,你是最受欢迎的。