在Pyqt5中实现keras深度学习网络预测
load_model是出现Tensor is not an element of this graph问题
问题描述:
global path_openfile_name
path_openfile_name = 'F:/code/python/demopyqt_for_radioml/Demo/Demo/data_for_v1.1/norm_cldnn-matlab.wts.h5'
path_openfile_name = str(path_openfile_name)
#读取模型
model = load_model(path_openfile_name)
...#提取样本x
#用模型预测样本x的y值
prediction = model.predict(x)
跑这段代码时,报错:
ValueError: Tensor Tensor("Placeholder:x", shape=(x, x), dtype=int32) is not an element of this graph.
场景:我在pyqt里设置了一个开始按钮,一按就会开始对指定文件内的内容进行分割、预测。但是点击一次按钮后,再次点击,就回出现这个错误。
之前认为是进程的问题,后来逐步调试发现实际的错误出在load_model()方法上。
解决办法
修改后:
graph1 = Graph()
with graph1.as_default():
session1=Session(graph=graph1)
with session1.as_default():
model = load_model(path_openfile_name)
...#提取样本x
with graph1.as_default():
prediction = model.predict(x) # predict
解释:
1、创建模型model时,会话session尚未恢复。
2、模型中定义的所有占位符placeholders、变量variables 和操作符ops 被 Model.__init__方法放在一个新的图graph中。
部分功能
功能1 用模型预测大量样本,并输出其预测占比最多的种类并输出
功能2 实现再pyqt表格画布内增加一行的操作
stream_result=['xxx','xxx','xxx',...]#模型针对每一个样本的预测结果
count = Counter(stream_result)#计算样本预测结果中不同类的数目
freq_list = count.values()# 数目
max_cnt = max(freq_list)# 找到结果中最多的数目
#如果最多的数量多于总数量一半,就输出最多的数量的label的识别结果
#如果最多的数量少于总数量一半,就输出none,判定为无法识别
if max_cnt > int(ex.a1024/2):
most_common = count.most_common()[0][0]
#第一个0是代表如果最多次数的结果有多个,选其中一个
#第二个0是从[名称,次数]的list中选择最多的调制名称
else:
most_common = 'None'
print(most_common)
most_common_p = max_cnt / ex.a1024 *100
print(str(most_common_p)+'%')
self.add_line(most_common,most_common_p)
ex.workThread.wait()
#增加一行
def add_line(self,cateloy_result,cateloy_result_p):
tablerow = ex.tableWidget.rowCount()#得到当前表格的结果
ex.tableWidget.setRowCount(tablerow+1)#行数+1
ex.tableWidget.setItem(tablerow-1,0,QTableWidgetItem(str(ex.tableid)))#对应行显示id
ex.tableid=ex.tableid+1#id+1
ex.tableWidget.setItem(tablerow-1,3,QTableWidgetItem(cateloy_result))#显示结果(文本)
ex.tableWidget.setItem(tablerow-1,4,QTableWidgetItem(str(cateloy_result_p)+'%'))#显示结果置信度