예제 #1
0
    def restoreNeuralNetwork(self):
        fname, _ = QFileDialog.getOpenFileName(self, 'Open Network File', '.', 'Network File(*.nf)')
        if not fname:
            # self.logStatus('打开神经网络文件{}失败!'.format(fname), 'red', 'E')
            return

        # clear previous plots
        self.clearPlots()

        training_x, training_y = DataHandler.split_xy(self.training_data)
        self.network = NeuralNetwork(training_x, training_y)
        try:
            self.network.load(fname)
        except ShapeError as e:
            self.logStatus('加载神经网络文件{}失败!'.format(fname), 'red', 'E')
            QMessageBox.warning(self, '警告', '加载神经网络文件失败, 请检查文件格式是否正确!')
            return

        self.logStatus('神经网络文件{}加载成功'.format(fname))
        self.predictDatakAct.setEnabled(True)
        self.logStatus('请执行数据预测', '#FF8C00', 'T')
예제 #2
0
 def update_figure(self):
     if GlobalMap().get('userdefined') == 'Null_':  #检测从自定义对话框传递过来的数据
         return
     if not self.begin:  #防止重绘
         return
     self.begin = 0
     GlobalMap().set(time_point=self.times, )
     self.times += 1
     if self.times == 2:
         self.begin = 1
         self.temp0 = NN.main([], [],
                              GlobalMap().get('userdefined'))  #传入BP网络预测
         return
     else:
         temp01 = self.temp0
         self.temp0 = NN.main([], [], temp01)
     imgP = imread('core/map.png', )
     self.axes.imshow(imgP,
                      extent=[112.1495, 112.288, 30.308, 30.391],
                      aspect='auto')
     x = np.array(self.temp0[0])
     y = np.array(self.temp0[1])
     z = gaussian_kde(self.temp0)(self.temp0)  #生成密度颜色
     self.axes.hold(True)
     self.axes.scatter(x, y, marker='.', s=100, c=z, edgecolors='')
     self.axes.grid(True)
     self.axes.set_xlim(112.150, 112.284)
     self.axes.set_ylim(30.309, 30.385)
     self.axes.set(xlabel="longitude", ylabel="latitude")
     self.axes.set_title('The ' + str(self.times) +
                         ':00 ’s distribution prediction')
     self.draw()
     self.begin = 1
     self.axes.hold(False)
     if self.times >= 2:
         self.pause()
예제 #3
0
    def run(self):
        if self.working == True:
            times = GlobalMap().get('time_point')
            GlobalMap().set(progress_num=0)

            lists = []
            for i in range(24):
                lists += [i]

            GlobalMap().set(progress_num=2)

            if exists('db/temp/20180515.csv') and exists(
                    'db/temp/20180516.csv'):
                temp1 = DataFrame(read_csv('db/temp/20180515.csv', header=0))
                temp2 = DataFrame(read_csv('db/temp/20180516.csv', header=0))
            else:
                temp1 = dataclear(20180515).run()
                temp2 = dataclear(20180516).run()

            GlobalMap().set(progress_num=5)

            temp11 = temp1[temp1['time'] == lists[times - 1]]
            temp12 = temp1[temp1['time'] == lists[times]]
            temp1112 = merge(temp11, temp12, how='outer', on='id').dropna()

            temp21 = temp2[temp2['time'] == lists[times - 1]]
            temp22 = temp2[temp2['time'] == lists[times]]
            temp2122 = merge(temp21, temp22, how='outer', on='id').dropna()

            temp000 = np.vstack((temp1112['x_x'], temp1112['y_x']))
            temp001 = np.vstack((temp1112['x_y'], temp1112['y_y']))

            temp020 = np.vstack((temp2122['x_x'], temp2122['y_x']))
            #temp021 = np.vstack((temp2122['x_y'],temp2122['y_y']))

            cells_array = np.array(NN.main(temp000, temp001, temp020))

            np.save(GlobalMap().get('temp_path') + '/test' + str(times),
                    cells_array)

            GlobalMap().set(progress_num=100, running_global=0)

            self.changed2_signal.emit(1)
