PyQt训练BP模型时,显示waiting动图(多线程)
1、实现效果
2、相关代码
实现BP训练模型的线程类
- class WorkThread(QtCore.QThread):
- finish_trigger = QtCore.pyqtSignal() # 关闭waiting_gif
- result_trigger = QtCore.pyqtSignal(pd.Series) # 传递预测结果信号
- evaluate_trigger = QtCore.pyqtSignal(list) # 传递正确率信号
- def __int__(self):
- super(WorkThread, self).__init__()
- def init(self, dataset, feature, label, info):
- self.dataset = dataset
- self.feature = feature
- self.label = label
- self.info = info
- # 可以认为,run()函数就是新的线程需要执行的代码
- def run(self):
- self.BP()
- def BP(self):
- """
- BP神经网络,返回标签的预测数据
- :param parent:
- :param dataset:
- :param feature:
- :param label:
- :param info:
- :return:
- """
- dataset = self.dataset
- feature = self.feature
- label = self.label
- info = self.info
- input_dim = len(feature)
- data_x = dataset[feature] # 特征数据
- data_y = dataset[label] # 标签数据
- x_train, x_test, y_train, y_test = train_test_split(data_x, data_y, test_size=info[0][3])
- # **********************建立一个简单BP神经网络模型*********************************
- self.model = Sequential() # 声明一个顺序模型
- count = len(info)
- for i in range(1, count-1):
- if i == 1:
- self.model.add(Dense(info[i][0], activation=info[i][1], input_dim=input_dim, kernel_initializer=info[i][2])) # 输入层,Dense表示BP层
- else:
- self.model.add(Dense(info[i][0], activation=info[i][1], kernel_initializer=info[i][2]))
- # 添加输出层
- self.model.add(Dense(info[count-1][0], activation=info[count-1][1], kernel_initializer=info[count-1][2]))
- sgd = SGD(lr=info[0][0], decay=1e-6, momentum=0.9, nesterov=True)
- self.model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy']) # 编译模型
- self.model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=info[0][1], batch_size=info[0][2]) # 训练模型1000次
- scores_train = self.model.evaluate(x_train, y_train, batch_size=10)
- scores_test = self.model.evaluate(x_test, y_test, batch_size=10)
- scores = self.model.evaluate(data_x, data_y, batch_size=10)
- self.finish_trigger.emit() # 循环完毕后发出信号
- list = [scores_train[1]*100, scores_test[1]*100, scores[1]*100]
- self.evaluate_trigger.emit(list)
- result = pd.Series(self.model.predict(data_x).T[0])
- result.name = '预测(BP)'
- self.result_trigger.emit(result)
- K.clear_session() # 反复调用model 模型
- def save_model(self, save_dir):
- self.model.save(save_dir) # 保存模型
GUI显示代码(部分):
- class MainWindow(QtGui.QMainWindow):
- save_dir_signal = QtCore.pyqtSignal(str) # 传递保存目录信号
- def show_evaluate_result(self, evaluate_result):
- help = QtGui.QMessageBox.information(self, '评价结果',
- "训练集正确率: %.2f%%\n测试集正确率: %.2f%%\n数据集正确率: %.2f%%" %
- (evaluate_result[0], evaluate_result[1], evaluate_result[2]),
- QtGui.QMessageBox.Yes)
- self.pop_save_dir()
- def pop_save_dir(self):
- msg = QtGui.QMessageBox.information(self, '提示', '是否保存模型?', QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
- if msg == QtGui.QMessageBox.Yes:
- save_dir = QtGui.QFileDialog.getSaveFileName(self, '选择保存目录', 'C:\\Users\\fuqia\\Desktop')
- if save_dir != '':
- save_dir = save_dir + '.model'
- self.save_dir_signal.emit(save_dir)
- def show_bp_result(self, result):
- self.predict_data = result
- TableWidgetDeal.add_predict_data(self.table, result)
- def waiting_label_close(self):
- self.label.close()
- def show_waiting(self):
- self.label = QtGui.QLabel(self)
- self.label.setFixedSize(640, 480) # 不加的话有问题???
- self.label.setWindowFlags(QtCore.Qt.FramelessWindowHint) # 无边框
- self.label.setAttribute(QtCore.Qt.WA_TranslucentBackground) # 背景透明
- screen = QtGui.QDesktopWidget().screenGeometry()
- size = self.label.geometry()
- # 如果是self.label.move((screen.width() - size.width()) / 2 , (screen.height() - size.height()) / 2)无法居中
- self.label.move((screen.width() - size.width()) / 2 + 240, (screen.height() - size.height()) / 2)
- # 打开gif文件
- movie = QtGui.QMovie("./Icon/waiting.gif")
- # 设置cacheMode为CacheAll时表示gif无限循环,注意此时loopCount()返回-1
- movie.setCacheMode(QtGui.QMovie.CacheAll)
- # 播放速度
- movie.setSpeed(100)
- self.label.setMovie(movie)
- # 开始播放,对应的是movie.start()
- movie.start()
- self.label.show()
- q = QtCore.QEventLoop()
- q.exec_()
- w = WorkThread()
- w.init(self.object.data_set, feature, label, self.bp_ui.bp_info)
- w.start()
- w.finish_trigger.connect(self.waiting_label_close)
- w.result_trigger.connect(self.show_bp_result)
- w.evaluate_trigger.connect(self.show_evaluate_result)
- self.save_dir_signal.connect(w.save_model)
- self.show_waiting()
PyQt训练BP模型时,显示waiting动图(多线程)的更多相关文章
- keras训练cnn模型时loss为nan
keras训练cnn模型时loss为nan 1.首先记下来如何解决这个问题的:由于我代码中 model.compile(loss='categorical_crossentropy', optimiz ...
- js特效:鼠标滑过图片时切换为动图
效果展示 事前准备 一张普通的静态图+与其对应的gif图. 实现思路 获取图片的src,改变其后缀,使其变成与之对应的gif图片.(很简单有木有= =) 具体实现 编写html代码 <div c ...
- wpf 登录时显示状态动态图
下面的示例演示了如何在登录过程时,界面上显示状态图标,登录完成后隐藏图标: public partial class MainWindow : Window { public MainWindow() ...
- Qt QLabel 显示gif动图
#include <QMovie> QMovie * move = new QMovie(":/gif/牵着我的手去浪迹天涯.gif"); ui->label_g ...
- PocketSphinx语音识别系统语言模型的训练和声学模型的改进
PocketSphinx语音识别系统语言模型的训练和声学模型的改进 zouxy09@qq.com http://blog.csdn.net/zouxy09 关于语音识别的基础知识和sphinx的知识, ...
- 1.keras实现-->自己训练卷积模型实现猫狗二分类(CNN)
原数据集:包含 25000张猫狗图像,两个类别各有12500 新数据集:猫.狗 (照片大小不一样) 训练集:各1000个样本 验证集:各500个样本 测试集:各500个样本 1= 狗,0= 猫 # 将 ...
- 使用py-faster-rcnn训练VOC2007数据集时遇到问题
使用py-faster-rcnn训练VOC2007数据集时遇到如下问题: 1. KeyError: 'chair' File "/home/sai/py-faster-rcnn/tools/ ...
- 第15.40节、PyQt(Python+Qt)实战:moviepy实现MP4视频转gif动图的工具
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 在写<第15.39节.splitDockWidget和 ...
- [源码分析] Facebook如何训练超大模型---(1)
[源码分析] Facebook如何训练超大模型---(1) 目录 [源码分析] Facebook如何训练超大模型---(1) 0x00 摘要 0x01 简介 1.1 FAIR & FSDP 1 ...
随机推荐
- JAVA中native方法调用
在Java中native是关键字.它一般在本地声明,异地用C和C++来实现.它的声明有几点要注意:1)native与访问控制符前后的关系不受限制.2)必须在返回类型之前.3)它一般为非抽象类方法.4) ...
- (19)jQuery操作文本和属性
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>jq ...
- 高斯消元 o(n^3) 取摸和不取摸
#include<bits/stdc++.h> using namespace std; ; int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool ...
- centos7虚拟机安装elasticsearch5.0.x-安装篇
https://blog.csdn.net/u012371450/article/details/51776505 请预先安装jdk 创建新用户(非root用户)elasticsearch只能用非ro ...
- OFIFG fault when using DCO in MSP430
The OFIFG flag always set in my recent MSP430 smoke device project. In this A sample hardware, there ...
- 初等数论及其应用 (第6版) (Kenneth H.Rosen 著)
第1章 整数 1.1 数和序列 1.2 和与积 1.3 数学归纳法 1.4 斐波那契数 1.5 整除性 第2章 整数的表示法和运算 2.1 整数的表示法 2.2 整数的计算机运算 2.3 整数运算的复 ...
- 填充整个区间(fill,fill_n,generate和generate_n)
fill 将value值填充整个区间,不能为OutputIterator,因为fill会用到first和last,outputIterator无法做相等的测试 template <class F ...
- quartz.net实现集群部署的笔记
一..表信息 QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息 QRTZ_CRON_TRIGGERS 存储 Cron Trigger,包括Cron表达式和 ...
- 数据库连接出错 expected key exchange group packet form server
数据库连接出错 expected key exchange group packet form server SSH: expected key exchange group packet form ...
- Revit 开发将自己的窗口设置为Revit窗口
在Revit开发中如果使用modeless的对话框,经常容易被Revit窗体覆盖,但是如果将窗体设为Topmost的话,当Revit失去焦点后,它又会遮住其他程序的界面,比如将Revit最小化后,To ...