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. Logo的制作

    <style> header { width: 1300px; height: 100px; /* background-color: pink; */ margin: 0 auto; p ...

  2. The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online -C:Halting Problem(模拟)

    C Halting Problem In computability theory, the halting problem is the problem of determining, from a ...

  3. Python数据结构与算法(排序)

    https://www.cnblogs.com/fwl8888/p/9315730.html

  4. Java中break和continue跳出指定循环

    https://www.cnblogs.com/miys/p/b7f6a463bc58785d74a8a7fccd1f1243.html 在Java中,break和continue可以跳出指定循环,在 ...

  5. LeetCode – All Nodes Distance K in Binary Tree

    We are given a binary tree (with root node root), a target node, and an integer value K. Return a li ...

  6. UVA10341 Solve It

    题意 PDF 分析 在\(0\le x\le 1\)时,\(f(x)=pe^{-x}+q\sin x+r\cos x+s\tan x+tx^2+u\)是减函数,所以当\(f(0)\ge 0 \wedg ...

  7. hotel管理

    PS:这个界面

  8. 安装Centos7时提示 /dev/root does not exits

    安装centos 7时提示 "Warning: /dev/root does not exist, could not boot" 这个问题是木有找到你的U盘. 在一个能够编辑U盘 ...

  9. mino 路径格式的bucket 数据访问

    实施上这个功能很简答,如果官方不支持,我们可以通过基于nginx 的url rewrite 也可以实现 格式说明 如果配置了domain minio 会将 http://mydomain.com/bu ...

  10. numpy 笔记

    1  矩阵.数组.列表 #from numpy import * import numpy as np 矩阵创建 >>> A = np.array([1,2,3]) array([1 ...