单线程影响 TensorFlow Keras 后端的模型准确性和损失

2024-01-03

Question

为什么在 Keras 的 TensorFlow 后端设置线程数,intra_op_parallelism_threads and inter_op_parallelism_threads, 到 1 对模型的准确性和损失产生负面影响?

背景

我正在使用 Keras (2.1.6) 训练 MNIST CNN,并以 TensorFlow (1.7.0) 作为后端。我在 AWS EC2 实例中运行一些训练,发现从 t2.medium 实例切换到 t2.small 后,我的准确性大大下降。发生这种情况时根本没有更改两种实例类型之间的代码。

鉴于 CPU 核心数量从 t2.medium(2 核心)变为 t2.small(1 核心),我假设精度的下降与线程有关。为了测试这一点,我强制 TensorFlow 使用单线程并在本地运行训练。

from keras import backend as K
config = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)

sess = tf.Session(graph=tf.get_default_graph(),config=config)
K.set_session(sess)

在我的本地计算机上,使用单线程运行比运行多线程产生的结果要差得多。

一次单线程训练运行的结果是:

train_loss: 2.303228187561035 train_accuracy: 10.75%

而多线程训练运行的结果是:

train_loss: 0.3670464503765106 train_accuracy: 88.00%

这些结果对我来说没有意义,因为在我看来,无论使用多少线程,运行一定数量的训练周期都应该导致相同数量的计算工作。我的测试结果似乎表明,更多的线程会进行更多的训练,而不仅仅是使用并行性来提高速度。

我浏览了 GitHub 中的 Keras 存储库,但没有找到任何代码让我明白为什么结果会如此不同。

我正在给 Keras 打电话model.fit()训练模型并model.evaluate()以获得损失和准确性。

以下是我的一些超参数:

loss_function: categorical_crossentropy
optimizer: Adadelta
epochs: 12
mini_batch_size: 128
train_size: 600
validate_size: 400

更新 2018 年 6 月 26 日

我想独立于我自己的代码来测试更多线程的准确性的提高,所以我运行了Keras MNIST CNN https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py并在此基础上做了一些改变喀拉斯常见问题解答 https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development关于可重复开发。我的测试代码可以在这里看到gist https://gist.github.com/mistersdevelopment/0b30e4b82bc91f7c1bba5a8bc6e0ba52。要点中两个 Python 文件之间的唯一区别是第 80、90 和 91 行。取消注释这些行会强制 TensorFlow 后端在单个线程上运行。

I ran mnist_cnn_single_threaded.py三次并且mnist_cnn_multi_threaded.py三次。结果可以在同一个中看到gist https://gist.github.com/mistersdevelopment/0b30e4b82bc91f7c1bba5a8bc6e0ba52#file-testing_results-txt。它们与我昨天在本地和 EC2 中运行我自己的模型时发现的结果相符。

测试结果

以下是我根据 NPE 评论的测试结果。使用显式设置但默认运行tf.ConfigProto()产生与根本不设置线程值类似的结果。在下面的图表和表格中,“线程”等于设置两者intra_op_parallelism_threads and inter_op_parallelism_threads到指定值。

                  Loss and Accuracy vs Threads

Threads   Test Loss     Test Accuracy
1         2.300546171   0.1141
2         0.060040779   0.9806
4         0.060651763   0.9805
6         0.06015457    0.9808
8         0.057530957   0.9819

唯一在准确性和损失方面产生显着差异的情况是将线程显式设置为 1。

更新 2018 年 6 月 27 日

这似乎只是 Keras 的 TensorFlow 后端的问题。我尝试使用 Theano 后端进行测试,使用以下选项强制使用单线程,但我没有注意到准确性/丢失问题。

