python - 为什么 keras model.fit 和 sample_weight 初始化时间长?
问题描述
我正在使用keras
(tensorflow
版本 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 上运行。
这里有什么问题?有没有办法让我修改训练设置或其他东西以加快初始化(或训练)时间?
解决方案
该问题是由 TensorFlow 如何验证某种类型的输入对象引起的。当数据肯定正确时,这样的验证完全是浪费时间的支出(我希望将来会处理得更好)。
为了强制 TensorFlow 跳过此类验证过程,您可以将权重简单地包装在Pandas Series中,如下所示:
model.fit(x_train.iloc, y_train, sample_weight=pd.Series(w_train))
请注意,在您的代码中,您使用的是metrics
关键字。如果您希望准确度在提供的权重上实际加权,请改用该weighted_metrics
参数。
推荐阅读
- python-3.x - 用于 MacOs 的 Python3 键盘记录器:脚本不起作用
- r - 有什么方法可以用 R 提取 pdf 表格整齐吗?
- flutter - Flutter:相机在 image_picker 包上不断停止错误
- azure-cosmosdb - 如何通过命令行填充 CosmosDB 集合?
- python - pip install 时不要复制所有文件
- jquery - 在 Sharepoint Framework (Microsoft Teams) webpart 中使用 DevExtreme 控件
- javascript - setWindowSize() · WebdriverIO 自己添加 1px - 测试因此失败
- amazon-web-services - 忘记 AWS 组织成员账户 IAM 角色名称
- java - 使用Java8计算字符串列表中每个单词的频率
- redis - Redis Cluster 插槽信息过多