需求是使用pyqt5中的槽函数运行keras模型训练,为了不让工具在模型训练的过程中出现假死的现象,于是把训练操作放到单独的线程中运行,于是问题来了,训练操作在主线程运行时正常,但是界面假死,假若训练在单独的线程中运行就会出现下面这个问题。

  网上对此错误的解释是keras和TensorFlow的版本不对,但是并没有解释为什么,一开始我是怀疑的,为什么在主线程中能够正常运行,单独开一个线程时就不行了,这为什么是版本的问题?

  定位到错误代码的地方,如下图所示,问题是_SYMBOLIC_SCOPE这个对象没有value这个值。

  接着我们定位到_SYMBOLIC_SCOPE创建的位置,如下图所示,我们发现在这个_SYMBOLIC_SCOPE创建之后马上就给他赋值value。

  那问题来了为什么会出现value找不到呢?其实关键是_SYMBOLIC_SCOPE = threading.local()这个函数,作用就是将不同线程的值分隔开,即单独开一个线程运行时通过_SYMBOLIC_SCOPE是取不到另一个线程中给_SYMBOLIC_SCOPE添加的值。

  那么问题又来了,value值是在哪个线程中赋值的呢?如下图所示,其实我们可以发现当import keras的时候,会等待一会的时间,其实是TensorFlow会在后台起一个线程作为守护线程,守护线程执行上面的操作,当我们单独再起一个线程运行时,新的线程是无法取到守护线程赋予的value值,所以就会出错。具体为什么这样实现暂时还不清楚,反正就是多线程去运行keras是不可以,我甚至想过结束后台线程或者更改keras的代码,手动给_SYMBOLIC_SCOPE .value赋值,虽然程序可以正常运行,但是引入了不确定的风险。

  最后回头去思考版本的问题,出错的版本的2.3.1,然后找到一个2.2.4版本的keras去看代码发现没有_SYMBOLIC_SCOPE这个操作,所以使用这个版本后单独开一个线程是可以正常运行的。

  注意:

  1、keras版本更改之后可能会出现TensorFlow、Numpy报错现象,可能是版本不匹配,重新选择一个可用的版本即可,下面是我使用版本

keras == 2.2.4
TensorFlow == 1.13.1
Numpy == 1.16.0
python == 3.7

  2、出错的文件是keras/backend/tensorflow_backend.py,两个版本的此文件代码差异较大。

keras报错:AttributeError: '_thread._local' object has no attribute 'value'的更多相关文章

  1. ansible报错AttributeError: module 'urllib.request' has no attribute 'HTTPSHandler'

    报错内容: TASK [activemq : extract activemq tarball] *************************************************** ...

  2. py+selenium 明明定位不到元素,但却不报错或是报错AttributeError: 'list' object has no attribute 'click'【已解决】

    问题:定位不到元素,但却不报错或者出现报错AttributeError: 'list' object has no attribute 'click' 如图  或者  解决方法:   将”driver ...

  3. dnspython模块报错 AttributeError: 'CNAME' object has no attribute 'address'

    有时候用到这个模块的时候会报错 AttributeError: 'CNAME' object has no attribute 'address' 如下所示 [root@ansible ch01]# ...

  4. 关于moviepy打包报错AttributeError: module audio/video.fx.all has no attribute fadein、crop文章的纠错和抄袭

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 老猿前面有篇文章<moviepy应用pyin ...

  5. moviepy应用pyinstaller打包后执行报错AttributeError: module audio/video.fx.all has no attribute fadein、crop

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在开发moviepy的Python程序使用pyinstaller打包后 ...

  6. AttributeError: '_csv.reader' object has no attribute 'next'

    我在使用pyhon3.4运行以下代码时报错:AttributeError: '_csv.reader' object has no attribute 'next' import csv import ...

  7. AttributeError: 'sys.flags' object has no attribute 'utf8_mode'

    AttributeError: 'sys.flags' object has no attribute 'utf8_mode' pycharm工程的py版本是3.6,结果即使使用py3.7编译后的py ...

  8. springboot项目启动报错Failed to configure a DataSource: 'url' attribute is not specified and no embedde

    springboot项目启动报错Failed to configure a DataSource: 'url' attribute is not specified and no embedde 创建 ...

  9. 关于flask登录视图报错AttributeError: '_AppCtxGlobals' object has no attribute 'user'

    在一个小程序中写了一个登录视图函数,代码如下: @app.route('/login',methods = ['GET','POST']) @oid.loginhandler def login(): ...

随机推荐

  1. P3195 [HNOI2008] 玩具装箱(斜率优化DP)

    题目链接 设\(d[i]\)为将前 \(i\) 个玩具装入箱中所需得最小费用 容易得到动态转移方程: \[d[i] = min(d[j] + (s[i]-s[j]+i-j-1-L)^2), (j< ...

  2. Uva 10815 Andy's First Dictionary(字符串)

    题目链接:https://vjudge.net/problem/UVA-10815 题意 找出一段文本中的所有单词,以小写形式按照字典序输出. 思路 用空白符替换文本中所有非字母字符后再次读入. 代码 ...

  3. Codeforces Round #637 (Div. 2)

    比赛链接:https://codeforces.com/contest/1341 A - Nastya and Rice 题意 有 n 堆米,每堆质量在 [a-b,a+b] 之间,这些米的总质量是否可 ...

  4. zjnu1757Excellent (数学公式)

    Description Let us begin with a positive integer N and find the smallest positive integer which does ...

  5. hdu2157 How many ways??

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  6. fzu2200 cleaning

    Problem Description N个人围成一圈在讨论大扫除的事情,需要选出K个人.但是每个人与他距离为2的人存在矛盾,所以这K个人中任意两个人的距离不能为2,他们想知道共有多少种方法.  In ...

  7. hoj2430 Counting the algorithms

    My Tags   (Edit)   Source : mostleg   Time limit : 1 sec   Memory limit : 64 M Submitted : 725, Acce ...

  8. hdu2126 Buy the souvenirs

    Problem Description When the winter holiday comes, a lot of people will have a trip. Generally, ther ...

  9. C# Dictionary(字典)源码解析&效率分析

    通过查阅网上相关资料和查看微软源码,我对Dictionary有了更深的理解. Dictionary,翻译为中文是字典,通过查看源码发现,它真的内部结构真的和平时用的字典思想一样. 我们平时用的字典主要 ...

  10. springboot源码解析-管中窥豹系列

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...