keras报错:AttributeError: '_thread._local' object has no attribute 'value'
需求是使用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'的更多相关文章
- ansible报错AttributeError: module 'urllib.request' has no attribute 'HTTPSHandler'
报错内容: TASK [activemq : extract activemq tarball] *************************************************** ...
- py+selenium 明明定位不到元素,但却不报错或是报错AttributeError: 'list' object has no attribute 'click'【已解决】
问题:定位不到元素,但却不报错或者出现报错AttributeError: 'list' object has no attribute 'click' 如图 或者 解决方法: 将”driver ...
- dnspython模块报错 AttributeError: 'CNAME' object has no attribute 'address'
有时候用到这个模块的时候会报错 AttributeError: 'CNAME' object has no attribute 'address' 如下所示 [root@ansible ch01]# ...
- 关于moviepy打包报错AttributeError: module audio/video.fx.all has no attribute fadein、crop文章的纠错和抄袭
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 老猿前面有篇文章<moviepy应用pyin ...
- moviepy应用pyinstaller打包后执行报错AttributeError: module audio/video.fx.all has no attribute fadein、crop
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在开发moviepy的Python程序使用pyinstaller打包后 ...
- AttributeError: '_csv.reader' object has no attribute 'next'
我在使用pyhon3.4运行以下代码时报错:AttributeError: '_csv.reader' object has no attribute 'next' import csv import ...
- 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 ...
- 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 创建 ...
- 关于flask登录视图报错AttributeError: '_AppCtxGlobals' object has no attribute 'user'
在一个小程序中写了一个登录视图函数,代码如下: @app.route('/login',methods = ['GET','POST']) @oid.loginhandler def login(): ...
随机推荐
- KMP(算法描述)
#include<iostream> using namespace std; const int N=10010,M=100010; int n,m; char p[N],s[M]; i ...
- Codeforces Round #570 (Div. 3) E. Subsequences (easy version) (搜索,STL)
题意:有一长度为\(n\)的字符串,要求得到\(k\)不同的它的子序列(可以是空串),每个子序列有\(|n|-|t|\)的贡献,求合法情况下的最小贡献. 题解:直接撸个爆搜找出所有子序列然后放到set ...
- 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) ...
- Codeforces Round #654 (Div. 2) C. A Cookie for You (思维)
题意:有\(a\)个蛋糕,\(b\)个巧克力,第一类人有\(n\)个,总是吃多的东西(若\(a>b\),吃蛋糕,否则吃巧克力),第二类人有\(m\)个,总是吃少的,可以随便调整这两类人吃的顺序, ...
- Kubernets二进制安装(15)之安装部署coredns
在运维主机上(mfyxw50.mfyxw.com)准备Coredns镜像文件,以docker镜像文件的方式部署到Kubernetes集群中去. 1.下载coredns镜像 [root@mfyxw50 ...
- 牛客网-Beauty of Trees 【加权并查集】
锟斤拷锟接o拷https://www.nowcoder.com/acm/contest/119/A锟斤拷源锟斤拷牛锟斤拷锟斤拷 锟斤拷目锟斤拷锟斤拷 It锟斤拷s universally acknow ...
- codeforces 876B
B. Divisiblity of Differences time limit per test 1 second memory limit per test 512 megabytes input ...
- vue项目webpack打包后修改配置文件
从webpack打包结构中我们知道,vue中有一个存放外部资源的文件夹static,它里面的文件是不会被打包编译的,所以我们就可以利用外部引入js的方式将我们的想要的数据在index.html中以js ...
- Learning JavaScript with MDN (call, apply, bind)
Learning JavaScript with MDN (call, apply, bind) call, apply, bind Object.prototype.toString() 检测 js ...
- Github history viewer
Github history viewer https://github.githistory.xyz/ https://github.com/pomber/git-history https://c ...