1、实现效果

2、相关代码

实现BP训练模型的线程类

  1. class WorkThread(QtCore.QThread):
  2. finish_trigger = QtCore.pyqtSignal() # 关闭waiting_gif
  3. result_trigger = QtCore.pyqtSignal(pd.Series) # 传递预测结果信号
  4. evaluate_trigger = QtCore.pyqtSignal(list) # 传递正确率信号
  5.  
  6. def __int__(self):
  7. super(WorkThread, self).__init__()
  8.  
  9. def init(self, dataset, feature, label, info):
  10. self.dataset = dataset
  11. self.feature = feature
  12. self.label = label
  13. self.info = info
  14.  
  15. # 可以认为,run()函数就是新的线程需要执行的代码
  16. def run(self):
  17. self.BP()
  18.  
  19. def BP(self):
  20. """
  21. BP神经网络,返回标签的预测数据
  22. :param parent:
  23. :param dataset:
  24. :param feature:
  25. :param label:
  26. :param info:
  27. :return:
  28. """
  29. dataset = self.dataset
  30. feature = self.feature
  31. label = self.label
  32. info = self.info
  33.  
  34. input_dim = len(feature)
  35. data_x = dataset[feature] # 特征数据
  36. data_y = dataset[label] # 标签数据
  37.  
  38. x_train, x_test, y_train, y_test = train_test_split(data_x, data_y, test_size=info[0][3])
  39.  
  40. # **********************建立一个简单BP神经网络模型*********************************
  41. self.model = Sequential() # 声明一个顺序模型
  42. count = len(info)
  43. for i in range(1, count-1):
  44. if i == 1:
  45. self.model.add(Dense(info[i][0], activation=info[i][1], input_dim=input_dim, kernel_initializer=info[i][2])) # 输入层,Dense表示BP层
  46. else:
  47. self.model.add(Dense(info[i][0], activation=info[i][1], kernel_initializer=info[i][2]))
  48.  
  49. # 添加输出层
  50. self.model.add(Dense(info[count-1][0], activation=info[count-1][1], kernel_initializer=info[count-1][2]))
  51.  
  52. sgd = SGD(lr=info[0][0], decay=1e-6, momentum=0.9, nesterov=True)
  53. self.model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy']) # 编译模型
  54.  
  55. self.model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=info[0][1], batch_size=info[0][2]) # 训练模型1000次
  56.  
  57. scores_train = self.model.evaluate(x_train, y_train, batch_size=10)
  58. scores_test = self.model.evaluate(x_test, y_test, batch_size=10)
  59. scores = self.model.evaluate(data_x, data_y, batch_size=10)
  60.  
  61. self.finish_trigger.emit() # 循环完毕后发出信号
  62. list = [scores_train[1]*100, scores_test[1]*100, scores[1]*100]
  63. self.evaluate_trigger.emit(list)
  64. result = pd.Series(self.model.predict(data_x).T[0])
  65. result.name = '预测(BP)'
  66. self.result_trigger.emit(result)
  67. K.clear_session() # 反复调用model 模型
  68.  
  69. def save_model(self, save_dir):
  70. self.model.save(save_dir) # 保存模型

