首页 > 解决方案 > 为什么 keras model.fit 和 sample_weight 初始化时间长?

问题描述

我正在使用kerastensorflow版本 2.2.0)后端来训练分类器以区分两个数据集 A 和 B,我将它们混合到 pandas DataFrame 对象x_train(有两列)中,并在 numpy array 中使用标签y_train。我想进行样本加权以说明 A 的样本远多于 B 的事实。此外,A 由两个数据集 A1 和 A2 组成,其中 A1 比 A2 大得多;我也想用我的样本权重来解释这个事实。我在一个名为 的 numpy 数组中有样本权重w_train。有大约 1000 万个训练样本。

这是示例代码:

model = Sequential()
model.add(Dense(64, input_dim=x_train.shape[1], activation='relu')) 
model.add(Dropout(0.1))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(x_train.iloc, y_train, sample_weight=w_train)

当我使用 中的sample_weight参数时model.fit(),我发现模型拟合初始化(即在keras开始显示训练进度之前发生的任何事情)需要很长时间,等待的时间太长。当我将数据集限制为 1000 个样本时,问题就消失了,但是当我增加到 100000 或 1000000 个样本时,我注意到初始化和拟合时间存在显着差异,所以我怀疑这与数据的方式有关正在加载。然而,仅仅添加sample_weights参数会导致如此大的时间差异似乎很奇怪。

其他信息:我正在使用 Jupyter 笔记本在 CPU 上运行。

这里有什么问题?有没有办法让我修改训练设置或其他东西以加快初始化(或训练)时间?

标签: pythontensorflowmachine-learningkeras

解决方案


该问题是由 TensorFlow 如何验证某种类型的输入对象引起的。当数据肯定正确时,这样的验证完全是浪费时间的支出(我希望将来会处理得更好)。

为了强制 TensorFlow 跳过此类验证过程,您可以将权重简单地包装在Pandas Series中,如下所示:

model.fit(x_train.iloc, y_train, sample_weight=pd.Series(w_train))

请注意,在您的代码中,您使用的是metrics关键字。如果您希望准确度在提供的权重上实际加权,请改用该weighted_metrics参数。


推荐阅读