ich habe eine kleine GUI geschrieben die verschiedene Machine Learning Modelle trainiert. Damit die GUI auch während des Trainings ansprechbar ist, verwende ich QThread. Soweit funktioniert alles perfekt. Das Training des ML Modells funktioniert, der Fortschrittsbalken funktioniert, die GUI ist auch weiterhin ansprechbar usw. Das einzige Problem ist, dass der Thread oder die Funktion irgendwie nicht richtig abgeschlossen wird.
Ich will hier nicht den gesamten Code posten. Der ist insgesamt etwas lang. Deswegen hier nur der relevanten Teil. Insgesamt hat die Klasse MainWindow noch deutlich deutlich mehr Methoden. Hier wird ein Neuronales Netz trainiert. Um genau zu sein sogar eine ganze Reihe Neuronaler Netze, weil es um eine Hyperparameteroptimierung geht. Jedenfalls werden alle NN bis zum Ende trainiert und dann hängt sich die GUI auf. Die Ergebnisse werden auch nicht auf der GUI angezeigt.
Code: Alles auswählen
class MainWindow:
def __init__(self):
self.ui = uic.loadUi("gui.ui")
self.ui.train_auto_nn.clicked.connect(lambda: self.start_training_thread(self.button_auto_neural_network))
def button_auto_neural_network(self):
if self.check_file():
try:
self.disable_tabs()
scaler = self.ui.scaler_auto_nn.currentText()
learning_rate = json.loads(self.ui.lr_auto_nn.text())
number_layers = json.loads(self.ui.number_of_hidden_layers_auto_nn.text())
dropout = json.loads(self.ui.dropout_auto_nn.text())
number_neurons = json.loads(self.ui.neurons_auto_nn.text())
activations = json.loads(self.ui.activation_auto_nn.text().replace('\'', '"'))
optimizer = json.loads(self.ui.optimizer_auto_nn.text().replace('\'', '"'))
batch_size = json.loads(self.ui.batch_size_auto_nn.text())
epochs = self.ui.epochs_auto_nn.value()
iterations = self.ui.iterations_auto_nn.value()
splits = self.ui.splits_auto_nn.value()
repeats = self.ui.repeats_auto_nn.value()
self.bool_kfold = self.ui.bool_kfold_auto_nn.isChecked()
max_combinations = (len(learning_rate) * len(number_layers) * len(dropout) * len(number_neurons) * len(activations) * len(optimizer) * len(batch_size))
params = {"lr": learning_rate, 'batch_size': batch_size, 'number_layers': number_layers, 'dropout': dropout,
'number_neurons': number_neurons, 'activations': activations, 'optimizer': optimizer, "max_combinations": max_combinations}
self.model = Neural_Network(features = self.dataset.get_features(), label = self.dataset.get_labels(), scaler = scaler, bool_kfold = self.bool_kfold,
splits = splits, repeats = repeats, modeltype = Neural_Network, params = params, epochs = epochs)
accuracy, self.params = self.model.parameter_search(iterations, self.update_prograss_bar)
print("test")
self.enable_tabs()
self.display_model_results(self.ui.results_auto_nn, accuracy)
def start_training_thread(self, function):
self.worker = WorkerThread(function) self.worker.start()
self.worker.finished.connect(self.finish_training_thread)
def finish_training_thread(self):
QMessageBox.information(self, "Done!", "Worker Thread completed")
class WorkerThread(QThread):
def init(self, function, *args, **kwargs):
super().init(*args, **kwargs)
self.function = function
def run(self):
self.function()
Der folgende Error wird mir angezeigt:
Code: Alles auswählen
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTextDocument(0x2316d8786c0), parent's thread is QThread(0x2315f43caa0), current thread is WorkerThread(0x23172a30e30)
forrtl: error (200): program aborting due to control-C event
Image PC Routine Line Source
libifcoremd.dll 00007FFD14DC3B58 Unknown Unknown Unknown
KERNELBASE.dll 00007FFD6255B443 Unknown Unknown Unknown
KERNEL32.DLL 00007FFD62AE7034 Unknown Unknown Unknown
ntdll.dll 00007FFD64A5D0D1 Unknown Unknown Unknown
QObject::~QObject: Timers cannot be stopped from another thread
Weiß jemand woran genau das liegt und wie ich den Fehler beheben kann?