GUI显示代码(部分):

  1. class MainWindow(QtGui.QMainWindow):
  2. save_dir_signal = QtCore.pyqtSignal(str) # 传递保存目录信号
  3.  
  4. def show_evaluate_result(self, evaluate_result):
  5. help = QtGui.QMessageBox.information(self, '评价结果',
  6. "训练集正确率: %.2f%%\n测试集正确率: %.2f%%\n数据集正确率: %.2f%%" %
  7. (evaluate_result[0], evaluate_result[1], evaluate_result[2]),
  8. QtGui.QMessageBox.Yes)
  9.  
  10. self.pop_save_dir()
  11.  
  12. def pop_save_dir(self):
  13. msg = QtGui.QMessageBox.information(self, '提示', '是否保存模型?', QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
  14. if msg == QtGui.QMessageBox.Yes:
  15. save_dir = QtGui.QFileDialog.getSaveFileName(self, '选择保存目录', 'C:\\Users\\fuqia\\Desktop')
  16.  
  17. if save_dir != '':
  18. save_dir = save_dir + '.model'
  19. self.save_dir_signal.emit(save_dir)
  20.  
  21. def show_bp_result(self, result):
  22.  
  23. self.predict_data = result
  24. TableWidgetDeal.add_predict_data(self.table, result)
  25.  
  26. def waiting_label_close(self):
  27. self.label.close()
  28.  
  29. def show_waiting(self):
  30. self.label = QtGui.QLabel(self)
  31. self.label.setFixedSize(640, 480) # 不加的话有问题???
  32. self.label.setWindowFlags(QtCore.Qt.FramelessWindowHint) # 无边框
  33. self.label.setAttribute(QtCore.Qt.WA_TranslucentBackground) # 背景透明
  34.  
  35. screen = QtGui.QDesktopWidget().screenGeometry()
  36. size = self.label.geometry()
  37. # 如果是self.label.move((screen.width() - size.width()) / 2 , (screen.height() - size.height()) / 2)无法居中
  38. self.label.move((screen.width() - size.width()) / 2 + 240, (screen.height() - size.height()) / 2)
  39.  
  40. # 打开gif文件
  41. movie = QtGui.QMovie("./Icon/waiting.gif")
  42. # 设置cacheMode为CacheAll时表示gif无限循环,注意此时loopCount()返回-1
  43. movie.setCacheMode(QtGui.QMovie.CacheAll)
  44. # 播放速度
  45. movie.setSpeed(100)
  46. self.label.setMovie(movie)
  47. # 开始播放,对应的是movie.start()
  48. movie.start()
  49. self.label.show()
  50. q = QtCore.QEventLoop()
  51. q.exec_()
  1. w = WorkThread()
  2. w.init(self.object.data_set, feature, label, self.bp_ui.bp_info)
  3. w.start()
  4. w.finish_trigger.connect(self.waiting_label_close)
  5. w.result_trigger.connect(self.show_bp_result)
  6. w.evaluate_trigger.connect(self.show_evaluate_result)
  7. self.save_dir_signal.connect(w.save_model)
  8. 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. JAVA中native方法调用

    在Java中native是关键字.它一般在本地声明,异地用C和C++来实现.它的声明有几点要注意:1)native与访问控制符前后的关系不受限制.2)必须在返回类型之前.3)它一般为非抽象类方法.4) ...

  2. (19)jQuery操作文本和属性

    <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>jq ...

  3. 高斯消元 o(n^3) 取摸和不取摸

    #include<bits/stdc++.h> using namespace std; ; int a[MAXN][MAXN];//增广矩阵 int x[MAXN];//解集 bool ...

  4. centos7虚拟机安装elasticsearch5.0.x-安装篇

    https://blog.csdn.net/u012371450/article/details/51776505 请预先安装jdk 创建新用户(非root用户)elasticsearch只能用非ro ...

  5. 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. 初等数论及其应用 (第6版) (Kenneth H.Rosen 著)

    第1章 整数 1.1 数和序列 1.2 和与积 1.3 数学归纳法 1.4 斐波那契数 1.5 整除性 第2章 整数的表示法和运算 2.1 整数的表示法 2.2 整数的计算机运算 2.3 整数运算的复 ...

  7. 填充整个区间(fill,fill_n,generate和generate_n)

    fill 将value值填充整个区间,不能为OutputIterator,因为fill会用到first和last,outputIterator无法做相等的测试 template <class F ...

  8. quartz.net实现集群部署的笔记

    一..表信息 QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息 QRTZ_CRON_TRIGGERS 存储 Cron Trigger,包括Cron表达式和 ...

  9. 数据库连接出错 expected key exchange group packet form server

    数据库连接出错 expected key exchange group packet form server SSH: expected key exchange group packet form ...

  10. Revit 开发将自己的窗口设置为Revit窗口

    在Revit开发中如果使用modeless的对话框,经常容易被Revit窗体覆盖,但是如果将窗体设为Topmost的话,当Revit失去焦点后,它又会遮住其他程序的界面,比如将Revit最小化后,To ...