1. 程式人生 > >PyQt訓練BP模型時,顯示waiting動圖(多線程)

PyQt訓練BP模型時,顯示waiting動圖(多線程)

entropy series optimize 目錄 分享 PE 技術分享 eve http

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動圖(多線程)