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. Beta周第14次Scrum会议(11/23)【王者荣耀交流协会】

    一.小组信息 队名:王者荣耀交流协会 小组成员 队长:高远博 成员:王超,袁玥,任思佳,王磊,王玉玲,冉华 小组照片 二.开会信息 时间:2017/11/23 17:02~17:14,总计12min. ...

  2. Go Example--通道同步

    package main import ( "fmt" "time" ) func main() { //缓存通道 done := make(chan bool ...

  3. LeetCode – Smallest Rotation with Highest Score

    Given an array A, we may rotate it by a non-negative integer K so that the array becomes A[K], A[K+1 ...

  4. struts2(二)值栈 threadlocal ogal ui

    值栈(重要)和ognl表达式 1.  只要是一个mvc框架,必须解决数据的存和取的问题 2.  Struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构 3.  把数据存在值栈中,在页面上利用 ...

  5. MySQL Transaction--事务相关查询

    MySQL支持的四种事务隔离级别 READ-UNCOMMITTED READ-COMMITTED REPEATABLE-READ SERIALIZABLE 查看全局事务隔离级别和会话事务隔离级别 SH ...

  6. 数学 它的内容,方法和意义 第一卷 (A. D. 亚历山大洛夫 著)

    第一章 数学概观 (已看) 1. 数学的特点 2. 算术 3. 几何 4. 算术和几何 5. 初等数学时代 6. 变量的数学 7. 现代数学 8. 数学的本质 9. 数学发展的规律性 第二章 数学分析 ...

  7. Java基础语法 第4节 常见软件安装-Mysql和SQLyog

    §  mysql数据库安装 一.下载安装包并安装 Windows 上安装 MySQL 相对来说会较为简单,地那就链接 https://dev.mysql.com/downloads/mysql/下载 ...

  8. [转]AJAX 简介

    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 您应当具备的基础知识 在继续学习之前,您需要对下面的知识有基本的了解: HTML / XHTML CSS JavaScript ...

  9. 用C语言解决python多线程中的GIL问题

    在使用python多线程的时候为了解决GIL问题,有些代码得用C语言写,那么就得生成动态链接库. 当创建动态链接库时,独立位置信息(position independent)代码也需要生成.这可以帮助 ...

  10. streaming简介

    mapreduce和hdfs采用java实现,默认提供java编程接口 streaming框架允许任何程序语言实现的程序在hadoop mapreduce中使用 streaming方便已有的程序向ha ...