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动图(多线程)的更多相关文章

  1. keras训练cnn模型时loss为nan

    keras训练cnn模型时loss为nan 1.首先记下来如何解决这个问题的:由于我代码中 model.compile(loss='categorical_crossentropy', optimiz ...

  2. js特效:鼠标滑过图片时切换为动图

    效果展示 事前准备 一张普通的静态图+与其对应的gif图. 实现思路 获取图片的src,改变其后缀,使其变成与之对应的gif图片.(很简单有木有= =) 具体实现 编写html代码 <div c ...

  3. wpf 登录时显示状态动态图

    下面的示例演示了如何在登录过程时,界面上显示状态图标,登录完成后隐藏图标: public partial class MainWindow : Window { public MainWindow() ...

  4. Qt QLabel 显示gif动图

    #include <QMovie> QMovie * move = new QMovie(":/gif/牵着我的手去浪迹天涯.gif"); ui->label_g ...

  5. PocketSphinx语音识别系统语言模型的训练和声学模型的改进

    PocketSphinx语音识别系统语言模型的训练和声学模型的改进 zouxy09@qq.com http://blog.csdn.net/zouxy09 关于语音识别的基础知识和sphinx的知识, ...

  6. 1.keras实现-->自己训练卷积模型实现猫狗二分类(CNN)

    原数据集:包含 25000张猫狗图像,两个类别各有12500 新数据集:猫.狗 (照片大小不一样) 训练集:各1000个样本 验证集:各500个样本 测试集:各500个样本 1= 狗,0= 猫 # 将 ...

  7. 使用py-faster-rcnn训练VOC2007数据集时遇到问题

    使用py-faster-rcnn训练VOC2007数据集时遇到如下问题: 1. KeyError: 'chair' File "/home/sai/py-faster-rcnn/tools/ ...

  8. 第15.40节、PyQt(Python+Qt)实战:moviepy实现MP4视频转gif动图的工具

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 在写<第15.39节.splitDockWidget和 ...

  9. [源码分析] Facebook如何训练超大模型---(1)

    [源码分析] Facebook如何训练超大模型---(1) 目录 [源码分析] Facebook如何训练超大模型---(1) 0x00 摘要 0x01 简介 1.1 FAIR & FSDP 1 ...

随机推荐

  1. memoization

    memoization 是指通过缓存函数返回结果来加速函数调用的一种技术.仅当函数是纯函数 时结果才可以被缓存,也就是说,函数不能有任何副作用或输出,也不能依赖任何全局状态 import math _ ...

  2. Gym - 101806T: Touch The Sky(贪心)

    Figure: The house floats up in the sky by balloons. This picture is also used in 2018 KAIST RUN Spri ...

  3. C# 敏捷1

    using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...

  4. 【湖南师范大学2018年大学生程序设计竞赛新生赛 L】【HDOJ2476】【区间DP】

    https://www.nowcoder.com/acm/contest/127/L L 小小粉刷匠 题目描述 "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边开 ...

  5. Caused by: java.sql.SQLException: ORA-24816: 在实际的 LONG 或 LOB 列之后提供了扩展的非 LONG 绑定数据

    今天客户说报告草稿保存不了,跟踪错误bug,了解到以下reason: 异常出现的环境:oracle11g + Hibernate 错误分析:这是oracle 11g在clob字段中的一个bug,ora ...

  6. Maven 整理总结(一)

    使用maven来,今天对maven的使用进行一下总结.总经过程中,参考到的资料,我会尽量列举在下面,如果有涉及侵权的问题,挺联系我,我立即改正. 孤傲苍狼博客 http://www.cnblogs.c ...

  7. linux 之sed

    sed 用法 sed [-nefr] [action] -i 直接修改文件内容,而不是像其他命令那样只是输出到终端 a新增c取代d删除i插入p列印常与sed -n 使用s取代 有一点需要注意的是:如果 ...

  8. day 54 JS 之 jquery

    jQuery入门 2017-07-10 jQuery快速入门. jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Doc ...

  9. haproxy httpcheck with basic auth

    一个简单的需求,就是需要在 haproxy 的 httpcheck 使用 basic 认证,解决方法 base64 编码username 以及密码 echo -n "my_username: ...

  10. 如何安装Visio