예제 #4
0
            gpu_options=tf.GPUOptions(
                allocator_type='BFC',
                # allow_growth=True,  # it will cause fragmentation.
                per_process_gpu_memory_fraction=0.1)))
    graph_def = graph.as_graph_def()

    with sess.graph.as_default():

        sess.run(tf.global_variables_initializer())
        tf.keras.backend.set_session(session=sess)
        # with tf.gfile.GFile(COMPILE_MODEL_PATH.replace('.pb', '_{}.pb'.format(int(0.95 * 10000))), "rb") as f:
        #     graph_def_file = f.read()
        # graph_def.ParseFromString(graph_def_file)
        # print('{}.meta'.format(tf_checkpoint))

        model = NeuralNetwork(model_conf, RunMode.Predict, model_conf.neu_cnn,
                              model_conf.neu_recurrent)
        model.build_graph()

        saver = tf.train.Saver(var_list=tf.global_variables())
        """从项目中加载最后一次训练的网络参数"""
        saver.restore(sess,
                      tf.train.latest_checkpoint(model_conf.model_root_path))

        # _ = tf.import_graph_def(graph_def, name="")
    """定义操作符"""
    dense_decoded_op = sess.graph.get_tensor_by_name("dense_decoded:0")
    x_op = sess.graph.get_tensor_by_name('input:0')
    """固定网络"""
    sess.graph.finalize()

    true_count = 0
    def testing(self, image_dir, limit=None):

        graph = tf.Graph()
        sess = tf.Session(
            graph=graph,
            config=tf.ConfigProto(
                # allow_soft_placement=True,
                # log_device_placement=True,
                gpu_options=tf.GPUOptions(
                    allocator_type='BFC',
                    # allow_growth=True,  # it will cause fragmentation.
                    per_process_gpu_memory_fraction=0.1)))

        with sess.graph.as_default():

            sess.run(tf.global_variables_initializer())
            tf.keras.backend.set_session(session=sess)

            model = NeuralNetwork(self.model_conf, RunMode.Predict,
                                  self.model_conf.neu_cnn,
                                  self.model_conf.neu_recurrent)
            model.build_graph()

            saver = tf.train.Saver(var_list=tf.global_variables())
            """从项目中加载最后一次训练的网络参数"""
            saver.restore(
                sess,
                tf.train.latest_checkpoint(self.model_conf.model_root_path))

            # _ = tf.import_graph_def(graph_def, name="")
        """定义操作符"""
        dense_decoded_op = sess.graph.get_tensor_by_name("dense_decoded:0")
        x_op = sess.graph.get_tensor_by_name('input:0')
        """固定网络"""
        sess.graph.finalize()

        true_count = 0
        false_count = 0
        """
        以下为根据路径调用预测函数输出结果的demo
        """
        # Fill in your own sample path
        dir_list = os.listdir(image_dir)
        random.shuffle(dir_list)
        lines = []
        for i, p in enumerate(dir_list):
            n = os.path.join(image_dir, p)
            if limit and i > limit:
                break
            with open(n, "rb") as f:
                b = f.read()

            batch = self.get_image_batch(b)
            st = time.time()
            predict_text = self.predict_func(
                batch,
                sess,
                dense_decoded_op,
                x_op,
            )
            et = time.time()
            # t = p.split(".")[0].lower() == predict_text.lower()
            # csv_output = "{},{}".format(p.split(".")[0], predict_text)
            # lines.append(csv_output)
            # print(csv_output)
            is_mark = '_' in p
            if is_mark:
                if 'LOWER' in self.model_conf.category_param:
                    label = p.split("_")[0].lower()
                    t = label == predict_text.lower()
                elif 'UPPER' in self.model_conf.category_param:
                    label = p.split("_")[0].upper()
                    t = label == predict_text.upper()
                else:
                    label = p.split("_")[0]
                    t = label == predict_text
            # Used to verify test sets
                if t:
                    true_count += 1
                else:
                    false_count += 1
                print(i, p, label, predict_text, t,
                      true_count / (true_count + false_count),
                      (et - st) * 1000)
            else:
                print(i, p, predict_text,
                      true_count / (true_count + false_count),
                      (et - st) * 1000)
