为什么带有sample_weight的keras model.fit初始化时间很长?

boo*_*ees 7 python machine-learning keras tensorflow

我使用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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Luc*_*tti 9

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

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

model.fit(x_train.iloc, y_train, sample_weight=pd.Series(w_train))
Run Code Online (Sandbox Code Playgroud)

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