os.environ['OMP_NUM_THREADS'] = '1'
os.environ['THEANO_FLAGS'] = "device=cpu,force_device=True,openmp=False"

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单线程影响 TensorFlow Keras 后端的模型准确性和损失 的相关文章

  • 如何并行安装/编译 pip 要求(使 -j 等效)

    我的 pip 要求中有很多软件包需要安装 我想并行处理它们 我知道 例如 如果我想要n并行作业来自make我必须写make j n 是否有满足 pip 要求的等效命令 Thanks 有时 pip 使用 make 来构建依赖项 如果在开始之前
  • 如何在仍然使用 unique = True 的同时允许 ModelForm 中的空字段?

    目前在models py I have class ModelName models Model rowname models CharField max length 100 blank True unique True 就确保相同的值不
  • 在 opencv 中一次性将旋转和平移结合起来

    我有一段用于旋转和平移图像的代码 Point2f pt 0 in rows double angle atan trans c trans b 180 M PI Mat r getRotationMatrix2D pt angle 1 0
  • 字符串中数字的连续相加

    我是一名正在学习 python 的新程序员 并且在如何完成此任务方面遇到了困难 所以本质上我有一个从文件导入的数字字符串需要读取 并且需要将第一个数字的总和添加到第二个数字并将其转换为正确的 ascii 字符 因此 例如 如果我正在读取字符
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 将 Python 字典中的键替换为唯一值

    a 0 PtpMotion 1 PtpMotion 2 LinMotion 3 LinMotion 4 LinMotion 5 LinMotion 6 LinMotion 7 LinMotion 8 LinMotion 9 PtpMotio
  • 组内条件计数

    我想在之后进行条件计数groupby 例如 按列的值分组A 然后计算每组中值出现的频率5出现在列中B 如果我整个过程都这样做DataFrame 只是len df df B 5 所以我希望我能做到df groupby A df B 5 siz
  • 无法启动 Windows 快捷方式

    我正在尝试使用 python 启动 Windows 我已经尝试了 os system subprocess call os startfile 等多种方法 但总是收到错误消息 指出路径不存在 我知道路径是正确的 因为我尝试在 CMD EXE
  • Python 中 Matlab 'fscanf' 的等价物是什么?

    Matlab函数fscanf 似乎很强大 python 或numpy 中是否有相同的等效项 具体来说 我想从文件中读取矩阵 但我不想迭代每一行来读取矩阵 类似的东西 来自 matlab 用于读取 2D 1000x1000 矩阵 matrix
  • 使用 python3 查找表情符号的宽度

    我尝试使用 python 中的模式打印字母 A def printA length height symbol a for i in range length for i in range height for i in range hei
  • 初始化整数变量以进行比较

    我正在学习麻省理工学院的开放课件课程计算机科学和 Python 编程简介 https ocw mit edu courses electrical engineering and computer science 6 0001 introd
  • XGBoostLibraryNotFound:在候选路径中找不到 XGBoost 库,您是否安装了编译器并在根路径中运行了 build.sh?

    我在移动 XGBoost 的 python package 目录时遇到这个问题 Traceback most recent call last File setup py line 19 in LIB PATH libpath find l
  • Python列表错误还是我错了?

    我构建了一个 3 级嵌套列表 run on Python 3 2 3 32 bit on Win 7 L2 list 0 for i in range 2 L3 list L2 for i in range 3 L4 list L3 for
  • Django Rest框架Json解析

    我想解析传入的POSTdjangoviews py 文件中的数据 发布数据 number 17386372 data banana apple grapes 这是我尝试读取上述传入数据的方法request views py class Fr
  • 禁用或限制 /o/applications(django rest 框架、oauth2)

    我目前正在使用 Django Rest 框架编写 REST API 并使用 oauth2 进行身份验证 使用 django oauth toolkit 我对他们俩都很满意 他们做的正是我想要的 然而 我有一个担忧 我正在将我的应用程序传递到
  • 使用缓存时计算“页面浏览量”或“点击量”

    我有一个叫做show board 在其中 除其他外 我增加了一个字段Board views每次运行时加 1 以计算页面浏览量 问题是当我在该视图上使用 cache page 装饰器时 Board views仅在每次生成新的缓存视图时才会增加
  • 从值数组中计算 sympy 表达式

    我正在尝试 sympy 但遇到了一个无法解决的问题 使用 scipy 我可以编写一个表达式并计算 x 值数组 如下所示 import scipy xvals scipy arange 100 100 0 1 f lambda x x 2 f
  • 在Python中设置Windows命令行终端标题

    我在 Windows 计算机上运行某个 Python 脚本的多个实例 每个实例都来自不同的目录并使用单独的 shell 窗口 不幸的是 Windows 为每个 shell 窗口提供了相同的名称
  • 使用 Pandas 来“applymap”来访问索引/列?

    解决以下 pandas 问题的最有效方法是什么 这是一个简化的示例 其中包含数据框中的一些数据 import pandas as pd import numpy as np df pd DataFrame np random randint
  • pyodbc 无法正确处理 unicode 数据

    我确实使用 pyodbc 成功连接了 MySQL 数据库 并且它可以很好地处理 ascii 编码的数据 但是当我打印使用 unicode utf8 编码的数据时 它引发了错误 UnicodeEncodeError ascii codec c

随机推荐