예제 #6
0
    X = np.transpose(np.asarray(X))
    Y = np.transpose(np.asarray(Y))

    Y = np.expand_dims(Y, axis=0)
    X = X / 255  #normalization

    lr = 0.001
    epochs = 5000
    amount_data = X.shape[0]
    hidden_neurons = 64
    output_neurons = 1

    nn = NeuralNetwork(lr=lr,
                       epochs=epochs,
                       amount_data=amount_data,
                       hidden_neurons=hidden_neurons,
                       output_neurons=output_neurons)

    X_train, X_validate, Y_train, Y_validate = nn.split_data(X, Y, 0.3)

    loss_train, acc_train, loss_validate, acc_validate =\
    nn.train(
     X_train = X_train,
     Y_train = Y_train,
     X_validate = X_validate,
     Y_validate = Y_validate)

    graph = Graph(file="nn1",
                  amount_data=amount_data,
                  hidden_neurons=hidden_neurons,
예제 #7
0
            ))
    )
    graph_def = graph.as_graph_def()

    with sess.graph.as_default():

        sess.run(tf.global_variables_initializer())
        tf.keras.backend.set_session(session=sess)
        # with tf.gfile.GFile(COMPILE_MODEL_PATH.replace('.pb', '_{}.pb'.format(int(0.95 * 10000))), "rb") as f:
        #     graph_def_file = f.read()
        # graph_def.ParseFromString(graph_def_file)
        # print('{}.meta'.format(tf_checkpoint))

        model = NeuralNetwork(
            model_conf,
            RunMode.Predict,
            model_conf.neu_cnn,
            NETWORK_MAP[model_conf.neu_recurrent] if model_conf.neu_recurrent else None
        )
        model.build_graph()

        saver = tf.train.Saver(var_list=tf.global_variables())

        """从项目中加载最后一次训练的网络参数"""
        saver.restore(sess, tf.train.latest_checkpoint(model_conf.model_root_path))

        # _ = tf.import_graph_def(graph_def, name="")

    """定义操作符"""
    dense_decoded_op = sess.graph.get_tensor_by_name("dense_decoded:0")
    x_op = sess.graph.get_tensor_by_name('input:0')
    """固定网络"""
