需求是使用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. KMP(算法描述)

    #include<iostream> using namespace std; const int N=10010,M=100010; int n,m; char p[N],s[M]; i ...

  2. Codeforces Round #570 (Div. 3) E. Subsequences (easy version) (搜索,STL)

    题意:有一长度为\(n\)的字符串,要求得到\(k\)不同的它的子序列(可以是空串),每个子序列有\(|n|-|t|\)的贡献,求合法情况下的最小贡献. 题解:直接撸个爆搜找出所有子序列然后放到set ...

  3. Codeforces Round #613 (Div. 2) C. Fadi and LCM (数学)

    题意:给你一个正整数\(x\),找两个正整数\(a\),\(b\),使得\(lcm(a,b)=x\),并且\(max(a,b)\)最小. 题解:我们知道,\(lcm(a,b)=a*b/gcd(a,b) ...

  4. Codeforces Round #654 (Div. 2) C. A Cookie for You (思维)

    题意:有\(a\)个蛋糕,\(b\)个巧克力,第一类人有\(n\)个,总是吃多的东西(若\(a>b\),吃蛋糕,否则吃巧克力),第二类人有\(m\)个,总是吃少的,可以随便调整这两类人吃的顺序, ...

  5. Kubernets二进制安装(15)之安装部署coredns

    在运维主机上(mfyxw50.mfyxw.com)准备Coredns镜像文件,以docker镜像文件的方式部署到Kubernetes集群中去. 1.下载coredns镜像 [root@mfyxw50 ...

  6. 牛客网-Beauty of Trees 【加权并查集】

    锟斤拷锟接o拷https://www.nowcoder.com/acm/contest/119/A锟斤拷源锟斤拷牛锟斤拷锟斤拷 锟斤拷目锟斤拷锟斤拷 It锟斤拷s universally acknow ...

  7. codeforces 876B

    B. Divisiblity of Differences time limit per test 1 second memory limit per test 512 megabytes input ...

  8. vue项目webpack打包后修改配置文件

    从webpack打包结构中我们知道,vue中有一个存放外部资源的文件夹static,它里面的文件是不会被打包编译的,所以我们就可以利用外部引入js的方式将我们的想要的数据在index.html中以js ...

  9. Learning JavaScript with MDN (call, apply, bind)

    Learning JavaScript with MDN (call, apply, bind) call, apply, bind Object.prototype.toString() 检测 js ...

  10. Github history viewer

    Github history viewer https://github.githistory.xyz/ https://github.com/pomber/git-history https://c ...