예제 #8
0
    def run(self):
        if self.working == True:
            times = GlobalMap().get('time_point')
            GlobalMap().set(progress_num=0)

            lists = []
            for i in range(24):
                lists += [i]

            GlobalMap().set(progress_num=2)

            if exists('db/temp/20180515.csv') and exists(
                    'db/temp/20180516.csv'):
                temp1 = DataFrame(read_csv('db/temp/20180515.csv', header=0))
                temp2 = DataFrame(read_csv('db/temp/20180516.csv', header=0))
            else:
                temp1 = dataclear(20180515).run()
                temp2 = dataclear(20180516).run()

            GlobalMap().set(progress_num=5)

            temp11 = temp1[temp1['time'] == lists[times - 1]]
            temp12 = temp1[temp1['time'] == lists[times]]
            temp1112 = merge(temp11, temp12, how='outer', on='id').dropna()
            '''begin 另一种数据处理方式'''
            #            temp1_x = DataFrame(read_csv('db/temp/20180515-x.csv' ,header=0))
            #            temp1_y = DataFrame(read_csv('db/temp/20180515-y.csv' ,header=0))
            #            temp2_x = DataFrame(read_csv('db/temp/20180516-x.csv' ,header=0))
            #            temp2_y = DataFrame(read_csv('db/temp/20180516-y.csv' ,header=0))
            #
            #            temp11_x = temp1_x[str(lists[times])]
            #            temp11_y = temp1_y[str(lists[times])]
            #            temp12_x = temp2_x[str(lists[times])]
            #            temp12_y = temp2_y[str(lists[times])]
            #
            #            temp21_x = temp1_x[str(lists[times+1])]
            #            temp21_y = temp1_y[str(lists[times+1])]
            #            temp22_x = temp2_x[str(lists[times+1])]
            #            temp22_y = temp2_y[str(lists[times+1])]
            #
            #            cc01 = np.vstack((temp11_x, temp11_y))
            #            cc02 = np.vstack((temp21_x, temp21_y))
            #            cc03 = np.vstack((temp12_x, temp12_y))
            #            cc04 = np.vstack((temp22_x, temp22_y))
            '''end'''

            temp21 = temp2[temp2['time'] == lists[times - 1]]
            temp22 = temp2[temp2['time'] == lists[times]]
            temp2122 = merge(temp21, temp22, how='outer', on='id').dropna()

            temp000 = np.vstack((temp1112['x_x'], temp1112['y_x']))
            temp001 = np.vstack((temp1112['x_y'], temp1112['y_y']))

            temp020 = np.vstack((temp2122['x_x'], temp2122['y_x']))
            temp021 = np.vstack((temp2122['x_y'], temp2122['y_y']))

            #用20180515 T 和 T+1 时刻的训练 来预测  20180516 T 时刻 在 T+1 时刻的分布情况
            cells_array = np.array(NN.main(temp000, temp001, temp020))
            #cells_array = np.array(NN.main(cc01, cc02, cc03 ))

            np.save(GlobalMap().get('temp_path') + '/test' + str(times),
                    cells_array)
            GlobalMap().set(progress_num=100)

            self.changed_signal.emit(cells_array, temp021)
예제 #9
0
    def runNetworkTraining(self):
        if self.network is not None:
            ans = QMessageBox.question(self, '警告',
                                 '系统中已存在训练好的神经网络,请问您需要重新训练神经网络吗?')
            if ans == QMessageBox.No:
                return

        # clear previous plots
        self.clearPlots()

        self.logStatus("正在初始化神经网络结构...", 'blue', 'I')
        training_x, training_y = DataHandler.split_xy(self.training_data)
        # retrieve settings
        epoch0 = 2000
        tol0 = 0.1
        retry_num = 3
        h0size = 4
        h1size = 4
        if self.networkSettings:
            epoch0 = self.networkSettings['epoch']
            tol0 = self.networkSettings['tol']
            retry_num = self.networkSettings['retry']
            h0size = self.networkSettings['h0size']
            h1size = self.networkSettings['h1size']

        self.logStatus("神经网络信息:layer1={}, layer2={}, epoch0={}, retry={}, tol0={}"
                       .format(h0size, h1size, epoch0, retry_num, tol0), 'blue', 'I')

        net = [(training_x.shape[0], ''), (h0size, 'sigmoid'), (h1size, 'sigmoid'), (1, 'feedthrough')]
        try:
            self.network = NeuralNetwork(training_x, training_y, sizes=net)
        except ShapeError as e:
            self.logStatus('初始化神经网络结构失败!')
            QMessageBox.warning(self, '警告', '初始化神经网络结构失败, 请重试!')
            return

        # training
        mu0 = 0.1
        beta = 10
        retry = 0
        self.logStatus("使用LM算法开始训练神经网络...", 'blue', 'I')
        while retry < retry_num:
            residual, mu, citer, msg = \
                self.network.train(retry=retry, epoch=epoch0, mu0=mu0,
                                   beta=beta, tol=tol0, cb=self.logStatus)
            if residual is None:
                if retry == (retry_num - 1):
                    self.logStatus("训练失败!".format(msg), 'red', 'E')
                    return
                else:
                    self.logStatus("训练失败:{}, 重试中...".format(msg), '#FFA07A', 'I')
                    self.network.randomize_wb()
                    # continue
            elif residual > tol0:
                if retry == (retry_num - 1):
                    self.logStatus("训练失败!".format(msg), 'red', 'E')
                    return
                else:
                    self.logStatus("训练失败: 运算未能收敛, 重试中...", '#FFA07A', 'I')
                    self.network.randomize_wb()
                    # continue
            else:
                self.logStatus("神经网络训练完成, 迭代次数={1}, 最终残差={0}"
                               .format(residual, citer+retry*epoch0), 'blue', 'I')
                break
            retry += 1
        self.predictDatakAct.setEnabled(True)
        self.saveNetworkAct.setEnabled(True)
        self.logStatus('请执行数据预测', '#FF8C00', 'T')
예제 #10
0
class AppWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.setWindowTitle(progname)
        self.init_ui()

        self.network = None
        self.isDataLoaded = False
        self.training_data = None
        self.test_data = None
        self.predict_y = None
        self.networkSettings = None

    def init_ui(self):
        self.init_menus()
        self.init_toolbar(QSize(40, 40))

        mainWidget = QWidget(self)
        mainbox = QHBoxLayout(mainWidget)
        # self.setLayout(mainbox)

        topFrame = QFrame(mainWidget)
        topFrame.setFrameShape(QFrame.StyledPanel)
        btmFrame = QFrame(mainWidget)
        btmFrame.setFrameShape(QFrame.StyledPanel)

        splitter = QSplitter(Qt.Vertical)
        splitter.addWidget(topFrame)
        splitter.addWidget(btmFrame)
        # logText 30%, Plot 70%
        splitter.setStretchFactor(0, 4)
        splitter.setStretchFactor(1, 1)

        mainbox.addWidget(splitter)

        self.init_plot_area(topFrame)

        vboxLog = QVBoxLayout(btmFrame)
        self.logTextEdit = QPlainTextEdit("")
        self.logTextEdit.appendHtml("""<font size='4'>欢迎使用{}</font><p>""".format(progname))
        self.logTextEdit.setReadOnly(True)
        vboxLog.addWidget(self.logTextEdit)

        mainWidget.setFocus()
        self.setCentralWidget(mainWidget)
        self.statusBar().showMessage("Ready")
        self.setWindowIcon(QIcon('res/load_network.png'))
        self.show()

    def init_plot_area(self, parent):
        hboxPlot = QHBoxLayout(parent)
        # errplot_labels = {'t': u'供水温度预测误差', 'x': u'时间', 'y': u'误差百分比(%)'}
        # predplot_labels = {'t': u'供水温度预测值', 'x': u'时间', 'y': u'供水温度(℃)'}
        errplot_labels = {'t': 'Prediction Errors', 'x': 'Time', 'y': 'Error Percent(%)'}
        predplot_labels = {'t': 'Predicted Temperature', 'x': 'Time', 'y': 'Temperature(℃)'}
        self.errPlot = StaticMplotCanvas(parent, labels=errplot_labels)
        self.predPlot = StaticMplotCanvas(parent, labels=predplot_labels)
        hboxPlot.addWidget(self.errPlot)
        hboxPlot.addWidget(self.predPlot)

    def init_toolbar(self, iconSize):
        # data file
        self.loadDataAct = QAction(QIcon('res/load_data.png'), 'Import Training Data', self)
        self.loadDataAct.setShortcut('Ctrl+L')
        self.loadDataAct.triggered.connect(self.loadTrainingDataFile)
        self.saveDataAct = QAction(QIcon('res/save_data.png'), 'Export Predicted Data', self)
        self.saveDataAct.setShortcut('Ctrl+E')
        self.saveDataAct.triggered.connect(self.savePredictDataToFile)
        self.saveDataAct.setEnabled(False)
        # network
        self.loadNetworkAct = QAction(QIcon('res/load_network.png'), 'Load Trained Network', self)
        self.loadNetworkAct.setShortcut('Ctrl+N')
        self.loadNetworkAct.triggered.connect(self.restoreNeuralNetwork)
        self.loadNetworkAct.setEnabled(False)
        self.saveNetworkAct = QAction(QIcon('res/save_network.png'), 'Save Trained Network', self)
        self.saveNetworkAct.setShortcut('Ctrl+S')
        self.saveNetworkAct.triggered.connect(self.saveNeuralNetwork)
        self.saveNetworkAct.setEnabled(False)
        # run & predict
        self.runTrainingAct = QAction(QIcon('res/train_network.png'), 'Train Network', self)
        self.runTrainingAct.setShortcut('Ctrl+R')
        self.runTrainingAct.triggered.connect(self.runNetworkTraining)
        self.runTrainingAct.setEnabled(False)
        self.predictDatakAct = QAction(QIcon('res/predict.png'), 'Predict Data', self)
        self.predictDatakAct.setShortcut('Ctrl+P')
        self.predictDatakAct.triggered.connect(self.predictData)
        self.predictDatakAct.setEnabled(False)
        # clear
        self.resetAct = QAction(QIcon('res/clear.png'), 'Clear data and network', self)
        self.resetAct.setEnabled(False)
        self.resetAct.triggered.connect(self.clearDataAndNetwork)

        dataToolbar = self.addToolBar('Data ToolBar')
        dataToolbar.addAction(self.loadDataAct)
        dataToolbar.addAction(self.saveDataAct)
        dataToolbar.setIconSize(iconSize)

        networkToolbar = self.addToolBar('Network ToolBar')
        networkToolbar.addAction(self.loadNetworkAct)
        networkToolbar.addAction(self.runTrainingAct)
        networkToolbar.addAction(self.predictDatakAct)
        networkToolbar.addAction(self.saveNetworkAct)
        networkToolbar.setIconSize(iconSize)

        resetToolbar = self.addToolBar('Reset ToolBar')
        resetToolbar.addAction(self.resetAct)
        resetToolbar.setIconSize(iconSize)

    def init_menus(self):
        # File
        settingAct = QAction(QIcon('res/settings.png'), '设置', self)
        settingAct.triggered.connect(self.showSettingDialog)

        exitAct = QAction(QIcon('exit.png'), '退出', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(self.fileQuit)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(settingAct)
        fileMenu.addSeparator()
        fileMenu.addAction(exitAct)

        # Help
        helpMenu = QMenu('&Help', self)
        self.menuBar().addMenu(helpMenu)
        helpMenu.addAction('使用说明', self.usage)
        helpMenu.addAction('关于', self.about)

    @pyqtSlot()
    def loadTrainingDataFile(self):
        fname, _ = QFileDialog.getOpenFileName(self, 'Open Training Data', '.', 'Data File(*.csv)')
        if not fname:
            # self.logStatus("加载数据文件{}失败!".format(fname), 'red', 'E')
            return

        dl = DataHandler(fname)
        self.training_data, self.test_data = dl.load(cb=self.logStatus)
        self.isDataLoaded = True
        self.runTrainingAct.setEnabled(True)
        self.loadNetworkAct.setEnabled(True)
        self.resetAct.setEnabled(True)
        self.logStatus("加载数据文件{}成功".format(fname))
        self.logStatus('请训练神经网络或者加载已经训练的神经网络模型', '#FF8C00', 'T')

    @pyqtSlot()
    def savePredictDataToFile(self):
        if self.predict_y is None:
            # self.logStatus('没有未保存的预测数据, 请先进行数据预测!', 'red', 'E')
            return

        fname, _ = QFileDialog.getSaveFileName(self, 'Save Predicted Data', '.', 'Data File(*.csv)')
        if not fname:
            self.logStatus('保存预测数据文件{}失败!'.format(fname), 'red', 'E')
            return

        test_x, _ = DataHandler.split_xy(self.test_data)
        status = DataHandler.save(np.concatenate((test_x, self.predict_y), axis=0), fname)
        if status:
            self.logStatus('保存预测数据文件{}成功'.format(fname))

    @pyqtSlot()
    def restoreNeuralNetwork(self):
        fname, _ = QFileDialog.getOpenFileName(self, 'Open Network File', '.', 'Network File(*.nf)')
        if not fname:
            # self.logStatus('打开神经网络文件{}失败!'.format(fname), 'red', 'E')
            return

        # clear previous plots
        self.clearPlots()

        training_x, training_y = DataHandler.split_xy(self.training_data)
        self.network = NeuralNetwork(training_x, training_y)
        try:
            self.network.load(fname)
        except ShapeError as e:
            self.logStatus('加载神经网络文件{}失败!'.format(fname), 'red', 'E')
            QMessageBox.warning(self, '警告', '加载神经网络文件失败, 请检查文件格式是否正确!')
            return

        self.logStatus('神经网络文件{}加载成功'.format(fname))
        self.predictDatakAct.setEnabled(True)
        self.logStatus('请执行数据预测', '#FF8C00', 'T')

    @pyqtSlot()
    def saveNeuralNetwork(self):
        fname, _ = QFileDialog.getSaveFileName(self, 'Save Network File', '.', 'Network File(*.nf)')
        if not fname:
            # self.logStatus('保存神经网络文件{}失败!'.format(fname), 'red', 'E')
            return

        self.network.dump(fname)
        self.logStatus('保存神经网络文件{}成功'.format(fname))

    @pyqtSlot()
    def runNetworkTraining(self):
        if self.network is not None:
            ans = QMessageBox.question(self, '警告',
                                 '系统中已存在训练好的神经网络,请问您需要重新训练神经网络吗?')
            if ans == QMessageBox.No:
                return

        # clear previous plots
        self.clearPlots()

        self.logStatus("正在初始化神经网络结构...", 'blue', 'I')
        training_x, training_y = DataHandler.split_xy(self.training_data)
        # retrieve settings
        epoch0 = 2000
        tol0 = 0.1
        retry_num = 3
        h0size = 4
        h1size = 4
        if self.networkSettings:
            epoch0 = self.networkSettings['epoch']
            tol0 = self.networkSettings['tol']
            retry_num = self.networkSettings['retry']
            h0size = self.networkSettings['h0size']
            h1size = self.networkSettings['h1size']

        self.logStatus("神经网络信息:layer1={}, layer2={}, epoch0={}, retry={}, tol0={}"
                       .format(h0size, h1size, epoch0, retry_num, tol0), 'blue', 'I')

        net = [(training_x.shape[0], ''), (h0size, 'sigmoid'), (h1size, 'sigmoid'), (1, 'feedthrough')]
        try:
            self.network = NeuralNetwork(training_x, training_y, sizes=net)
        except ShapeError as e:
            self.logStatus('初始化神经网络结构失败!')
            QMessageBox.warning(self, '警告', '初始化神经网络结构失败, 请重试!')
            return

        # training
        mu0 = 0.1
        beta = 10
        retry = 0
        self.logStatus("使用LM算法开始训练神经网络...", 'blue', 'I')
        while retry < retry_num:
            residual, mu, citer, msg = \
                self.network.train(retry=retry, epoch=epoch0, mu0=mu0,
                                   beta=beta, tol=tol0, cb=self.logStatus)
            if residual is None:
                if retry == (retry_num - 1):
                    self.logStatus("训练失败!".format(msg), 'red', 'E')
                    return
                else:
                    self.logStatus("训练失败:{}, 重试中...".format(msg), '#FFA07A', 'I')
                    self.network.randomize_wb()
                    # continue
            elif residual > tol0:
                if retry == (retry_num - 1):
                    self.logStatus("训练失败!".format(msg), 'red', 'E')
                    return
                else:
                    self.logStatus("训练失败: 运算未能收敛, 重试中...", '#FFA07A', 'I')
                    self.network.randomize_wb()
                    # continue
            else:
                self.logStatus("神经网络训练完成, 迭代次数={1}, 最终残差={0}"
                               .format(residual, citer+retry*epoch0), 'blue', 'I')
                break
            retry += 1
        self.predictDatakAct.setEnabled(True)
        self.saveNetworkAct.setEnabled(True)
        self.logStatus('请执行数据预测', '#FF8C00', 'T')

    @pyqtSlot()
    def predictData(self):
        # don't forget to clear previous plots
        self.clearPlots()

        self.logStatus("开始进行数据预测...", 'blue', 'I')
        test_x, test_y = DataHandler.split_xy(self.test_data, False)
        self.predict_y = self.network.predict(test_x)
        self.logStatus("开始计算误差...", 'blue', 'I')
        self.predPlot.update_plot(x=np.arange(len(self.predict_y[0])),
                                  y=self.predict_y[0])
        # error plot
        err_percent = (self.predict_y - test_y) * 100.0 / test_y
        self.errPlot.error_plot(x=np.arange(len(err_percent[0])),
                                y=err_percent[0])
        abs_err = np.abs(err_percent)
        self.logStatus("数据预测完成, 最大绝对值误差={}%, 平均绝对值误差={}%"
                       .format(abs_err.max(), abs_err.mean()), 'blue', 'I')
        self.saveDataAct.setEnabled(True)

    @pyqtSlot()
    def clearDataAndNetwork(self):
        ans = QMessageBox.question(self, '警告',
                                   '您希望删除所有的数据和已经训练好的神经网络吗?')
        if ans == QMessageBox.No:
            return

        # reset
        self.network = None
        self.isDataLoaded = False
        self.training_data = None
        self.test_data = None
        # update UI
        self.loadNetworkAct.setEnabled(False)
        self.runTrainingAct.setEnabled(False)
        self.saveDataAct.setEnabled(False)
        self.saveNetworkAct.setEnabled(False)
        self.predictDatakAct.setEnabled(False)
        self.resetAct.setEnabled(False)
        self.logTextEdit.clear()
        # clear plots
        self.clearPlots()

    @pyqtSlot(dict)
    def updateSettings(self, settings):
        self.networkSettings = settings

    @pyqtSlot()
    def showSettingDialog(self):
        dlg = SettingDialog(self, self.networkSettings)
        dlg.show()

    @pyqtSlot()
    def fileQuit(self):
        self.close()

    @pyqtSlot()
    def about(self):
        QMessageBox.about(self, "关于",
                          """<b>{}</b><p>版本号: {}""".format(progname, progversion)
                          )

    @pyqtSlot()
    def usage(self):
        dlg = UsageDialog(self)
        dlg.show()

    def closeEvent(self, ce):
        self.fileQuit()

    def logStatus(self, text, color='green', tag='S'):
        self.logTextEdit.appendHtml("<p><font color='{0}'><b>[{1}]:</b> {2}"
                                "</font></p>".format(color, tag, text))
        # force UI update. An alternative is to use QThread
        QApplication.processEvents()

    def clearPlots(self):
        self.predPlot.clear()
        self.errPlot.clear()
        errplot_labels = {'t': 'Prediction Errors', 'x': 'Time', 'y': 'Error Percent(%)'}
        predplot_labels = {'t': 'Predicted Temperature', 'x': 'Time', 'y': 'Temperature(℃)'}
        self.errPlot.initial_figure(errplot_labels)
        self.predPlot.initial_figure(predplot_labels)